了解一下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》--第七章網絡編程