TCP(Transmission Control Protocol)傳輸控制協議是一種面向連接的、可靠的、基于字節流的傳輸層協議
端口號取值范圍0~6535 因為十六位二進制構成 2^16 |
|
第一行 四層協議必須干的活 傳輸層 把端口號封裝到數據里 |
|
第二行 序號: 保證數據的順序 |
|
第三行 確認序號:去要下一個序號同時代表我已經收到了 |
|
第四行 首部長度 數據前面的稱之為頭部 |
|
6位標記位 每一個標記位占一位 |
|
URG緊急標記位 |
|
ACK確認標記位 |
|
PSH若置為1這一數據段不在緩存區里等待,直接優先處理 |
|
RST斷開連接標記位 |
|
SYN請求標記位 置一建立連接的過程 |
|
FIN結束標記位 置一釋放連接的過程 |
|
第五行 校驗和,目的是保證數據完整性 |
|
二層使用的循環冗余算法 CRC算法 |
|
四層使用的是反碼相加法 強度較強 |
|
四層偽頭部校驗 --- 12個字節的內容,32源IP,32目標IP,8位保留,8位協議,16位總長度 |
|
注意:不要將確認序號Ack與標志位中的ACK搞混了。確認方Ack=發起方Seq+1,兩端配對 |
TCP報文各段詳細說明:
- 源端口和目的端口: 各占 2 字節.端口是傳輸層與應用層的服務接口.傳輸層的復用和分用功能都要通過端口才能實現
- 序號: 占 4 字節.TCP 連接中傳送的數據流中的每一個字節都編上一個序號.序號字段的值則指的是本報文段所發送的數據的第一個字節的序號
- 確認號: 占 4 字節,是期望收到對方的下一個報文段的數據的第一個字節的序號
- 數據偏移/首部長度: 占 4 位,它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠.“數據偏移”的單位是 32 位字(以 4 字節為計算單位)
- 保留: 占 6 位,保留為今后使用,但目前應置為 0
- 緊急URG: 當 URG=1 時,表明緊急指針字段有效.它告訴系統此報文段中有緊急數據,應盡快傳送(相當于高優先級的數據)
- 確認ACK: 只有當 ACK=1 時確認號字段才有效.當 ACK=0 時,確認號無效
- PSH(PuSH): 接收 TCP 收到 PSH = 1 的報文段,就盡快地交付接收應用進程,而不再等到整個緩存都填滿了后再向上交付
- RST (ReSeT): 當 RST=1 時,表明 TCP 連接中出現嚴重差錯(如由于主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接
- 同步 SYN: 同步 SYN = 1 表示這是一個連接請求或連接接受報文
- 終止 FIN: 用來釋放一個連接.FIN=1 表明此報文段的發送端的數據已發送完畢,并要求釋放運輸連接
- 檢驗和: 占 2 字節.檢驗和字段檢驗的范圍包括首部和數據這兩部分.在計算檢驗和時,要在 TCP 報文段的前面加上 12 字節的偽首部
- 緊急指針: 占 16 位,指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)
- 選項: 長度可變.TCP 最初只規定了一種選項,即最大報文段長度 MSS.MSS 告訴對方 TCP:“我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節.” [MSS(Maximum Segment Size)是 TCP 報文段中的數據字段的最大長度.數據字段加上 TCP 首部才等于整個的 TCP 報文段]
- 填充: 這是為了使整個首部長度是 4 字節的整數倍
IP包頭結構
版本號(Version):
長度4比特。標識目前采用的IP協議的版本號。一般的值為0100(IPv4),0110(IPv6)
IP包頭長度(Header Length):
長度4比特。這個字段的作用是為了描述IP包頭的長度,因為在IP包頭中有變長的可選部分。 |
|
該部分占4個bit位,單位為32bit(4個字節),即本區域值= IP頭部長度(單位為bit)/(8*4), |
|
因此,一個IP包頭的長度最長為“1111”,即15*4=60個字節。IP包頭最小長度為20字節。 |
服務類型(Type of Service):
長度8比特。8位 按位被如下定義 PPP DTRC0 |
|
PPP:定義包的優先級,取值越大數據越重要 |
|
000 普通 (Routine) |
|
001 優先的 (Priority) |
|
010 立即的發送 (Immediate) |
|
011 閃電式的 (Flash) |
|
100 比閃電還閃電式的 (Flash Override) |
|
101 CRI/TIC/ECP(找不到這個詞的翻譯) |
|
110 網間控制 (Internetwork Control) |
|
111 網絡控制 (Network Control) |
|
D 時延: 0:普通 1:延遲盡量小 |
|
T 吞吐量: 0:普通 1:流量盡量大 |
|
R 可靠性: 0:普通 1:可靠性盡量大 |
|
M 傳輸成本: 0:普通 1:成本盡量小 |
|
0 最后一位被保留,恒定為0 |
IP包總長(Total Length):
長度16比特。 以字節為單位計算的IP包的長度 (包括頭部和數據),所以IP包最大長度65535字節。
標識符(Identifier):
長度16比特。該字段和Flags和Fragment Offest字段聯合使用,對較大的上層數據包進行分段(fragment)操作。 |
|
路由器將一個包拆分后,所有拆分開的小包被標記相同的值,以便目的端設備能夠區分哪個包屬于被拆分開的包的一部分。 |
標記(Flags):
長度3比特。該字段第一位不使用。第二位是DF(Don't Fragment)位,DF位設為1時表明路由器不能對該上層數據包分段。如果一個上層數據包無法在不分段的情況下進行轉發,則路由器會丟棄該上層數據包并返回一個錯誤信息。第三位是MF(More Fragments)位,當路由器對一個上層數據包分段,則路由器會在除了最后一個分段的IP包的包頭中將MF位設為1。
片偏移(Fragment Offset):
長度13比特。表示該IP包在該組分片包中位置,接收端靠此來組裝還原IP包。
生存時間(TTL):
長度8比特。當IP包進行傳送時,先會對該字段賦予某個特定的值。 |
|
當IP包經過每一個沿途的路由器的時候,每個沿途的路由器會將IP包的TTL值減少1。 |
|
如果TTL減少為0,則該IP包會被丟棄。這個字段可以防止由于路由環路而導致IP包在網絡中不停被轉發。 |
協議(Protocol):
長度8比特。標識了上層所使用的協議。 |
|
以下是比較常用的協議號: |
|
1 ICMP |
|
2 IGMP |
|
6 TCP |
|
17 UDP |
|
88 IGRP |
|
89 OSPF |
頭部校驗(Header Checksum):。
長度16位。用來做IP頭部的正確性檢測,但不包含數據部分。 |
|
因為每個路由器要改變TTL的值,所以路由器會為每個通過的數據包重新計算這個值 |
起源和目標地址(Source and Destination Addresses):
這兩個地段都是32比特。標識了這個IP包的起源和目標地址。要注意除非使用NAT,否則整個傳輸的過程中,這兩個地址不會改變。 |
|
至此,IP包頭基本的20字節已介紹完畢,此后部分屬于可選項,不是必須的部分。 |
可選項(Options):
這是一個可變長的字段。該字段屬于可選項,主要用于測試,由起源設備根據需要改寫??蛇x項目包含以下內容: |
|
1、松散源路由(Loose source routing):給出一連串路由器接口的IP地址。IP包必須沿著這些IP地址傳送,但是允許在相繼的兩個IP地址之間跳過多個路由器。 |
|
2、嚴格源路由(Strict source routing):給出一連串路由器接口的IP地址。IP包必須沿著這些IP地址傳送,如果下一跳不在IP地址表中則表示發生錯誤。 |
|
3、路由記錄(Record route):當IP包離開每個路由器的時候記錄路由器的出站接口的IP地址。 |
|
4、時間戳(Timestamps):當IP包離開每個路由器的時候記錄時間。 |
填充(Padding):
因為IP包頭長度(Header Length)部分的單位為32bit,所以IP包頭的長度必須為32bit的整數倍。 |
|
因此,在可選項后面,IP協議會填充若干個0,以達到32bit的整數倍。 |
本文來自博客園,作者:{Zedffeng},轉載請注明原文鏈接:{https://www.cnblogs.com/zedffeng/}