深入理解TCP/IP模型

whynotgonow發表於2018-02-12

1 OSI七層模型的簡單介紹

網路模型不是一開始就有的,在網路剛發展時,網路協議是由各網際網路公司自己定義的,各家的協議也是不能互通的。這樣大大的阻礙了網際網路的發展,為了解決這個問題,國際標準化組織 1984 提出的模型標準,簡稱 OSI(Open Systems Interconnection Model)。具體如下圖:

OSI七層模型

OSI七層模型每一層都有自己的作用,從上到下的作用依次為:

  • 應用層(Application) :提供網路與使用者應用軟體之間的介面服務
  • 表示層(Presentation) :提供格式化的表示和轉換資料服務,如加密和壓縮
  • 會話層(Session) 提供包括訪問驗證和會話管理在內的建立和維護應用之間通訊的機制
  • 傳輸層(Transimission):提供建立、維護和取消傳輸連線功能,負責可靠地傳輸資料(PC)
  • 網路層(Network): 處理網路間路由,確保資料及時傳送(路由器)
  • 資料鏈路層(DataLink): 負責無錯傳輸資料,確認幀、發錯重傳等(交換機)
  • 物理層(Physics) :提供機械、電氣、功能和過程特性(網路卡、網線、雙絞線、同軸電纜、中繼器)

七層中應用層、表示層和會話層由軟體控制,傳輸層、網路層和資料鏈路層由作業系統控制,物理層有物理裝置控制。

2 TCP/IP參考模型及協議

1) 模型

TCP/IP 模型是由 OSI 模型演化而來,TCP/IP 模型將 OSI 模型由七層簡化為五層(一開始為四層),應用層、表示層、會話層統一為應用層。

TCP/IP參考模型

2) 協議

TCP/IP協議被稱為傳輸控制協議/網際網路協議,又稱網路通訊協議(Transmission Control Protocol)。是由網路層的IP協議和傳輸層的TCP協議組成,是一個很大的協議集合。

  • 物理層和資料鏈路層沒有定義任何特定協議,支援所有的標準和專用的協議。

  • 網路層定義了網路互聯也就是IP協議,主要包括IP、ARP、RARP、ICMP、IGMP。

  • 傳輸層定義了TCP和UDP(User Datagram Protocol),我們會後面重點介紹一下TCP協議。

  • 應用層定義了HTTP(超文字傳輸協議)、FTP(檔案傳輸協議)、DNS(域名系統)等協議。

3 物理層

計算機在傳遞資料的時候傳遞的都是0和1的數字,而物理層關心的是用什麼訊號來表示0和1,是否可以雙向通訊,最初的連線如何建立以及完成連線如何終止,總之,物理層是為資料傳輸提供可靠的環境。

4 資料鏈路層

資料鏈路層們於物理層和網路層之間,用來向網路層提供資料,就是把源計算機網路層傳過來的資訊傳遞給目標主機。 資料鏈路層主要的作用包括:

  • 如何將資料組合成資料幀(Frame),幀是資料鏈路層的傳輸單位
  • 資料鏈路的建立、維護和拆除
  • 幀包裝、幀傳輸、幀同步
  • 幀的差錯恢復
  • 流量控制

5 網路層

網路層位於傳輸層和資料鏈路層之間,用於把資料從源主機經過若干個中間節點傳送到目標主機,並向傳輸層提供最基礎的資料傳輸服務,它要提供路由和選址的工作。

那什麼是路由和選址呢?

選址

交換機是靠MAC來定址的,而因為MAC地址是無層次的,所以要靠IP地址來確認計算機的位置,這就是選址。

路由

在能夠選擇的多條道路之間選擇一條最短的路徑就是路由的工作。

路由和選址都離不開IP,我們就詳細介紹一下IP頭部。

IP頭

IP頭部是由20個位元組組成的,具體項所佔的位數如下圖:

IP頭

具體的資料我們用Wireshark來表抓取一下,如圖(藍色部分為IP資料包):

IP抓包

version - 版本

Header Length - 首部長部

Differentiated Services Field - 優先順序與服務型別

Total Length - 總長度,該欄位用以指示整個IP資料包的長度,最長為65535位元組,包括頭和資料。

Identification - 識別符號,唯一標識主機傳送的每一份資料包。

Flags - 標誌。分為3個欄位,依次為保留位、不分片位和更多片位

Fragment offset - 段偏移量。該分片相對於原始資料包開始處位置的偏移量。

TTL(Time to Live生存時間) - 該欄位用於表示IP資料包的生命週期,可以防止一個資料包在網路中無限迴圈地發下去。TTL的意思是一個資料包在被丟棄之前在網路中的最大週轉時間。該資料包經過的每一個路由器都會檢查該欄位中的值,當TTL的值為0時此資料包會被丟棄。TTL對應於一個資料包通過路由器的數目,一個資料包每經過一個路由器,TTL將減去1。

Protocol - 協議號。用以指示IP資料包中封裝的是哪個協議。

Header checksum - 首部校驗和。檢驗和是16位的錯誤檢測欄位。目的主機和網路中的每個閘道器都要重新計算報頭的校驗和,如果一樣表示沒有改動過。

Source - 源IP地址。該欄位用於表示資料包的源地址,指的是傳送該資料包的裝置的網路地址。

Destination - 目標IP地址。該欄位用於表示資料包的目標的地址,指的是接收節點的網路地址。

6 傳輸層

傳輸層是面向連線的、可靠的的程式到程式通訊的協議。TCP提供全雙工服務,即資料可在同一時間雙向傳播。TCP將若干個位元組構成一個分組,此分組稱為報文段(Segment)。提供了一種端到端的連線。

傳輸層的協議主要有TCP 和 UDP,TCP(Transimision Control Protocal)是一種可靠的、面向連線的協議,傳輸效率低。UDP(User Datagram Protocal)是一種不可靠的、無連線的服務,傳輸效率高。 下面重點介紹一下TCP的三次握手和四次揮手。

1) TCP的功能

TCP主要是將資料進行分段打包傳輸,對每個資料包編號控制順序,運輸中丟失、重發和丟棄處理。

2) TCP頭的介紹

有點和IP頭類似,我們先來張圖看下:

TCP頭部

Source Port & Destination Port - 源埠號和目標埠號;計算機通過埠號識別訪問哪個服務,比如http服務或ftp服務;傳送方埠號是進行隨機埠;目標埠號決定了接收方哪個程式來接收。

Sequence number - 32位序列號,TCP用序列號對資料包進行標記,以便在到達目的地後重新重灌。在建立連線時通常由計算機生成一個隨機數作為序列號的初始值。

Acknowledgment number - 32位確認號,確認應答號。傳送端接收到這個確認應答後,可以認為這個位置以前所有的資料都已被正常接收。

Header Length - 首部長度。單位是 '4'個'位元組',如果沒有可選欄位,那麼這裡的值就是 5。表示 TCP 首部的長度為 20 位元組。

checksum - 16位校驗和。用來做差錯控制,TCP校驗和的計算包括TCP首部、資料和其它填充位元組。

flags - 控制位。TCP的連線、傳輸和斷開都受這六個控制位的指揮

window size - 本地可接收資料的數目,這個值的大小是可變的。當網路通暢時將這個視窗值變大加快傳輸速度,當網路不穩定時減少這個值可以保證網路資料的可靠傳輸。它是來在TCP傳輸中進行流量控制的

3) 傳說中的三次握手和四次揮手(抓包演示)

三次握手和四次揮手到底是怎麼回事呢,我用一臺主機A(172.16.50.72:65076)起一個服務,另外一臺主機B(172.16.17.94:8080)請求一下。 在A主機上啟動node服務:

let http = require('http');
let url = require('url');

let server = http.createServer();
server.on('request', (req, res) => {
    let {pathname, querry} = url.parse(req.url, true);
    let result = [];
    req.on('data', (data) => {
        result.push(data);
    })
    req.on('end', () => {
        console.log(Buffer.concat(result).toString());
        res.end('hello world');
    })

})
server.listen(8080, () => {
    console.log('server started');
});
複製程式碼

B主機連線A併傳送資料:

curl -d "user":"lucy" 172.16.17.94:8080
複製程式碼

用wireshark抓包演示一下。如下圖:

wireshark抓包演圖

上圖中A為三次握手,B為資料傳輸,C為四次揮手。下面我們詳細介紹一下這三個部分。

首先我們先圖解一下wireshark抓到的資料,如下圖:

全部

我們把這個過程分為三部分,第一部分為三次握手建立連線,第二部分為資料傳輸,第三次為四次揮手斷開連線。

三次握手

我們分析一下三次握手的過程(包括ack 和 seq的值變化),

三次握手
為了方便描述我們將主動發起請求的172.16.17.94:8080 主機稱為客戶端,將返回資料的主機172.16.17.94:8080稱為伺服器,以下也是。

  • 第一次握手: 建立連線。客戶端傳送連線請求,傳送SYN報文,將seq設定為0。然後,客戶端進入SYN_SEND狀態,等待伺服器的確認。

  • 第二次握手: 伺服器收到客戶端的SYN報文段。需要對這個SYN報文段進行確認,傳送ACK報文,將ack設定為1。同時,自己還要傳送SYN請求資訊,將seq為0。伺服器端將上述所有資訊一併傳送給客戶端,此時伺服器進入SYN_RECV狀態。

  • 第三次握手: 客戶端收到伺服器的ACK和SYN報文後,進行確認,然後將ack設定為1,seq設定為1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。

資料傳輸

資料傳輸

  • 客戶端先向伺服器傳送資料,該資料包是lenth為159的資料。
  • 伺服器收到報文後, 也向客戶端傳送了一個資料進行確認(ACK),並且返回客戶端要請求的資料,資料的長度為111,將seq設定為1,ack設定為160(1 + 159)。
  • 客戶端收到伺服器返回的資料後進行確認(ACK),將seq設定為160, ack設定為112(1 + 111)。

四次揮手

當客戶端和伺服器通過三次握手建立了TCP連線以後,當資料傳送完畢,就要斷開TCP連線了,就有了神祕的“四次揮手”。

四次揮手

  • 第一次揮手:客戶端向伺服器傳送一個FIN報文段,將設定seq為160和ack為112,;此時,客戶端進入 FIN_WAIT_1狀態,這表示客戶端沒有資料要傳送伺服器了,請求關閉連線;

  • 第二次揮手:伺服器收到了客戶端傳送的FIN報文段,向客戶端回一個ACK報文段,ack設定為1,seq設定為112;伺服器進入了CLOSE_WAIT狀態,客戶端收到伺服器返回的ACK報文後,進入FIN_WAIT_2狀態;

  • 第三次揮手:伺服器會觀察自己是否還有資料沒有傳送給客戶端,如果有,先把資料傳送給客戶端,再傳送FIN報文;如果沒有,那麼伺服器直接傳送FIN報文給客戶端。請求關閉連線,同時伺服器進入LAST_ACK狀態;

  • 第四次揮手:客戶端收到伺服器傳送的FIN報文段,向伺服器傳送ACK報文段,將seq設定為161,將ack設定為113,然後客戶端進入TIME_WAIT狀態;伺服器收到客戶端的ACK報文段以後,就關閉連線;此時,客戶端等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,客戶端也可以關閉連線了。

注意:在握手和揮手時確認號應該是對方序列號加1,傳輸資料時則是對方序列號加上對方攜帶應用層資料的長度。

7 應用層

應用層常見協議有HTTP、HTTPS 、FTP 、SMTP等。

TCP/IP模型我們基本介紹完了,那層與層之間是怎樣合作和分工的呢,我們用兩張圖介紹一下: 傳送方的資料是從上往下傳輸的,即從應用層向物理層傳輸。接收方的資料是從下往上傳輸的,即從物理層嚮應用層傳輸。如下兩張圖。

從上到下

傳送方是從高層到低層封裝資料:

  • 在應用層要把各式各樣的資料如字母、數字、漢字、圖片等轉換成二進位制
  • 在TCP傳輸層中,上層的資料被分割成小的資料段,併為每個分段後的資料封裝TCP報文頭部
  • 在TCP頭部有一個關鍵的欄位資訊埠號,它用於標識上層的協議或應用程式,確保上層資料的正常通訊
  • 計算機可以多程式併發執行,例如在發郵件的同時也可以通過瀏覽器瀏覽網頁,這兩種應用通過埠號進行區分
  • 在網路層,上層資料被封裝上親的報文頭部(IP頭部),上層的資料是包括TCP頭部的。IP地址包括的最關鍵欄位資訊就是IP地址,用於標識網路的邏輯地址。
  • 資料鏈路徑層,上層資料成一個MAC頭部,內部有最關鍵的是MAC地址。MAC地址就是固化在硬體裝置內部的全球唯一的實體地址。
  • 在物理層,無論在之前哪一層封裝的報文頭和還是上層資料都是由二進位制組成的,物理將這些二進位制數字位元流轉換成電訊號在網路中傳輸

從下到上
接收方是從低層到高層解封裝

  • 資料封裝完畢傳輸到接收方後,將資料要進行解封裝
  • 在物理層,先把電訊號轉成二進位制資料,並將資料傳送至資料鏈路層
  • 在資料鏈路層,把MAC頭部拆掉,並將剩餘的資料傳送至上一層
  • 在網路層,資料的IP頭部被拆掉,並將剩餘的資料送至上一層
  • 在傳輸層,把TCP頭部拆掉,將真實的資料傳送至應用層

深入理解TCP/IP模型就簡單介紹完了,如果有理解錯誤的地方,歡迎指正!

8 參考文章

相關文章