最近再復習計算機網絡中的傳輸層這一部分,有個問題讓我想了好幾天都還挺困惑。我們知道在TCP建立連接時需要經過三次握手,前面兩次都沒有攜帶數據,只有報文首部,那么第三次發送過程中能否攜帶報文?
看了一篇博客http://www.0xffffff.org/2015/04/15/36-The-TCP-three-way-handshake-with-data/
博主也和我有同樣的困惑,同時也對博主刨根問底的精神很是敬佩。
主要內容如下:
RFC793文檔里帶有SYN標志的過程包是不可以攜帶數據的,也就是說三次握手的前兩次是不可以攜帶數據的(邏輯上看,連接還沒建立,攜帶數據好像也有點說不過去)。重點就是第三次握手可不可以攜帶數據。
先說結論:TCP協議建立連接的三次握手過程中的第三次握手允許攜帶數據。
對照着上邊的TCP狀態變化圖的連接建立部分,我們看下RFC793文檔的說法。RFC793文檔給出的說法如下(省略不重要的部分):
重點是這句 “Data or controls which were queued for transmission may be included”,也就是說標准表示,第三次握手的ACK包是可以攜帶數據。