1. 程式人生 > >深入理解TCP/IP協議棧

深入理解TCP/IP協議棧

本文轉自 一畫素

TCP/IP 協議棧是一系列網路協議的總和,是構成網路通訊的核心骨架,它定義了電子裝置如何連入因特網,以及資料如何在它們之間進行傳輸。TCP/IP 協議採用4層結構,分別是應用層、傳輸層、網路層和鏈路層,每一層都呼叫它的下一層所提供的協議來完成自己的需求。由於我們大部分時間都工作在應用層,下層的事情不用我們操心;其次網路協議體系本身就很複雜龐大,入門門檻高,因此很難搞清楚TCP/IP的工作原理,通俗一點講就是,一個主機的資料要經過哪些過程才能傳送到對方的主機上。 接下來,我們就來探索一下這個過程。

0、物理介質

物理介質就是把電腦連線起來的物理手段,常見的有光纖、雙絞線,以及無線電波

,它決定了電訊號(0和1)的傳輸方式,物理介質的不同決定了電訊號的傳輸頻寬、速率、傳輸距離以及抗干擾性等等。

TCP/IP協議棧分為四層,每一層都由特定的協議與對方進行通訊,**而協議之間的通訊最終都要轉化為 0 和 1 的電訊號,**通過物理介質進行傳輸才能到達對方的電腦,因此物理介質是網路通訊的基石。

下面我們通過一張圖先來大概瞭解一下TCP/IP協議的基本框架:
在這裡插入圖片描述

當通過http發起一個請求時,應用層、傳輸層、網路層和鏈路層的相關協議依次對該請求進行包裝並攜帶對應的首部,最終在鏈路層生成乙太網資料包,乙太網資料包通過物理介質傳輸給對方主機,對方接收到資料包以後,然後再一層一層採用對應的協議進行拆包,最後把應用層資料交給應用程式處理。

網路通訊就好比送快遞,商品外面的一層層包裹就是各種協議,協議包含了商品資訊、收貨地址、收件人、聯絡方式等,然後還需要配送車、配送站、快遞員,商品才能最終到達使用者手中。

一般情況下,快遞是不能直達的,需要先轉發到對應的配送站,然後由配送站再進行派件。

配送車就是物理介質,配送站就是閘道器, 快遞員就是路由器,收貨地址就是IP地址,聯絡方式就是MAC地址。

快遞員負責把包裹轉發到各個配送站,配送站根據收穫地址裡的省市區,確認是否需要繼續轉發到其他配送站,當包裹到達了目標配送站以後,配送站再根據聯絡方式找到收件人進行派件。

有了整體概念以後,下面我們詳細瞭解一下各層的分工。

1、鏈路層

網路通訊就是把有特定意義的資料通過物理介質傳送給對方,單純的傳送 0 和 1 是沒有意義的,要傳輸有意義的資料,就需要以位元組為單位對 0 和 1 進行分組,並且要標識好每一組電訊號的資訊特徵,然後按照分組的順序依次傳送。乙太網規定一組電訊號就是一個數據包,一個數據包被稱為一幀, 制定這個規則的協議就是乙太網協議。一個完整的乙太網資料包如下圖所示:
在這裡插入圖片描述
整個資料幀由首部、資料和尾部三部分組成,首部固定為14個位元組,包含了目標MAC地址、源MAC地址和型別;資料最短為46個位元組,最長為1500個位元組,如果需要傳輸的資料很長,就必須分割成多個幀進行傳送;尾部固定為4個位元組,表示資料幀校驗序列,用於確定資料包在傳輸過程中是否損壞。因此,乙太網協議通過對電訊號進行分組並形成資料幀,然後通過物理介質把資料幀傳送給接收方。那麼乙太網如何來識接收方的身份呢?

乙太網規協議定,接入網路的裝置都必須安裝網路介面卡,即網絡卡, 資料包必須是從一塊網絡卡傳送到另一塊網絡卡。而網絡卡地址就是資料包的傳送地址和接收地址,也就是幀首部所包含的MAC地址,MAC地址是每塊網絡卡的身份標識,就如同我們身份證上的身份證號碼,具有全球唯一性。MAC地址採用十六進位制標識,共6個位元組, 前三個位元組是廠商編號,後三個位元組是網絡卡流水號,例如 4C-0F-6E-12-D2-19.

有了MAC地址以後,乙太網採用廣播形式,把資料包發給該子網內所有主機,子網內每臺主機在接收到這個包以後,都會讀取首部裡的目標MAC地址,然後和自己的MAC地址進行對比,如果相同就做下一步處理,如果不同,就丟棄這個包。

所以鏈路層的主要工作就是:對電訊號進行分組並形成具有特定意義的資料幀,然後以廣播的形式通過物理介質傳送給接收方。

2、網路層

對於上面的過程,有幾個細節問題值得我們思考:

1、傳送者如何知道接收者的MAC地址?

2、傳送者如何知道接收者和自己同屬一個子網?

3、如果接收者和自己不在同一個子網,資料包如何發給對方?

為了解決這些問題,網路層引入了三個協議,分別是IP協議、ARP協議、路由協議

【1】IP協議

通過前面的介紹我們知道,MAC地址只與廠商有關,與所處的網路無關,所以無法通過MAC地址來判斷兩臺主機是否屬於同一個子網。

因此,網路層引入了IP協議,制定了一套新地址,使得我們能夠區分兩臺主機是否同屬一個網路,這套地址就是網路地址,也就是所謂的IP地址。

IP地址目前有兩個版本,分別是IPv4和IPv6,IPv4是一個32位的地址,常採用4個十進位制數字表示。IP協議將這個32位的地址分為兩部分,前面部分代表網路地址,後面部分表示該主機在區域網中的地址。由於各類地址的分法不盡相同,以C類地址192.168.24.1為例,其中前24位就是網路地址,後8位就是主機地址。因此, 如果兩個IP地址在同一個子網內,則網路地址一定相同。為了判斷IP地址中的網路地址,IP協議還引入了子網掩碼, IP地址和子網掩碼通過按位與運算後就可以得到網路地址。

由於傳送者和接收者的IP地址是已知的(應用層的協議會傳入), 因此我們只要通過子網掩碼對兩個IP地址進行AND運算後就能夠判斷雙方是否在同一個子網了。

【2】ARP協議

即地址解析協議,是根據IP地址獲取MAC地址的一個網路層協議。其工作原理如下:

ARP首先會發起一個請求資料包,資料包的首部包含了目標主機的IP地址,然後這個資料包會在鏈路層進行再次包裝,生成乙太網資料包,最終由乙太網廣播給子網內的所有主機,每一臺主機都會接收到這個資料包,並取出標頭裡的IP地址,然後和自己的IP地址進行比較,如果相同就返回自己的MAC地址,如果不同就丟棄該資料包。ARP接收返回訊息,以此確定目標機的MAC地址;與此同時,ARP還會將返回的MAC地址與對應的IP地址存入本機ARP快取中並保留一定時間,下次請求時直接查詢ARP快取以節約資源。cmd輸入 arp -a 就可以查詢本機快取的ARP資料。

【3】路由協議

通過ARP協議的工作原理可以發現,ARP的MAC定址還是侷限在同一個子網中,因此網路層引入了路由協議,首先通過IP協議來判斷兩臺主機是否在同一個子網中,如果在同一個子網,就通過ARP協議查詢對應的MAC地址,然後以廣播的形式向該子網內的主機發送資料包;如果不在同一個子網,乙太網會將該資料包轉發給本子網的閘道器進行路由。閘道器是網際網路上子網與子網之間的橋樑,所以閘道器會進行多次轉發,最終將該資料包轉發到目標IP所在的子網中,然後再通過ARP獲取目標機MAC,最終也是通過廣播形式將資料包傳送給接收方。

而完成這個路由協議的物理裝置就是路由器,在錯綜複雜的網路世界裡,路由器扮演者交通樞紐的角色,它會根據通道情況,選擇並設定路由,以最佳路徑來轉發資料包。

【4】IP資料包

在網路層被包裝的資料包就叫IP資料包,IPv4資料包的結構如下圖所示:
在這裡插入圖片描述

IP資料包由首部和資料兩部分組成,首部長度為20個位元組,主要包含了目標IP地址和源IP地址,目標IP地址是閘道器路由的線索和依據;資料部分的最大長度為65515位元組,理論上一個IP資料包的總長度可以達到65535個位元組,而乙太網資料包的最大長度是1500個字元,如果超過這個大小,就需要對IP資料包進行分割,分成多幀傳送。

所以,網路層的主要工作是定義網路地址,區分網段,子網內MAC定址,對於不同子網的資料包進行路由。

3、傳輸層

鏈路層定義了主機的身份,即MAC地址, 而網路層定義了IP地址,明確了主機所在的網段,有了這兩個地址,資料包就從可以從一個主機發送到另一臺主機。但實際上資料包是從一個主機的某個應用程式發出,然後由對方主機的應用程式接收。而每臺電腦都有可能同時執行著很多個應用程式,所以當資料包被髮送到主機上以後,是無法確定哪個應用程式要接收這個包。

因此傳輸層引入了UDP協議來解決這個問題,為了給每個應用程式標識身份,UDP協議定義了埠,同一個主機上的每個應用程式都需要指定唯一的埠號,並且規定網路中傳輸的資料包必須加上埠資訊。 這樣,當資料包到達主機以後,就可以根據埠號找到對應的應用程式了。UDP定義的資料包就叫做UDP資料包,結構如下所示:
在這裡插入圖片描述

UDP資料包由首部和資料兩部分組成,首部長度為8個位元組,主要包括源埠和目標埠;資料最大為65527個位元組,整個資料包的長度最大可達到65535個位元組。

UDP協議比較簡單,實現容易,但它沒有確認機制, 資料包一旦發出,無法知道對方是否收到,因此可靠性較差,為了解決這個問題,提高網路可靠性,TCP協議就誕生了,TCP即傳輸控制協議,是一種面向連線的、可靠的、基於位元組流的通訊協議。簡單來說TCP就是有確認機制的UDP協議,每發出一個數據包都要求確認,如果有一個數據包丟失,就收不到確認,傳送方就必須重發這個資料包。

為了保證傳輸的可靠性,TCP 協議在 UDP 基礎之上建立了三次對話的確認機制,也就是說,在正式收發資料前,必須和對方建立可靠的連線。由於建立過程較為複雜,我們在這裡做一個形象的描述:

  • 主機A:我想發資料給你,可以麼?
  • 主機B:可以,你什麼時候發?
  • 主機A:我馬上發,你接著!

經過三次對話之後,主機A才會向主機B傳送正式資料,而UDP是面向非連線的協議,它不與對方建立連線,而是直接就把資料包發過去了。所以 TCP 能夠保證資料包在傳輸過程中不被丟失,但美好的事物必然是要付出代價的,相比 UDP,TCP 實現過程複雜,消耗連線資源多,傳輸速度慢。

TCP 資料包和 UDP 一樣,都是由首部和資料兩部分組成,唯一不同的是,TCP 資料包沒有長度限制,理論上可以無限長,但是為了保證網路的效率,通常 TCP 資料包的長度不會超過IP資料包的長度,以確保單個 TCP 資料包不必再分割。

總結一下,傳輸層的主要工作是定義埠,標識應用程式身份,實現埠到埠的通訊,TCP協議可以保證資料傳輸的可靠性。

4、應用層
理論上講,有了以上三層協議的支援,資料已經可以從一個主機上的應用程式傳輸到另一臺主機的應用程式了,但此時傳過來的資料是位元組流,不能很好的被程式識別,操作性差。因此,應用層定義了各種各樣的協議來規範資料格式,常見的有 HTTP、FTP、SMTP 等,HTTP 是一種比較常用的應用層協議,主要用於B/S架構之間的資料通訊,其報文格式如下:

**加粗樣式**

在 Resquest Headers 中,Accept 表示客戶端期望接收的資料格式,而 ContentType 則表示客戶端傳送的資料格式;在 Response Headers 中,ContentType 表示服務端響應的資料格式,這裡定義的格式,一般是和 Resquest Headers 中 Accept 定義的格式是一致的。

有了這個規範以後,服務端收到請求以後,就能正確的解析客戶端發來的資料,當請求處理完以後,再按照客戶端要求的格式返回,客戶端收到結果後,按照服務端返回的格式進行解析。

所以應用層的主要工作就是定義資料格式並按照對應的格式解讀資料。

5、全流程

首先我們梳理一下每層模型的職責:

鏈路層: 對0和1進行分組,定義資料幀,確認主機的實體地址,傳輸資料;
網路層: 定義IP地址,確認主機所在的網路位置,並通過IP進行MAC定址,對外網資料包進行路由轉發;
傳輸層: 定義埠,確認主機上應用程式的身份,並將資料包交給對應的應用程式;
應用層: 定義資料格式,並按照對應的格式解讀資料。
然後再把每層模型的職責串聯起來,用一句通俗易懂的話講就是:

當你輸入一個網址並按下回車鍵的時候:
首先,應用層協議對該請求包做了格式定義;緊接著傳輸層協議加上了雙方的埠號,確認了雙方通訊的應用程式;然後網路協議加上了雙方的IP地址,確認了雙方的網路位置;最後鏈路層協議加上了雙方的MAC地址,確認了雙方的物理位置,同時將資料進行分組,形成資料幀,採用廣播方式,通過傳輸介質傳送給對方主機。而對於不同網段,該資料包首先會轉發給閘道器路由器,經過多次轉發後,最終被髮送到目標主機。目標機接收到資料包後,採用對應的協議,對幀資料進行組裝,然後再通過一層一層的協議進行解析,最終被應用層的協議解析並交給伺服器處理。****

6、總結

以上內容是對TCP/IP四層模型做了簡單的介紹,而實際上每一層模型都有很多協議,每個協議要做的事情也很多,但我們首先得有一個清晰的脈絡結構,掌握每一層模型最基本的作用,然後再去豐富細枝末節的東西,也許會更容易理解。