在編寫網路程式時,常使用tcp協議。那麼乙個tcp包到底由哪些東西構成的呢?其實乙個tcp包,首先需要通過ip協議承載,而ip報文,又需要通過乙太網傳送。下面我們來看看幾種協議頭的構成
一 .ethernet頭
以太幀分好幾種型別,常見的以太幀為ethernet ii
下面就是乙個典型的ethernet ii幀
ethernet ii型別乙太網幀的最小長度為64位元組(6+6+2+46+4),最大長度為1518位元組(6+6+2+1500+4)
首先是目的mac 6個位元組,然後源mac6個位元組,接下來資料型別兩個位元組。
常見的型別如下
ipv4: 0x0800
arp:0x0806
pppoe:0x8864
802.1q tag: 0x8100
ipv6: 0x86dd
mpls label:0x8847
然後是資料長度,46-1500位元組。對於不定長的資料報,幀最後還有4個位元組的fcs(frame check sequence)
下面是乙個以太幀頭示例,該報文型別為ipv4(0x8000)
二 ip頭部
對於乙個ipv4型別的以太幀,資料的開始就是ip頭部。一般ipv4的頭部是20個位元組。
版本號(version):4bit。表明ip協議的版本號。一般為0100(ipv4),0110(ipv6)
ip包頭長度(header length):4bit。用於描述ip包頭長度,因為ip包頭長度是可變的。
這裡所指示的長度,是以4個位元組為乙個單位。例如,乙個ip包頭的長度最長為「1111」,即15*4=60個位元組。ip包頭最小長度為20位元組。
服務型別(type of service):長度8位元。
ip包總長(total length):16bit。 以位元組為單位計算的ip包的長度 (包括頭部和資料),所以ip包最大長度65535位元組。
識別符號(identifier):16bit。該字段和flags和fragment
offest欄位聯合使用,對較大的上層資料報進行分段(fragment)操作。路由器將乙個包拆分後,所有拆分開的小包被標記相同的值,以便目的端裝置能夠區分哪個包屬於被拆分開的包的一部分。
標記(flags):3bit。第一位是保留位不使用。第二位是df(don't
fragment)位,df位設為1時表明路由器不能對該資料報分包。如果乙個資料報無法在不分段的情況下傳送,則路由器會丟棄該資料報並返回乙個錯誤資訊。第三位是mf(more fragments)位,當路由器對乙個上層資料報分段,則路由器會在除了最後乙個分段的ip包的包頭中將mf位設為1。
片偏移(fragment offset):13bit。表示該ip包在該組分片包中位置,接收端靠此來組裝還原ip包。
生存時間(ttl):8bit。當ip包在網路上傳送時,每經過乙個路由器,ttl就自動減一。值為0時,則丟棄報文。防止報文進入環路
協議(protocol):8bit。標識ip頭後面的報文協議型別
以下是比較常用的協議號:
1 icmp
2 igmp
6 tcp
17 udp
88 igrp
89 ospf
頭校驗和(header
checksum):16bit。用來做ip頭部的正確性檢測,但不包含資料部分。由於路由器會改變ttl,所以路由器會為每個通過的資料報重新計算這個值。
源和目的位址(source and destination addresses):這兩個地段都是32位元。標識了這個ip包的起源和目標位址。要注意除非使用nat,否則整個傳輸的過程中,這兩個位址不會改變。
下圖就是乙個ip頭的內容
三 tcp 頭部
tcp封裝在ip報文中的時候,如下圖所示,tcp頭緊接著ip頭(ipv6有擴充套件頭的時候,則tcp頭在擴充套件頭後面),不攜帶選項(option)的tcp頭長為20bytes,攜帶選項的tcp頭最長可到60bytes。
源埠(source port):16bit, 表示報文傳送方的埠號
目的埠(destination port): 16bit,表示報文接收方的埠號
序列號(sn):32bit,標識了tcp報文中第乙個byte在對應方向的傳輸中對應的位元組序號。當syn出現,序列碼實際上是初始序列碼(isn),而第乙個資料位元組是isn+1,單位是byte。比如傳送端傳送的乙個tcp包淨荷(不包含tcp頭)為12byte,sn為5,則傳送端接著傳送的下乙個資料報的時候,sn應該設定為5+12=17。通過系列號,tcp接收端可以識別出重複接收到的tcp包,從而丟棄重複包,同時對於亂序資料報也可以依靠系列號進行重排序,進而對高層提供有序的資料流。另外syn標誌和fin標誌在邏輯上也占用乙個byte,當syn標誌位有效的時候,該字段也稱為isn(initial sequence number),詳細請參考後續的tcp連線管理。
應答號(ack):32bit,標識了報文傳送端期望接收的位元組序列。如果設定了ack控制位,這個值表示乙個準備接收的包的序列碼,注意是準備接收的包,比如當前接收端接收到乙個淨荷為12byte的資料報,sn為5,則傳送端可能會回覆乙個確認收到的資料報,如果這個資料報之前的資料也都已經收到了,這個資料報中的ack number則設定為12+5=17,表示17byte之前的資料都已經收到了。在舉乙個例子,如果在這個資料報之前有個sn為3,淨荷為2byte的資料報丟失,則在接受端接收到這個sn為5的亂序資料報的時候,協議要求接收端必須要回覆乙個ack確認包,這個確認包中的ack number只能設定為3。
頭長(header length):4bit,指示tcp頭的長度,即資料從何處開始。最大為15,單位是32位元,即4個位元組,與ip頭中的長度定義相同。
保留(reserved):4bit,這些位必須是0。為了將來定義新的用途所保留,其中rfc3540將reserved欄位中的最後一位定義為nonce標誌。
標誌(code bits):8bit
cwr(congestion window reduce):擁塞視窗減少標誌被傳送主機設定,用來表明它接收到了設定ece標誌的tcp包,傳送端將通過降低傳送視窗的大小來降低傳送速率
ece(ecn echo):ecn響應標誌被用來在tcp3次握手時表明乙個tcp端是否具備ecn功能,並且表明接收到的tcp包的ip頭部的ecn被設定為11。更多資訊請參考rfc793。
urg(urgent):表示緊急(the
urgent pointer) 指標是否有效。
ack(acknowledgment):1表示這是乙個確認的tcp包, 0則不是確認包。
psh(push):該標誌置位時,一般是表示傳送端快取中已經沒有待傳送的資料,接收端不將該資料進行佇列處理,而是盡可能快將資料轉由應用處理。
rst(reset):用於復位相應的tcp連線。通常在發生異常或者錯誤的時候會觸發復位tcp連線。
syn(synchronize):表示同步序列編號(synchronize
sequence numbers)是否有效。該標誌僅在三次握手建立tcp連線時有效。它提示tcp連線的服務端檢查序列編號,該序列編號為tcp連線發起端(一般是客戶端)的初始序列編號。在這裡,可以把tcp序列編號看作是乙個範圍從0到4,294,967,295的32位計數器。通過tcp連線交換的資料中每乙個位元組都經過序列編號。在tcp報頭中的序列編號欄包括了tcp分段中第乙個位元組的序列編號。
fin(finish):帶有該標誌置位的資料報用來結束乙個tcp會話,但對應埠仍處於開放狀態,準備接收後續資料。當fin標誌有效的時候我們稱呼這個包為fin包。
視窗大小(window size):16bit,表示從ack
number開始還能接收多少位元組的資料量,即當前接收端的接收視窗還有多少剩餘空間。用於tcp的流量控制。
校驗和(checksum):16bit。傳送端基於資料內容計算乙個數值,接收端要與傳送端數值結果完全一樣,才能證明資料的有效性。接收端checksum校驗失敗的時候會直接丟掉這個資料報。checksum是根據偽頭+tcp頭+tcp資料三部分進行計算的。
緊急指標(urgent
選項(option):長度不定,但長度必須以是32bits的整數倍。常見的選項包括mss、sack、timestamp等等,後續的內容會分別介紹相關選項。
乙個完整的tcp頭展示
TCP IP報文格式
tcp ip報文格式 2009 09 28 22 03 21 分類 1 ip報文格式 ip協議是tcp ip協議族中最為核心的協議。它提供不可靠 無連線的服務,也即依賴其他層的協議進行差錯控制。在區域網環境,ip協議往往被封裝在乙太網幀 見本章1.3節 中傳送。而所有的tcp udp icmp ig...
報文解析 104規約報文結構解析
104 規約的報文由啟動字元 報文長度 控制域和應用服務資料單元組成,出於控制的目的,報文也可僅由啟動字元 報文長度和控制域組成。2種結構。二 控制域 根據不同的應用,控制域的格式,有3種型別。用於編號的資訊傳輸。向對方報告已收到的資訊幀序列號。可計數的資訊傳輸功能。特點 控制域1的第乙個bit,d...
報文解析 Excel公式自動解析CAN報文的方法
在can網路上擷取的報文一般被儲存為為.txt或.asc等格式,在分析報文時經常需要對著協議來逐條報文 逐個位元組甚至逐節來解析。為了應對這種情況,行業內也是提出了各種解決方案,比如vector的can報文軟體,或者自己寫上位機來自動解析,再或者將對應報文匯入進excel中用公式自動解析 本文詳細介...