天天看點

TCP協定 及 TCP粘包現象TCP協定 及 TCP粘包現象1.TCP封包格式2.TCP的擁塞控制3.TCP的建立連結4.TCP的連接配接釋放5.粘包現象

tcp,transmission control protocol,傳輸控制協定。這是一個面向連接配接的傳輸層協定。

與之相對的無連接配接協定為udp,使用者資料報協定。

傳輸層的基本資料機關為——封包。網絡層——包。資料鍊路層為——幀。實體層——比特。

tcp提供面向連接配接的可靠服務,傳送資料之前必須先建立連接配接,傳送完畢要釋放連結。

伺服器端使用的端口号:熟知端口号——0~1023;登記端口号——1024~49151.

用戶端使用的端口号——49152~65535。這種端口号僅在客戶程序運作時才動态确定。當伺服器程序收到用戶端程序的封包時,就知道了客戶程序使用的端口号。

tcp協定是點對點的,提供不丢失、不重複、無差錯的可靠傳輸。

tcp提供全雙工通信允許通信雙方的程序在任何時候都能發送資料。兩個程序都設有發送緩存和接收緩存。

tcp的可靠傳輸是建立在不可靠的ip層之上的,這很神奇。依靠的措施是——封包确認和逾時重傳。

TCP協定 及 TCP粘包現象TCP協定 及 TCP粘包現象1.TCP封包格式2.TCP的擁塞控制3.TCP的建立連結4.TCP的連接配接釋放5.粘包現象

圖1-1 tcp封包的首部與資料

序号。tcp是面向位元組流的,tcp傳送的每一個位元組都有編号。

确認号(小寫ack)。期望收到對方下一個封包段的資料部分第一個位元組的編号。

資料偏移。指出本tcp封包段的資料部分距離初始部分有多遠。實際上也就是首部的長度。

ack。值為1時确認号才有效。也就是說,建立連接配接後所有的封包段都必須把ack置為1。

psh。若psh為1,封包段直接發送,不再等緩沖區滿了再向下傳遞。

rst。複位辨別。若tcp連結出現嚴重差錯,則重連。

syn。同步辨別,若為1,表明這是連接配接封包或同意連接配接封包。

fin。終止辨別,表示釋放一個連接配接。

接收視窗。告訴發送方自己接收區的緩存大小。

校驗和。檢驗整個封包段。注意區分的是,ip資料報的校驗和隻檢驗ip資料報首部。

最大封包段長度mss。指資料部分的最大長度,加上首部長度才是整個tcp封包段的最大長度。

1.慢開始和擁塞避免。

2.快重傳和快恢複。

TCP協定 及 TCP粘包現象TCP協定 及 TCP粘包現象1.TCP封包格式2.TCP的擁塞控制3.TCP的建立連結4.TCP的連接配接釋放5.粘包現象

圖3-1 三次握手

TCP協定 及 TCP粘包現象TCP協定 及 TCP粘包現象1.TCP封包格式2.TCP的擁塞控制3.TCP的建立連結4.TCP的連接配接釋放5.粘包現象

圖4-1 四次握手

問:為什麼斷開連接配接需要4次握手呢?

答:tcp是全雙工模式,接收到fin時意味将沒有資料再發來,但是還是可以繼續發送資料。

tcp粘包問題。

tcp提供的是可靠的位元組流服務。假設tcp接收方是b,發送方是a。

理想情況下,b每次read的都是a每次write的内容,但事實不是這樣的。

會出現a第一次發送(write)qwer這個位元組流,第二次發送tyui;而b第一次讀到(read)的是qwe,第二次read的是rt,第三次read的是yui這種情況。

TCP協定 及 TCP粘包現象TCP協定 及 TCP粘包現象1.TCP封包格式2.TCP的擁塞控制3.TCP的建立連結4.TCP的連接配接釋放5.粘包現象

為什麼呢?

應用層的資料交給tcp,會被分割再包裝成tcp封包,再加上下面ip層的緩沖區處理、網絡擁塞等狀況,就會發生上面的情況。

TCP協定 及 TCP粘包現象TCP協定 及 TCP粘包現象1.TCP封包格式2.TCP的擁塞控制3.TCP的建立連結4.TCP的連接配接釋放5.粘包現象

應對方法

應用層發送“你好”,假設對應的位元組數組是[1,2,3,4],那麼處理後交給tcp的是 [0,4,1,2,3,4],前兩個byte固定放本次傳輸資料量的大小。tcp接收端再寫一個相應的函數,依據長度提取位元組就可以啦。

TCP協定 及 TCP粘包現象TCP協定 及 TCP粘包現象1.TCP封包格式2.TCP的擁塞控制3.TCP的建立連結4.TCP的連接配接釋放5.粘包現象

我的處理

親測成功(測試中隻有描述尺寸的頭部 分兩次 被read()到的情況沒出現過)

繼續閱讀