天天看點

【網絡&通信協定系列(二)】TCP/IP協定棧

最開始要說明的是,日常接觸到的”TCP/IP協定”其實指的是TCP/IP協定棧,既然是協定棧 ,也就是一系列協定,今天這一篇就詳細的講講這個構成現代網絡通信的最基礎的系列協定。

OSI與TCP/IP網絡模型

學過計算機網絡的同學對網絡模型劃分應該不陌生,标準有OSI七層結構以及現在流行的TCP/IP四層模型(也有說五層的,差不多),比較如下(圖檔來源于網絡):

【網絡&通信協定系列(二)】TCP/IP協定棧

OSI模型劃分:應用層、表示層、會話層、傳輸層、網絡層、資料鍊路層、實體層

TCP/IP模型劃分:應用層、傳輸層、網絡層、鍊路層(也有說五層的,區分了鍊路層與實體媒體)

每一層都有一系列的協定,在右圖可以看到,有我們最熟悉的HTTP、SMTP、TCP/UDP、IP/ARP等,還有很多亂七八糟聽都沒聽過的協定。

兩者的關系:OSI是最初的網路模型标準,提供細緻的層級劃分。TCP/IP四層模型是後來為符合實際情況的使用而基于OSI的抽象,可以了解為兩者隻是稱呼不同,沒有本質差別,隻是劃分粒度稍有不同。

TCP/IP協定棧詳解

網絡模型的層次劃分,提供逐層協定封包、解包的具體約定。接下來對通信過程自底向上的逐漸講解:

實體層

所謂的網絡通信,是計算機之間以實體媒體互相連通,将資料經過不同協定的編解碼,進行資訊傳輸的過程。

因為計算機隻能識别0和1,是以計算機之間一定是通過二進制信号進行互動,常見的有電信号與電磁脈沖。無論是何種傳輸表現形式,一定離不開實體媒體,如網線、光纖、無線網絡收發器等裝置,實體媒體提供傳輸的通道或者信号收發、分發功能。

是以這一層的主要功能是通過實體媒體連結與傳輸二進制信号0和1,核心是實體裝置

資料鍊路層

通信過程必須角色有:收發雙方與信号傳輸媒體,實體層完成最基本的信号傳輸過程與通信雙方的連結,并不知道具體的通信雙方。

網絡通信中使用MAC位址唯一标志裝置在網絡中的具體位置,MAC位址是網卡決定的,是以實際上MAC位址唯一标志裝置的網卡位址。

百度百科:MAC(Media Access Control)媒體通路控制,或稱為實體位址、硬體位址,用來定義網絡裝置的位置。MAC位址是網卡決定,是固定的。

MAC位址使用16進制數表示,共6個位元組48位,高24位标志網卡裝置生産商,低24位表示具體廠商給裝置配置設定的序列碼。

資料鍊路層專注MAC位址,負責發送方到接收方的MAC尋址然後進行資料報發送。前面說到實體媒體通過傳輸0和1進行通信,而單獨的發送0/1是沒有意義的,是以要對0和1進行分組且标志好每一組電信号的資訊特征,然後以分組的順序依次發送。

負責分組發送的過程稱為以太網協定:以太網規定一組電信号就是一個資料包,以幀為機關,一個資料包就是一幀。

一個完整的以太網資料包組成:

首部(14位元組)、資料包(46~1500位元組)以及尾部(4位元組)
           

首部固定為14位元組,包含發送/接收雙方的源MAC位址與目标MAC位址;資料包最短46個位元組,最長1500位元組,是以當資料量過大時會拆分成多個資料包發送;尾部4位元組為校驗位,用于校驗資料報在傳輸過程中是否被篡改或損壞。

資料傳輸的過程為:以太網以廣播的形式,将資料包發送給子網内的所有裝置,接收到資料包的裝置會讀取首部的目标MAC位址,與自身MAC比較是否符合,如果是則接收處理,否則丢棄。

是以資料鍊路層主要負責将上層資料轉換為二進制資料幀然後通過實體媒體以廣播的形式發送到目标主機的過程。

網絡層

網絡層負責IP位址,主要工作為:解析上層資料包并封裝為IP資料包,通過IP位址完成MAC尋址進而通過下層協定完成通信,IP資料包組成部分為:

IP首部(20位元組),IP資料包(最大65515位元組)
           

首部包含源IP位址與目标IP位址,理論上一個IP資料包最大可達65535位元組,而之前的以太網資料包最大隻有1500位元組,如果一個IP資料包大于以太網資料包,便會進行IP分片,将IP資料包分為多個幀發送。

前面說到鍊路層通過子網廣播的形式發送資料包,這裡會有幾個問題:

  1. 發送者如何知道目标MAC位址
  2. 發送者如何知道自己與接收者同屬一個子網,如果接收者與自身不在同一個子網怎麼辦?

為了解決這些問題,網絡層引入了更進階的協定,主要有:IP協定、ARP協定、路由協定

IP協定

MAC位址唯一且由網絡擴充卡廠商确定,無法區分網絡裝置群是否同屬一個子網,為了解決這個問題,引入了IP位址。目前有IPv4與IPv6(IPv4位址是一個32位位址,最大數量2的32次方,42億多個且有一部分因為一些原因無法參與配置設定,而随着社會進步接入網際網路的裝置越來越多,至今已經成了稀缺資源,于是相關标準制定者主鍵引入IPv6來解決這個問題,IPv6總共有2的128方個位址),以現階段常用的IPv4為例,位址被分為兩部分,前面部分标志網絡位址,後面部分标志主機位址。因為各類IP位址劃分的不同,詳細參見:百度百科:IPv4

如果兩個裝置同屬一個子網,則對應IP的網絡位址一定相同。為了判斷IP的網絡位址,還引入了子網路遮罩,IP與子網路遮罩按位與的結果就是裝置的網絡位址。

ARP協定

位址解析協定(Address Resolution Protocol),用于通過IP位址擷取MAC位址的協定。

工作原理如下:

ARP首先發起一個查詢請求資料包,資料包首部包含接收方IP位址,通過資料鍊路層分組後通過以太網協定經實體媒體廣播到子網内所有主機,主機接收到資料包後會取出首部的IP位址與本機IP位址比較,如果相同則傳回本機的MAC位址。發送方在接收到目标MAC位址後會将其緩存到本地,下次再查詢時會先通過本機未過期緩存來傳回結果。

可以通過

arp -a

查詢作業系統ARP緩存。另外ARP協定建立在網絡信任的基礎上,可能導緻不安全,具體參見:百度百科:ARP。

路由協定

ARP協定解決的是同一個子網内的通過IP位址擷取到MAC位址,而不同子網之間的通信是通過路由協定完成的。

當通過IP協定發現接收方目标IP不在目前子網内,則會通過本子網的網關進行路由,路由可能會有多次,直到找到目标IP對應的子網,然後再是ARP的過程。完成路由協定的裝置稱為路由器,路由器是網絡通信世界的交通樞紐,它會根據信道情況,選擇并設定路由,以最佳的路徑轉發資料包。

傳輸層

傳輸層負責端到端的通信,前面說到網絡層通過IP位址完成主機網絡位址的确認,能夠确定通信雙方主機的唯一性。網絡通信通常發生在基于作業系統的程序之間,同一個機器的程序通過唯一端口号唯一确定。

傳輸層協定有UDP、TCP兩種,UDP定義的資料包稱為UDP資料包,組成部分為:

首部(8位元組)、資料包(65527位元組)
           

首部包含源端口與目标端口,整個資料包最大長度為65535位元組。通常說UDP協定是不可靠的,原因在于其沒有确定與重試機制,發送方不考慮接收方是否成功接收成功。為了解決這個問題,于是引入了TCP協定。

TCP是面向連接配接、可靠的傳輸層協定,在UDP的基礎上引入了通信雙方的确認機制,在資料包丢失收不到确認的情況,會有重發機制。下面詳細闡述一下TCP确認機制:

TCP确認機制:三次握手/四次揮手

通過WareShark抓包工具詳細看一下這一過程。

三次握手

【網絡&通信協定系列(二)】TCP/IP協定棧

可以看到,在HTTP請求之前有三次TCP的連接配接建立過程,這就是所謂的”三次握手”。

  1. 用戶端請求建立連接配接,SYN位–置1,Seq=0
  2. 服務端收到請求,允許建立連接配接,并發送”通知”給用戶端,SYN位–置1、ACK位–置1,Seq=0
  3. 用戶端收到服務端響應,傳回消息給服務端,ACK位–置1

四次揮手

【網絡&通信協定系列(二)】TCP/IP協定棧
  1. 請求端(可能是用戶端也可能是伺服器,這裡是服務端發起)發送終止信号,FIN位(連接配接中斷位)–置1、ACK位(此處是應答辨別,不是Ack。一個是響應辨別,一個是應答碼)–置1。Seq=19815,ACK=443
  2. 響應端收到信号,先傳回一條資訊(可以了解為:我收到你的分手消息,但是我可能還有點事),ACK位–置1。Seq=443,Ack=19816(可以看到接收方的Seq為請求方的Ack,接收方的Ack為請求方Seq+1)
  3. 響應端覺得自己也沒啥留戀的了!也發送終止信号,FIN位–置1、ACK位–置1。Seq=443、Ack=19816
  4. 請求端收到響應端信号,傳回消息。ACK位–置1。Seq=19816、Ack=444

辨別位(FIN、ACK)以紅色方框與箭頭辨別,應答碼(Ack)以紅色圓框辨別。

【網絡&通信協定系列(二)】TCP/IP協定棧

相關問題

為什麼是三次握手而不是兩次?

兩次握手:發送方發送請求,接收方确認然後建立連接配接,這似乎也沒什麼不對。其實這裡會有可靠性或其它問題:

  1. 網絡延時的情況下,發送方收到接收方可以建立連接配接的确認存在時延,而此時接收方(如伺服器)可能已經在等待期後認為此次發送方(用戶端)已取消請求,将本次連接配接句柄廢棄将資源用于處理其它請求。那麼本次連接配接将不再可靠。
  2. 網絡延時的情況下,用戶端建立連接配接的請求到達伺服器可能存在時延,當伺服器接收到本次請求時,用戶端可能已經放棄本次請求。而伺服器不知道,會建立句柄資源等待用戶端發送資料包。這種情況會造成伺服器資源被白白耗費。

TCP處理網絡擁堵

既然是網絡通信,免不了面對網絡情況不佳的情況,這種情況在底層傳輸又分為多種情況,如:網絡閃斷、網絡卡頓等等。TCP通過确認與重發機制保證傳輸的可靠性,但是在網絡卡頓的情況下還要額外處理資料包擁堵短時間大量發送的情況。

TCP對于阻塞控制有四種算法:慢開始、阻塞避免、快重傳以及快恢複,這一塊不在這展開,參考:【網絡&通信協定系列(四)】TCP擁塞控制

應用層協定

應用層協定專注通信内容的資料格式。

前面講到的幾個下層協定已經可以完成程式間的網絡通信,考慮到傳輸層協定UDP/TCP都是基于二進制流的資料傳輸,而網際網路時代資料格式多樣性會造成傳輸過程的不便,是以引入更進階的應用層協定來解決。

日常主要使用到的有HTTP、FTP、SMTP、TELNET、SSH等,以使用到最多的HTTP協定為例講解。

HTTP協定

HTTP(HyperText Transfer Protocol,超文本傳輸協定),直覺感受下使用頻率最高的協定,由Header與Body組成,區分Request Header與Response Header。

請求方在頭部指定本次請求的路徑、請求方法、期望接收的資料格式(Accept)、本次請求資料格式(Content-Type)、編碼、是否長連接配接等資訊。

響應方在頭部指定傳回狀态碼、資料格式(Content-Type)、伺服器資訊、編碼、支援跨域等資訊。

HTTP狀态碼

10x:資訊類型。代表請求已被接收,需要繼續處理

20x:成功。

30x:重定向。

4xx:用戶端錯誤。

5xx:伺服器錯誤。其中600傳回碼表示:源站沒有傳回頭部,隻有消息體。

總結

TCP/IP四層模型是對OSI模型進行了一定程度的“濃縮”,定義了網絡通信的整體架構與層級劃分,每一層都有不同的協定簇完成各自的工作。

通過層級劃分,網絡通信自頂向下<->自底向上的主要過程為:

  1. 應用層協定為了實作資料傳輸的多樣性,定義通信的具體格式。應用程式隻需要關注業務場景,以特定的格式傳輸資料即可。由應用層協定轉換為下層支援的二進制格式後調用下層協定完成通信。
  2. 傳輸層使用端口唯一标志特定主機上的應用程式,使用者可以直接使用本層協定自行建構網絡通信。傳輸層協定通過IP位址調用下層協定完成通信。
  3. 網絡層負責IP位址、路由子網、MAC尋址等過程,總結為通過IP位址擷取到目标主機的MAC位址,并調用下層協定完成通信,因為資料包大小的差異,可能存在IP分片。
  4. 鍊路層負責封裝上層資料包、以幀為機關通過實體媒體分組發送電信号,發送方式為子網内廣播,由接收方機器自行比對處理。
  5. 接收方收到資料包傳回響應又是同樣的過程。

如下圖所示:

【網絡&amp;通信協定系列(二)】TCP/IP協定棧

參考資料

深入淺出TCP/IP協定棧

繼續閱讀