介紹了個人對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連接才徹底斷開。