socket中tcp的斷包和粘包都是tcp協議中出現的問題。
乙太網中存在乙個對於幀的有效資料大小的限制,即mtu,乙太網的mtu為1500位元組。所謂斷包的意思就是說傳送端一次傳送的訊息長度過大,如果超過了mtu,那麼ip會對其進行分片。
在網路程式設計中,我們要避免出現ip分片,那麼為什麼要避免呢?原因是ip層是沒有超時重傳機制的,如果ip層對乙個資料報進行了分片,只要有乙個分片丟失了,只能依賴於傳輸層進行重傳,結果是所有的分片都要重傳一遍,這個代價有點大。由此可見,ip分片會大大降低傳輸層傳送資料的成功率,所以我們要避免ip分片。
對於udp包,我們需要在應用層去限制每個包的大小,一般不要超過1472位元組,即乙太網mtu(1500)—udp首部(8)—ip首部(20)。
對於tcp資料,應用層就不需要考慮這個問題了,因為傳輸層已經幫我們做了。在建立連線的三次握手的過程中,連線雙方會相互通告mss(maximum segment size,最大報文段長度),mss一般是mtu—ip首部(20)—tcp首部(20),每次傳送的tcp資料都不會超過雙方mss的最小值,所以就保證了ip資料報不會超過mtu,避免了ip分片。
而斷包就是因為mss的存在,當訊息長度過大,例如超過了1460位元組(因為tcp首部一般為20個位元組,ip首部為20個位元組),那麼tcp就會將其分片,然後每片被tcp封裝,然後由ip封裝,最後被傳輸到接收端,這樣子當接收端接收到訊息後,就會不清楚這是不是乙個完整的訊息。
粘包則是因為為了提高網路利用率,當傳輸層發現傳輸的資料長度太小時,會等待多個訊息一起傳送,這時候就會提高網路利用率,但是當接收端接收過以後,會不知道這是乙個完整的訊息,還是多個訊息在一起。從而有可能將其作為乙個訊息來處理。nagle演算法就是實現的這個功能。
而對於斷包和粘包的通常處理方法為將訊息封裝為一定的格式,例如每個訊息頭部為aa,尾部為55,或者將整個訊息的有效長度標明,這樣子當接收端接收到訊息之後,就可以以此來分辨訊息是不是我完整的。
tcp粘包,斷包問題及處理
做過乙個五子棋大作戰遊戲,當時用socket長連線在人人聯網對戰時進行處理,但在遊戲過程中總會出現兩個下棋的人接收不到對方棋子的落點的資訊,這就是典型的出現了tcp粘包問題。下來進行具體說明。1.理解nagle演算法 當傳送方每次傳送的資料報都比較小時,而這種小的資料報又比較多時,就會導致網路擁塞,...
TCP粘包 拆包
tcp粘包 拆包 客戶端發服務端傳送了兩個資料報a和b 粘包 服務端一次性接收到了a和b 拆包 服務端第一次接收了a和b的一部分,第二次接收到了b的剩餘部分 粘包 拆包原因 1 應用程式寫入的位元組大小 socket傳送緩衝區大小 2 tcp分段 tcp data部分的大小 mss max segm...
TCP粘包,拆包
粘包 拆包表現形式 現在假設客戶端向服務端連續傳送了兩個資料報,用packet1和packet2來表示,那麼服務端收到的資料可以分為三種,現列舉如下 第一種情況,接收端正常收到兩個資料報,即沒有發生拆包和粘包的現象,此種情況不在本文的討論範圍內。第二種情況,接收端只收到乙個資料報,由於tcp是不會出...