1.簡介
上一篇中通過介紹和講解,應該知道要講解和介紹的內容在哪里了吧,沒錯就是介紹OSI七層模型的傳輸層。因為只有它建立主機端到端的連接如:TCP、UDP。
2.TCP是什么?
tcp是工作在傳輸層,也就是網絡層上一層的協議。
它是面向連接的,可靠的,基于字節流、全雙工的通信協議。
TCP收到上一層的數據包后,會加上TCP頭并且進行一些特殊處理后,再傳遞給網絡層。
2.1TCP定義
? ? ??傳輸控制協議(英語:Transmission Control Protocol,縮寫:TCP)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能。用戶數據報協議(UDP)是同一層內另一個重要的傳輸協議。
3.TCP理論
TCP提供了一種面向連接的、可靠的字節流服務。
面向連接:接雙方在通信前需要預先建立一條連接,這猶如實際生活中的打電話。
- 應用數據分割成TCP認為最適合發送的數據塊。
- 重傳機制。設置定時器,等待確認包
- 對首部和數據進行校驗
- TCP對收到的數據進行排序,然后交給應用層
- TCP的接收端丟棄重復的數據
- TCP還提供流量控制
TCP連接必須要經歷三次握手,而釋放一個TCP連接需要四次握手,這是由TCP的半關閉特性造成的。因為TCP連接時全雙工的,因此,需要TCP兩端要單獨執行關閉。值得注意的是,主動關閉的一端在發送FIN之后,依然還能正常接收對方的數據,只是通知對方它已經沒有數據需要發送了,同理,被動關閉的一端在收到FIN之后,仍然可以發送數據,直到它自身同樣發出FIN之后,才停止發送數據。
4.什么是面向連接、無連接?
- 面向連接:面向連接的協議要求發送數據前需要通過一種手段保證通信雙方都準備好了,之后才進行通信。
- 無連接:無連接的協議則不需要,想發就發
5.什么是全雙工
全雙工(Full Duplex)是一種通信方式,指通信的雙方可以同時發送和接收數據,而不需要像半雙工那樣在發送和接收之間切換。在全雙工通信中,數據可以在兩個方向上同時傳輸,因此通信速度更快,效率更高。
6.OSI和封包詳細信息的對應
為了更加清楚明白,這里將上一篇文章中的圖拿過來進行說明和講解。
7.TCP包的具體內容
?從下圖可以看到wireshark捕獲到的TCP包中的每個字段。
8.TCP報文格式
?TCP是面向連接、可靠的傳輸協議,其報文格式較復雜。TCP報文的格式如下:
上圖簡化如下:
注意:實際的TCP報文段會根據TCP頭部長度和可選項的不同而有所變化。
| 源端口(16位) | 目的端口(16位) | | 序號(32位) | | 確認序號(32位) | | 數據偏移(4位) | 保留(6位) | 標志位(6位) | 窗口大小(16位) | | 校驗和(16位) | 緊急指針(16位) | | 選項(可選) | | 數據(可選) |
? ?主要字段解釋:
- 源端口:占 2 字節,標識數據包是哪個應用發出去的。
- 目的端口:占 2 字節,標識數據包是發給哪個應用的。Source Port和Destination Port:分別占用16位,表示源端口號和目的端口號;用于區別主機中的不同進程,而IP地址是用來區分不同的主機的,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個TCP連接。
- 序號: 占 4 字節,TCP 連接中傳送的數據流中的每一個字節都編上一個序號.序號字段的值則指的是本報文段所發送的數據的第一個字節的序號。Sequence Number:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據字節在數據流中的序號;主要用來解決網絡報亂序的問題;
- 確認號:占 4 字節,是期望收到對方的下一個報文段的數據的第一個字節的序號。Acknowledgment Number:32位確認序列號包含發送確認的一端所期望收到的下一個序號,因此,確認序號應當是上次已成功收到數據字節序號加1。不過,只有當標志位中的ACK標志(下面介紹)為1時該確認序列號的字段才有效。主要用來解決不丟包的問題。
- 數據偏移(首部長度): 占 4 位,它指出 TCP 頭部實際長度。Offset:給出首部中32 bit字的數目,需要這個值是因為任選字段的長度是可變的。這個字段占4bit(最多能表示15個32bit的的字,即4*15=60個字節的首部長度),因此TCP最多有60字節的首部。然而,沒有任選字段,正常的長度是20字節。
- 在 TCP 協議中,TCP 頭部的長度是可變的,最小長度為 20 個字節,最大長度為 60 個字節。這是因為 TCP 頭部中有一些可選字段,如 TCP 選項、窗口縮放因子等,這些字段的長度是可變的,因此 TCP 頭部的長度也會隨之變化。TCP 頭部長度是通過 TCP 頭部中的 數據偏移(首部長度)字段來指定的,它表示 TCP 頭部的長度以 32 位字為單位計算的值。因此,TCP 頭部長度實際上是 數據偏移(首部長度)字段值乘以 4。TCP Flags:TCP首部中有6個標志比特,它們中的多個可同時被設置為1,主要是用于操控TCP的狀態機的,依次為
URG
,ACK
,PSH
,RST
,SYN
,FIN
。每個標志位的意思如下:
- 在 TCP 協議中,TCP 頭部的長度是可變的,最小長度為 20 個字節,最大長度為 60 個字節。這是因為 TCP 頭部中有一些可選字段,如 TCP 選項、窗口縮放因子等,這些字段的長度是可變的,因此 TCP 頭部的長度也會隨之變化。TCP 頭部長度是通過 TCP 頭部中的 數據偏移(首部長度)字段來指定的,它表示 TCP 頭部的長度以 32 位字為單位計算的值。因此,TCP 頭部長度實際上是 數據偏移(首部長度)字段值乘以 4。TCP Flags:TCP首部中有6個標志比特,它們中的多個可同時被設置為1,主要是用于操控TCP的狀態機的,依次為
- 狀態位,占6比特:
- URG:此標志表示TCP包的緊急指針域(后面馬上就要說到)有效,用來保證TCP連接不被中斷,并且督促中間層設備要盡快處理這些數據。
- ACK:該位為 1 時,「確認號」的字段變為有效,否則無效。此標志表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1,為1的時候表示應答域有效,反之為0; TCP協議規定,只有ACK=1時有效,也規定連接建立后所有發送的報文的ACK必須為1。
- PSH:這個標志位表示Push操作。所謂Push操作就是指在數據包到達接收端以后,立即傳送給應用程序,而不是在緩沖區中排隊。
- RST:該位為 1 時,表示 TCP 連接中出現異常必須強制斷開連接,然后重新建立新鏈接。這個標志表示連接復位請求。用來復位那些產生錯誤的連接,也被用來拒絕錯誤和非法的數據包。
- SYN:該位為 1 時,表示希望建立連接,并在其「序號」的字段進行序列號初始值的設定。
表示同步序號,用來建立連接。
SYN
標志位和ACK
標志位搭配使用,當連接請求的時候,SYN
=1,ACK
=0;連接被響應的時候,SYN
=1,ACK
=1;這個標志的數據包經常被用來進行端口掃描。掃描者發送一個只有SYN
的數據包,如果對方主機響應了一個數據包回來 ,就表明這臺主機存在這個端口;但是由于這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全的主機將會強制要求一個連接嚴格的進行TCP的三次握手。 - FIN:該位為 1 時,表示數據發送傳輸完畢,希望斷開連接。表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據可以傳送了,發送
FIN
標志位的TCP數據包后,連接將被斷開。這個標志的數據包也經常被用于進行端口掃描。
- 窗口:占2字節,用于流量控制,通信雙方各聲明一個窗口,標識自己當前的處理能力。控制報文別發太快,也別發太慢。
16位2字節,用于表示滑動窗口大小,窗口大小最大為65535(2^16-1)字節。
接收方的流量控制手段,窗口大小為字節數,起始于確認序號字段指明的值,這個值是接收端正期望接收的字節。告訴發送端,接收端目前允許發送端數據量。大小兩字節65535,在客戶端與服務端 TCP 都允許的情況下,選項中可存在窗口擴展選項。 示例中:窗口大小65535,代表告訴發送方,從這個下一包0的序號開始,接收方只能接受65535個字節長度了(當然這里還沒有算上擴展選項,稍后再講)。 - 檢驗和: 占 2 字節,校驗數據是否完整未更改。
16位2字節,檢驗和覆蓋了整個的 TCP 報文段: TCP 首部和 TCP 數據。這是一個強制性的字段,一定是由發端計算和存儲,并由收端進行驗證。和 UDP 用戶數據報一樣,在計算檢驗和時,要在 TCP 報文段的前面加上12字節的偽首部。偽首部的格式和 UDP 用戶數據報的偽首部一樣。但應把偽首部第4個字段中的17改為6(TCP的協議號是6);把第5字段中的UDP中的長度改為TCP長度。接收方收到此報文段后,仍要加上這個偽首部來計算檢驗和。若使用TPv6,則相應的偽首部也要改變。
校驗和錯誤的分組丟棄(因為源IP地址、源端口號或者協議字段可能被破壞)。 - 緊急指針:16位2字節,在緊急 URG 標志執1的時候有效,代表一個偏移量,和序號字段值相加,代表緊急數據最后一個字節的序號。
- 選項:長度可變,最長可達40字節。當沒有使用“選項”時,TCP 的首部長度是20字節。其最大長度可根據 TCP 首部長度進行推算。TCP 首部長度用4位數據偏移表示,單位是4字節,那么選項部分最長為:(2^4-1)*4-20=40字節。TCP 協議最初只規定了一種選項,即最長報文段長度(數據字段加上TCP首部),又稱為 MSS。MSS 告訴對方 TCP “我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節”。
- 填充: 為了使整個首部長度是 4 字節的整數倍。選項長度是指不一定是32位的整數倍,所以要加填充位,即在這個字段中加入額外的0,以保證TCP頭部是32的整數倍。
?8.1TCP報文字段說明表格展示
字段 | 長度 | 含義 |
Source Port | 16比特 | 源端口,標識哪個應用程序發送。 |
Destination Port | 16比特 | 目的端口,標識哪個應用程序接收。 |
Sequence Number | 32比特 | 序號字段。TCP鏈接中傳輸的數據流中每個字節都編上一個序號。序號字段的值指的是本報文段所發送的數據的第一個字節的序號。 |
Acknowledgment Number | 32比特 | 確認號,是期望收到對方的下一個報文段的數據的第1個字節的序號,即上次已成功接收到的數據字節序號加1。只有ACK標識為1,此字段有效。 |
Data Offset | 4比特 | 數據偏移,即首部長度,指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠,以32比特(4字節)為計算單位。最多有60字節的首部,若無選項字段,正常為20字節。 |
Reserved | 6比特 | 保留,必須填0。 |
URG | 1比特 | 緊急指針有效標識。它告訴系統此報文段中有緊急數據,應盡快傳送(相當于高優先級的數據)。 |
ACK | 1比特 | 確認序號有效標識。只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效。 |
PSH | 1比特 | 標識接收方應該盡快將這個報文段交給應用層。接收到PSH ?= 1的TCP報文段,應盡快的交付接收應用進程,而不再等待整個緩存都填滿了后再向上交付。 |
RST | 1比特 | 重建連接標識。當RST=1時,表明TCP連接中出現嚴重錯誤(如由于主機崩潰或其他原因),必須釋放連接,然后再重新建立連接。 |
SYN | 1比特 | 同步序號標識,用來發起一個連接。SYN=1表示這是一個連接請求或連接接受請求。 |
FIN | 1比特 | 發端完成發送任務標識。用來釋放一個連接。FIN=1表明此報文段的發送端的數據已經發送完畢,并要求釋放連接。 |
Window | 16比特 | 窗口:TCP的流量控制,窗口起始于確認序號字段指明的值,這個值是接收端正期望接收的字節數。窗口最大為65535字節。 |
Checksum | 16比特 | 校驗字段,包括TCP首部和TCP數據,是一個強制性的字段,一定是由發端計算和存儲,并由收端進行驗證。在計算檢驗和時,要在TCP報文段的前面加上12字節的偽首部。 |
Urgent Pointer | 16比特 | 緊急指針,只有當URG標志置1時緊急指針才有效。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。緊急指針指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)。 |
Options | 可變 | 選項字段。TCP協議最初只規定了一種選項,即最長報文段長度(數據字段加上TCP首部),又稱為MSS。MSS告訴對方TCP“我的緩存所能接收的報文段的數據字段的最大長度是MSS個字節”。 |
Padding | 可變 | 填充字段,用來補位,使整個首部長度是4字節的整數倍。 |
data | 可變 | TCP負載。 |
?9.梳理
主要詳細地介紹了一下TCP包的理論知識,基本上都是文字,看起來比較晦澀難懂。下一篇打算講解和分享一下:TCP的三次握手和四次揮手以及WireShark的實踐。