網絡通信協議簡介

TCP/IP

OSI是一個理論上的七層網絡通信模型,而TCP/IP則是實際運行的四層網絡協議。TCP/IP包含:

  1. 網絡接口層,主機必須使用某種協議與網絡相連
  2. 網絡層,使主機可以把分組發往任何網絡,並使分組獨立地傳向目標。IP協議
  3. 傳輸層,使源端和目的端機器上的對等實體可以進行會話。TCP和UDP協議
  4. 應用層,包含所有的高層協議,FTP/TELNET/SMTP/DNS/NNTP/HTTP

HTTP

HTTP是TCP/IP協議中的【應用層】協議。它不涉及數據包傳輸,主要規定了客戶端和服務器之間的通信格式,是互聯網信息交互中最常用的協議

特點:

  1. 簡單快速。只需要傳【請求方法】與【資源路徑】就能確定資源
  2. 靈活,傳輸【任意類型】的數據
  3. 無連接,一般一次連接只處理一個請求,結束後主動釋放連接,但在HTTP1.1中可以使用keep-alive來複用相同的TCP連接發送多個請求
  4. 無狀態,客戶端向服務器發送HTTP請求之後,服務器會給我們發送數據過來,但不會記錄任何信息。所以Cookie、Session產生了。

TCP

TCP是一種面向連接的、可靠的、基於字節流的TCP/IP協議中的【傳輸層】協議

建立連接:三次握手

  1. 建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。
  2. 服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
  3. 客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。

爲什麼要採用三次握手,兩次不行嗎

避免由於網絡延遲導致的創建無效連接的問題。比如客戶端發出的一個連接請求沒有丟失,而是長時間在某個網絡節點滯留了,以至於到連接釋放之後纔到達服務端,如果不使用三次握手,一旦服務端發出請求連接就會建立連接,但是這個連接請求已經失效了,則會浪費服務端的資源。

關閉連接:四次揮手

  1. 當主機A的應用程序通知TCP數據已經發送完畢時,TCP向主機B發送一個帶有FIN附加標記的報文段(FIN表示英文finish)。
  2. 主機B收到這個FIN報文段之後,並不立即用FIN報文段回覆主機A,而是先向主機A發送一個確認序號ACK,同時通知自己相應的應用程序:對方要求關閉連接(先發送ACK的目的是爲了防止在這段時間內,對方重傳FIN報文段)。
  3. 主機B的應用程序告訴TCP:我要徹底的關閉連接,TCP向主機A送一個FIN報文段。
  4. 主機A收到這個FIN報文段後,向主機B發送一個ACK表示連接徹底釋放。

爲什麼連接的時候是三次握手,關閉的時候卻是四次握手

因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

滑動窗口協議

滑動窗口協議是傳輸層進行流控的一種措施,接收方通過通告發送方自己的窗口大小,從而控制發送方的發送速度,從而達到防止發送方發送速度過快而導致自己被淹沒的目的。

ACK包含兩個非常重要的信息:一是期望接收到的下一字節的序號n,該n代表接收方已經接收到了前n-1字節數據。二是當前的窗口大小m,如此發送方在接收到ACK包含的這兩個數據後就可以計算出還可以發送多少字節的數據給對方,這就是滑動窗口控制流量的基本原理

TCP的滑動窗口是動態的,應用程序在需要(如內存不足)時,通過API通知TCP協議棧縮小TCP的接收窗口。然後TCP協議棧在下個段發送時包含新的窗口大小通知給對端,對端按通知的窗口來改變發送窗口,以此達到減緩發送速率的目的。

與UDP區別

  • TCP提供面向連接的、可靠的數據流傳輸,而UDP提供的是非面向連接的、不可靠的數據流傳輸,如QQ
  • TCP注重數據安全性,UDP數據傳輸快,因爲不需要連接等待,少了許多操作,但是其安全性卻一般
  • TCP對應的協議(FTP/SMTP/HTTP),UDP(DNS)

HTTPS

HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全,可防止數據在傳輸過程中不被竊取、改變,確保數據的完整性,它大幅增加了中間人攻擊的成本。

加密過程:

  1. Hello - 握手開始於客戶端發送Hello消息。包含服務端爲了通過SSL連接到客戶端的所有信息,包括客戶端支持的各種密碼套件和最大SSL版本。服務器也返回一個Hello消息,包含客戶端需要的類似信息,包括到底使用哪一個加密算法和SSL版本。
  2. 證書交換 - 現在連接建立起來了,服務器必須證明他的身份。這個由SSL證書實現,像護照一樣。SSL證書包含各種數據,包含所有者名稱,相關屬性(域名),證書上的公鑰,數字簽名和關於證書有效期的信息。客戶端檢查它是不是被CA驗證過的且根據數字簽名驗證內容是否被修改過。注意服務器被允許需求一個證書去證明客戶端的身份,但是這個只發生在敏感應用。
  3. 密鑰交換 - 先使用RSA非對稱公鑰加密算法(客戶端生成一個對稱密鑰,然後用SSL證書裏帶的服務器公鑰將該對稱密鑰加密。隨後發送到服務端,服務端用服務器私鑰解密,到此,握手階段完成。)或者DH交換算法在客戶端與服務端雙方確定一將要使用的密鑰,這個密鑰是雙方都同意的一個簡單,對稱的密鑰,這個過程是基於非對稱加密方式和服務器的公鑰/私鑰的。
  4. 加密通信 - 在服務器和客戶端加密實際信息是用到對稱加密算法,用哪個算法在Hello階段已經確定。對稱加密算法用對於加密和解密都很簡單的密鑰,這個密鑰是基於第三步在客戶端與服務端已經商議好的。與需要公鑰/私鑰的非對稱加密算法相反。

Socket

Socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口,是操作系統對外開放的接口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章