在網上找了很多有關tcp/ip頭部解析的資料,都是類似於下面的結構
抽象出圖文是這種結構,但是在底層中數據到底是怎么傳輸的呢?沒有答案,在深入學習之后,總結出數據傳輸的方式
IP數據包頭部格式:
上面是在數據到達傳輸層對數據進行IP頭部封裝的數據
TCP協議
TCP協議是傳輸協議,為應用層提供數據服務,和UDP不同,TCP提供可靠的面向連接服務,關於TCP頭部數據格式的說明
跟IP頭部差不多,基本長度為20個字節,基本介紹到此為止,詳解在網上多如牛毛,下面用兩台pc建立連接為例說明:
主機1:IP地址為192.168.1.1
主機2: IP地址為216.3.226.21
下面是TCP/IP傳輸的數據,下面這些為十六進制TCP/IP協議的數據,不是完整的網絡通信數據
第一次:向web站點發送連接請求
192.168.1.246 -> 123.56.106.180
IP頭部:45 00 00 30 52 52 40 00 80 06 2c 23 c0 a8 01 01 d8 03 e2 15
轉化成二進制:1000100111011111111111011111111111100101111111101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
TCP頭部:0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00
轉化成二進制:1100111100100111111011111111111100010100111101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
來看看IP頭部的數據都表示什么:
第一個字節 45:其中'4'代表IP的版本協議,說明是IPV4,'5'標識IP頭部長度,是一個4bit的字段,最大值就是1111了,IP頭部最大長度為60字節,最大值12,而這里的'5',說明有20個字節的長度,這是標准的IP頭部長度。
接下來是 00:是服務類型,由8個bit構成,每2個bit分別標識:最小延時、最大吞吐量、最高可靠性、以及最小費用。這四個1bit同時只能有1個為1。本例中都為0表示一般服務。
接下來 00 30:是IP數據報文的總長,包含頭部以及數據,這里表示48字節,這48字節表示由20字節的IP頭部,和28字節的TCP頭部構成。
接下來 52 52:轉換為十進制就是21074。這個是讓目的主機來判斷新來的分段屬於哪個分組。
接下來 轉換為二進制就'0100 0000',其中第一位是IP協議目前沒有用上的,為0。接着的是兩個標志DF和MF。DF為1表示不要分段,MF為1表示還有進一步的分段(本例為0)。然后的“0 0000”是分段便移
接下來 80:這個字節就是TTL,表示一個IP數據流的生命周期。轉化成10進制為128,說明該數據包最多經過128次路由將被丟棄,每路由一次,TTL的值減1。
接下來 '06',這個字節表示傳輸層的協議類型。在RFC790中有定義,6表示傳輸層是TCP協議。
接下來 '2c 23'這個16bit是頭校驗和。
接下來“c0 a8 01 01”,這個就是源地址(Source Address)了,也就是主機1的IP地址。轉換為十進制的IP地址就是:192.168.1.1,同樣,繼續下來的32位“d8 03 e2 15”是目標地址,216.3.226.21
至此IP數據頭部大概解析完成,接下來解析TCP頭部
TCP頭部:0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00
兩字節段'0d 2',表示本地端口號,轉換為十進制就是3368。第二個兩字節段'00 15'表示目標端口,因為我是連接FTP站點,所以,這個就是21啦,十六進制當然就是'00 15'。
接下來的四個字節“50 5f a9 06”是順序號(Sequence Number),簡寫為SEQ,SEQ=1348446470下面的四個字節“00 00 00 00”是確認號(Acknowledgment Number),簡寫為ACKNUM。
繼續兩個字節,'70 02',轉換為二進制吧,“0111 0000 0000 0010”。這兩個字節,總共16bit,有好多東西呢。第一個4bit'0111',是TCP頭長,十進制為7,表示28個字節(剛才說了,我省略了8字節的option數據,所以你只看見了20字節)。接着的6bit現在TCP協議沒有用上,都為0。最后的6bit“00 0010”是六個重要的標志。這是兩個計算機數據交流的信息標志。接收和發送斷根據這些標志來確定信息流的種類(三次握手和四次握手機制)。下面是一些介紹:
URG:(Urgent Pointer field significant)緊急指針。用到的時候值為1,用來處理避免TCP數據流中斷
ACK:(Acknowledgment fieldsignificant)置1時表示確認號(AcknowledgmentNumber)為合法,為0的時候表示數據段不包含確認信息,確認號被忽略。
PSH:(Push Function),PUSH標志的數據,置1時請求的數據段在接收方得到后就可直接送到應用程序,而不必等到緩沖區滿時才傳送。
RST:(Reset the connection)用於復位因某種原因引起出現的錯誤連接,也用來拒絕非法數據和請求。如果接收到RST位時候,通常發生了某些錯誤。
SYN:(Synchronize sequence numbers)用來建立連接,在連接請求中,SYN=1,ACK=0,連接響應時,SYN=1,ACK=1。即,SYN和ACK來區分Connection Request和Connection Accepted。
FIN:(No more data from sender)用來釋放連接,表明發送方已經沒有數據發送了。
這6個標志位,自己對號入座吧。本例中SYN=1,ACK=0,當然就是表示連接請求了。我們可以注意下面兩個過程的這兩位的變換。
后面的“40 00 c0 29 00 00”不講了,呵呵,偷懶了。后面兩次通訊的數據,自己分開看吧。我們看看連接的過程,一些重要地方的變化。
第二次,web站點返回一個可以連接的信號。
216.3.226.21->192.168.1.1
IP頭部: 45 00 00 2c c6 be 40 00 6a 06 cd ba d8 03 e2 15 c0 a8 01 01
TCP頭部:00 15 0d 28 4b 4f 45 c1 50 5f a9 07 60 12 20 58 64 07 00 00
第三次,我確認連接。TCP連接建立起來。
192.168.1.1->216.3.226.21
IP頭部: 45 00 00 28 52 53 40 00 80 06 2c 2a c0 a8 01 01 d8 03 e2 15
TCP頭部:0d 28 00 15 50 5f a9 07 4b 4f 45 c2 50 10 40 b0 5b 1c 00 00
第一步,我發出連接請求,TCP數據為:SEQ=50 5f a9 06,ACKNUM=00 00 00 00,SYN=1,ACK=0。
第二步,對方確認可以連接,TCP數據為:SEQ=4b 4f 45 c1,ACKNUM=50 5f a9 07,SYN=1,ACK=1。
第三步,我確認建立連接。SEQ=50 5f a9 07, ACKNUM=4b 4f45c2,SYN=0,ACK=1。
可以看出什么變化么?正式建立連接了。在之后的數據傳輸中,攜帶ACK進行安全傳輸
接收從216.3.226.21->192.168.1.1的下一個數據包中:SEQ=4b 4f 45 c2,ACKNUM=50 5f a9 07,SYN=0,ACK=1
至此基本的分析完成,其中有很多細節需要深入理解,這里不再一一贅述。