nodejs學習筆記之網絡編程

瞭解一下OSI七層模型
 
OSI層
功能
TCP/IP協議
應用層
文件傳輸,電子郵件,文件服務,虛擬終端
 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示層
數據格式化,代碼轉換,數據加密
-
會話層
數據格式化,代碼轉換,數據加密
-
傳輸層
提供端對端的接口
TCP,UDP
網絡層
爲數據包選擇路由
IP,ICMP,RIP,OSPF,BGP,IGMP
數據鏈路層
傳輸有地址的幀以及錯誤檢測功能
SLIP,CSLIP,PPP,ARP,RARP,MTU
物理層
 以二進制數據形式在物理媒體上傳輸數據
ISO2110,IEEE802,IEEE802.2
 
主要內容
  • TCP(傳輸控制協議)
  • UDP(用戶數據包協議)
  • HTTP(超文本傳輸協議)
  • Websocket
  • 網絡服務與安全(cryto tls https)
 
 
TCP特徵
 
  • 面向鏈接的協議 
  • 須要三次握手

 
TCP服務實踐(一)
 
建立服務端:
var net = require('net');
 
var server = net.createServer(function(socket) {
    //新的鏈接
    socket.on('data', function(data) {
        console.log('服務端接收到客戶端的消息:' + data.toString());
        socket.write('服務端迴應:你好');
    });
    socket.on('end', function() {
        console.log('服務端斷開鏈接');
    });
});
 
server.listen(8124, function() {
    console.log('TCP服務建立');
});
 
TCP服務實踐(二)
 
建立客戶端:
 
var net = require('net');
 
var client = net.connect({port:8124}, function() {
    console.log('客戶端鏈接成功');
    client.write('客戶端發起問候:你好');
});
 
client.on('data', function(data) {
    console.log('客戶端接收服務端消息:' + data.toString());
    client.end();
});
 
client.on('end', function() {
    console.log('客戶端斷開鏈接');
});
 
TCP服務的事件(一)
 
  • 服務器事件
    • listening:server.listen()
    • connection:net.createServer()
    • close:server.close()
    • error
 
 
TCP服務的實踐(二)
 
  • 鏈接事件
    • data:一端執行write(),另外一端觸發該事件
    • end:任意一端斷開鏈接,觸發該事件
    • connect:該事件用於客戶端,當套接字服務端鏈接成功時觸發
    • drain:當任意一端觸發write(),當前這端會觸發該事件
    • error:當異常發生時,觸發該事件
    • close:當套接字結束時,觸發該事件
    • timeout:當必定時間後鏈接再也不活躍時,觸發該事件
 
 
TCP小結
 
  • 面向鏈接(創建通訊線路:創建、使用、釋放)
  • 三次握手(創建鏈接的過程)
  • nodejs實現(net模塊)
 
UDP特徵
 
  • 無鏈接
  • 不可靠的信息服務
  • 在網絡差的狀況,丟包嚴重
  • 既能夠客戶端發送消息,又能夠作服務端接收消息
  • 使用場景:對丟包要求不高的場景(音頻、視頻、DNS服務)
 
UDP服務實踐(一)
建立服務端:
var dgram = require('dgram');
 
var server = dgram.createSocket('udp4');
 
server.on('message', function(msg, rinfo) {
    console.log('服務端獲取信息:'+msg+'來自:'+rinfo.address+':'+rinfo.port);
});
 
server.on('listening', function() {
    var address = server.address();
    console.log('服務端正在監聽:'+address.address+':'+address.port);
});
 
server.bind(41234);
 
UDP服務實踐(二)
建立客戶端:
var dgram = require('dgram');
 
var client = dgram.createSocket('udp4');
 
var message = new Buffer('我是客戶端的消息');
client.send(message, 0, message.length, 41234, '127.0.0.1', function(err, bytes) {
    console.log('客戶端發送完成,關閉客戶端');
    client.close();
});
 
UDP套接字事件
  • message:當UDP套接字偵聽網卡端口後,收到消息時會觸發該事件,攜帶Buffer對象和遠程地址信息
  • listening:當UDP開始偵聽時,觸發該事件
  • close:調用close()方法時,觸發該事件
  • error:當出現異常時,觸發該事件,若是不處理,會使進程退出
 
 
UDP小結
  • 面向無鏈接(不須要創建通訊線路,把帶有目的地址的包送到線路上)
  • 使用場景(對丟包要求不高,IP、UDP協議都是無鏈接的)
  • nodejs實現(dgram模塊)
 
HTTP特徵
  • 創建在TCP之上的應用層協議
  • 經典的模式:B/S
  • 知名HTTP標準:RFC2616(W3C和IETF)
 
HTTP服務實踐(一)
建立服務端:
var http = require('http');
 
http.createServer(function(req, res) {
    res.writeHead(200, {'Content-type': 'text/plain'});
    res.end('Hello world!\n');
}).listen(8000);
 
console.log('服務器已開啓');
 
HTTP報文
  • 第一部分:經典的TCP三次握手 
 
  • 第二部分:客戶端(curl)發送請求報文
 
  • 第三部分:服務器響應(包含響應頭和響應體)
 
  • 第四部分:結束會話
 
 
 
HTTP服務實踐(二)
建立客戶端:
 
var http = require('http');
 
var options = {
    hostname: '127.0.0.1',
    port: 8000,
    method: 'GET',
    path: '/'
};
 
var req = http.request(options, function(res) {
    console.log('Status:'+res.statusCode);
    console.log('Headers:'+JSON.stringify(res.headers));
    res.setEncoding('utf-8');
    res.on('data', function(chunk) {
        console.log(chunk);
    });
});
 
req.end();
 
HTTP服務的事件(一)
  • 服務端事件 
    • connection 
    • request
    • close
    • checkContinue
    • connect
    • upgrade
    • clientError
 
HTTP服務的事件(二)
  • 客戶端事件
    • response 
    • socket
    • connect
    • upgrade
    • continue
 
HTTP小結
  • HTTP創建在TCP之上的協議
  • 客戶端的請求能夠經過模擬完成(curl、http_client.js、瀏覽器等)
  • nodejs實現(http模塊)
 
Websocket特徵
  • 創建在http服務之上
  • 鏈接創建以後會upgrade至數據幀協議,進而實現服務端和客戶端的交互
  • 全雙工通訊
 
Websocket實例(socketio)
 
 
 
Websocket小結
  • 全雙工通訊 
  • 建立http服務後會切換協議
  • nodejs實現(ws、socket.io模塊)
 
網絡服務與安全
安全鏈接的過程:
  • 根據數字證書進行認證
  • 進行加密傳輸
    • 交換公鑰 
    • 客戶端使用服務端的公鑰進行加密
    • 服務端使用服務端私鑰就行解密
    • 服務端使用客戶端的公鑰進行加密
    • 客戶端使用客戶端的私鑰解密
 
 
網絡編程小結
  • 瞭解OSI七層模型
  • 重點學習傳輸層(TCP、UDP)和應用層(HTTP、Websocket)協議的nodejs實現
  • 初步瞭解網絡傳輸安全
 
 
 
參考資料:
《深刻淺出nodejs》--第七章網絡編程
相關文章
相關標籤/搜索