TCP協議封裝格式及三次握手四次斷開

介紹了個人對TCP協議格式的理解,及TCP的三次握手和四次斷開機制。

開發Web,免不了遇到客戶打不開網頁,網頁顯示不正確等問題。通常工程師會收到一段log或用Wireshark截一個pacp。瞭解了TCP協議,及TCP的連接斷開機制,對解析問題幫助很大。


進入正題前先囉嗦幾句(熟悉的可略過)

網絡開發遵從OSI 7層協議,但其實TCPIP 5層協議纔是事實模型。見下圖:


TCPIP 5層協議將上3層(應用層,表示層,會話層)糅合到了一起。還有TCIPIP 4層模型,還將下面2層(數據鏈路層,物理層)糅合到了一起

1.應用層(應用層,表示層,會話層):

用於表示數據,圖像,加密壓縮(ASCII,EBCDIC,JPEG),管理同步(操作系統,應用讀取)。相關協議極其豐富:瀏覽網頁HTTP,文件傳輸TFTP / FTP / NFS,郵件SMTP,遠程登錄Telnet,網絡管理SNMP,名稱管理DNS等

2.傳輸層:

用於可靠/不可靠方式傳送數據。相關協議:TCP,UDP

3.網絡層:

用於尋址。相關協議:IP,ICMP,ARP,RIP,EIGRP,OSPF等。

4.數據鏈路層:

用於數據傳遞給對方。相關協議:802.3/802.2,HDLC,FR,PPP,STP等。

5.物理層:

用於以物理介質傳送數據。EIA/TIA-232 V.35/RJ45等。


(現在進入正題。下面是我個人對TCP封裝字段的理解,權威的請查閱wikipedia或RFC793)


1.源端口號(16位)和目標端口號(16位)

端口號。它倆和源IP和目標IP構成一個TCP連接。常用的TCP端口有:HTTP 80,FTP 21,SMTP 25,Telnet 23,DNS 53

2.序列號(32位)

如下載1G視頻,服務器不可能直接發過來,肯定需要分批發過來,序列號就是分批段的序號。

3.確認號(32位)

上面序列號是分批發過來的序號,因此確認號就是期望收到的下一個序列號。比如確認號爲5,表示序列號1-4的都收到了,現在需要序列號爲5的段。確認號和後面的ACK標誌位一起用,當ACK標誌位1時確認號起作用。

4.首部長度(4位)

指明段頭部長度。如沒有最下面的可選項和數據,正常的長度是20 byte。最大長度是60 byte

5.保留(6位)

全0,留給將來用。(通常future means never,工程獅都懂的)

6.Flag(6位)

URG:爲1表示下面的緊急指針(16位)有效

ACK:爲1表示上面的確認號(32位)有效

PSH:爲1表示將數據立即交給應用程序(默認收到的數據是暫時緩存到內存的)

RST:爲1表示斷開TCP連接

SYN:爲1表示請求TCP連接(具體見下面TCP 3次握手連接)

FIN:爲1表示數據發送完畢(具體見下面TCP 4次斷開連接)

7.窗口大小(16位)

用於流控機制和阻塞避免機制。流控機制簡單地說就是TCP有能力判斷通信雙方間網絡的通暢程度,來降低網絡中傳送數據的速度。後者看名字就能知道是什麼意思。

比如你家ADSL 10M帶寬,去服務器上下載視頻,服務器端出接口的帶寬通常很大有幾個G,此時按G給你傳數據顯然不合理,TCP的窗口大小就起作用了,指明瞭當前本地可接收數據的緩衝區大小。

8.校驗和(16位)

用於防止上面的數據被篡改,自己先將上面的數據校驗一遍保存到校驗和發送出去。對方收到數據自己校驗一遍後和校驗和裏數據對比,一致的話表示上面的數據未被篡改

9.緊急指針(16位)

當上面的URG爲1時有效。指向包內數據段的某個字節,不進入緩衝直接交給上層進程(非緊急數據是要進入緩衝的)

10.可選項

只知道有個MSS(Maximum Segment Size)建立連接時向對方通知本機可以接收的最大TCP段長度。其餘沒全部研究過,可查閱RFC793。

11.數據

(顧名思義)


TCP是可靠的傳輸協議,因此建立連接時需要雙方握手,採用3次握手機制:


簡單地說就是:SYN → SYN+ACK → ACK。下圖爲一個典型的TCP連接請求:



斷開連接時,採用4次斷開機制:

簡單地說就是:FIN+ACK → ACK     FIN+ACK → ACK。下圖爲一個典型的TCP斷開請求:


Q:那爲何建立連接是3次握手,斷開連接要4次握手呢?斷開連接同樣3次握手可以嗎?

A:其實3次斷開在技術上完全可以做到,很容易可以將上圖中接收方的步驟2或3去掉。採用4次握手斷開的原因是:網絡是雙向的。

假設A和B在互相從對方主機上下載數據,A傳送完數據後,就通知B要斷開連接。此時如果採用3次握手斷開機制,B立刻斷開連接的話,B還有未傳送完的數據將無法繼續傳送。因此採用4次握手斷開機制,A傳送完數據後通知B要斷開,B回覆知道了,A收到後就不在向B傳送數據。等B也傳送完數據後通知A要斷開,A回覆知道了,B收到後就不再像A傳送數據。這樣A和B直接的TCP連接才徹底斷開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章