TCP 、UDP 、IP、 ICMP協議報文格式分析
Tcp報文格式:

Wireshark抓包如圖:

源端口/目的端口(16bit):
在TCP報文中包涵了源端口/目的端口,源端口標識了發送進程,目的端口標識了接收方進程。由上圖可以看出在此報文中我們的源端口號是54160, 目的端口是cichlid(1377)。
序列號(32bit):
Sequence Number這個是發送序列號,用來標識從源端向目的端發送的數據字節流,它表示在這個報文端中的第一個數據字節的順序號,序列號是32位的無符號類型,序列號表達達到2^32 - 1后又從0開始, 當建立一個新的連接時,SYN標志為1,系列號將由主機隨機選擇一個順序號ISN(Initial Sequence Number)。此報文中的序列號是0x37e3d3a9如下圖:

確認號(32bit):
Acknowledgment Number它包涵了發送確認一端所期望收到的下一個順序號。因此確認序列號應當是上次成功接收到數據的順序號加1。只有ACK標志為1時確認序號字段才有效。TCP為應用層提供全雙工服務,這意味着數據能在兩個方向上獨立的進行傳輸,因此連接的兩斷必須要保證每個方向上的傳輸數據順序。由圖可以看出此報文的確認號為0xaa09ab7b。

偏移(4bit):
這里的偏移實際指的是TCP首部的長度,它用來表明TCP首部中32bit字的數目,通過它可以知道一個TCP包它的用戶數據從哪里開始,這個字段占4bit,若此字段的值為1000,則說明TCP首部的長度是8 * 4 = 32字節,所以TCP首部的最大長度是該字段的值為1111 = 15, 15 * 4 =60字節。此報文我們的偏移量在0x50中,又因它占4bit,0x50等於二進制的0101 0000 所以我們的偏移量是 0101=5,所以我們的TCP報文首部長度為5* 4 = 20字節。

標志(Flags):

Reverved、Nonce、CWR、Ecn-Echo(6bit):目前沒有使用,它們的值都為0,作為保留,留待以后開發新技術時使用。
URG(Urgent Pointer Field Significant):緊急指針標志,用來保證TCP連接不被中斷,並且督促中間設備盡快處理這些數據
ACK(Acknowledgement Field Signigicant):確認號字段,該字段為1時表示應答字段有效,即TCP應答號將包含在TCP報文中。
PSH(Push Function): 推送功能,所謂推送功能指的是接收端在接收到數據后立即推送給應用程序,而不是在緩沖區中排隊。
RST(Reset the connection): 重置連接,不過一般表示斷開一個連接,
SYN(Synchronize sequence numbers):同步序列號,用來發起一個連接請求。
FIN(No more data from sender):表示發送端發送任務已經完成(即斷開連接)。
窗口大小(16bit):
表示現在運行對方發送的數據量。也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量,由下圖可以看出該窗口允許發送65536的數據量。

校驗和(16bit)
包含TCP首部和TCP數據段,這是一個強制性的字段,一定是由發送端計算和存儲,由接收端進行驗證。

UDP報文格式:

網絡抓包如圖:


由圖可知源端口號(Source port)為64668,目的端口號(Destination port)為10019,用戶數據報長度(Length)為136bit,校驗和(checksum)為0x8e67=36455,另外存在128bytes的數據(Data)。
IP報文格式:

網絡抓包如下圖:

版本(Version):IP協議的版本,目前的IP協議版本號為4,下一代IP協議版本號為6。
首部長度(Header length):IP報頭的長度。固定部分的長度(20字節)和可變部分的長度之和。共占4位。最大為1111,即10進制的15,代表IP報頭的最大長度可以為15個32bits(4字節),也就是最長可為15*4=60字節,除去固定部分的長度20字節,可變部分的長度最大為40字節。
總長度(Total Length):IP報文的總長度。報頭的長度和數據部分的長度之和。此IP報文的總長度為52字節。
標識(Identification):唯一的標識主機發送的每一分數據報。通常每發送一個報文,它的值加一。當IP報文長度超過傳輸網絡的MTU(最大傳輸單元)時必須分片,這個標識字段的值被復制到所有數據分片的標識字段中,使得這些分片在達到最終目的地時可以依照標識字段的內容重新組成原先的數據。故該字段標記當前分片為第幾個分片,在數據報重組時很有用。由圖可知當前分片為第17919個分片。

標志(Flags):共3位。R(Reserved bit)、DF(Don’t fragment)、MF(More fragment)三位。目前只有后兩位有效,DF位:為1表示不分片,為0表示分片。MF:為1表示不是最后一片,還有其他分片,為0表示這是最后一片。

片偏移(Fragment offset):該字段是與ip分片后,相應的ip片在總的ip片的位置。該字段的單位是8字節。比如,一個長度為4000字節的ip報文,到達路由器。這是超過了鏈路層的MTU,需要進行分片,4000字節中,20字節為包頭,3980字節為數據,需要分成3個ip片(鏈路層MTU為1500),那么第一個分片的片偏移就是0,表示該分片在3980的第0位開始,第1479位結束。第二個ip片的片偏移為185(1480/8),表示該分片開始的位置在原來ip的第1480位,結束在2959。第三片的片偏移為370(2960/8),表示開始的時候是2960位,結束的時候在3979位。

生存時間(Time to live):IP報文所允許通過的路由器的最大數量。每經過一個路由器,TTL減1,當為0時,路由器將該數據報丟棄。TTL 字段是由發送端初始設置一個 8 bit字段.推薦的初始值由分配數字 RFC 指定,當前值為 54,表明此數據包經過了64-54=10台路由器。
協議(Protocol):指出IP報文攜帶的數據使用的是那種協議,以便目的主機的IP層能知道要將數據報上交到哪個進程(不同的協議有專門不同的進程處理)。和端口號類似,此處采用協議號,TCP的協議號為6,UDP的協議號為17。ICMP的協議號為1,IGMP的協議號為2.
首部校驗和(Header checksum):計算IP頭部的校驗和,檢查IP報頭的完整性。由圖中的correct可知該IP報頭是完整的。
源IP地址(source):標識IP數據報的源端設備,由圖可知該源IP地址為183.232.173.182
目的IP地址(destination):標識IP數據報的目的地址,由圖可知該目的IP地址為172.31.116.155
Icmp報文格式:

網絡抓包如圖:



實驗原理:ping是用來測試網絡連通性的命令,一旦發出ping命令,主機會發出連續的測試數據包到網絡中,在通常的情況下,主機會收到回應數據包,ping采用的是ICMP協議。
在這次實驗中可以發現,日常進行的ping操作的icmp報文就只有兩種,請求(request)和應答(reply)。這兩個報文的type不一樣,8代表請求,0代表應答;code都為0,表示為回顯應答;標示符和序列號都是一樣的,表示這兩個報文是配對的。
數據鏈路層幀格式分析:
實際中,我們會發現,大多數應用程序的以太網數據包都是Ethernet II幀的,如HTTP/Telnet/FTP/SMTP/POP3等應用。其格式如圖:

幀頭:6個字節的目的MAC地址和6字節的源MAC地址。2字節的類型字段,表示封裝在數據中的數據類型。
數據:46-1500字節的數據字段。
幀尾:4字節的幀效驗序列。
抓包如圖:

可見,其目的mac地址為c8:5b:76: 1d:c1:9e,源mac地址為04:f9:38:c9:6a:22,類型為0x0800指示了該幀包含了ipv4數據報,另外0x86dd表示該幀包含的是ipv6數據報,0x0806表明指示了該幀包含了ARP幀,0x8100指示了該幀包含了IEEE 802.1Q幀。
Tcp三次握手:

網絡抓包:

第一次握手,客戶端請求連接,此時客戶端發送一個tcp,標志位為SYN,序列號為0;

第二次握手,服務器發回確認包, 標志位為 SYN,ACK. 將確認序號(Acknowledgement Number)設置為客戶的I S N加1,如圖

第三次握手,客戶端再次發送確認包(ACK) SYN標志位為0,ACK標志位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1, 如圖

Tcp四次揮手:

網絡抓包:

第一次揮手,主動方發送一個FIN,用來關閉主動方到被動方的數據傳送;

第二次揮手,被動方收到這個FIN,它發回一個ACK,確認序號為收到的序號加1,和SYN一樣,一個FIN將占用一個序號;

第三次揮手,被動方關閉與主動方的連接,發送一個FIN給主動方;

第四次揮手,主動方發回ACK報文確認,並將確認序號設置為收到序號加1;被動方關閉連接。

