做過乙個五子棋大作戰遊戲,當時用socket長連線在人人聯網對戰時進行處理,但在遊戲過程中總會出現兩個下棋的人接收不到對方棋子的落點的資訊,這就是典型的出現了tcp粘包問題。
下來進行具體說明。
1.理解nagle演算法
當傳送方每次傳送的資料報都比較小時,而這種小的資料報又比較多時,就會導致網路擁塞,癱瘓,為了處理這種問題引入nagle演算法。nagle演算法:傳送方首先會傳送第乙個小資料報,並將其餘的小資料報放入其快取中,等到收到接收方的ack時,便將這些小資料報一塊傳送過去。
2.nagle演算法帶來的問題-粘包
當後面的小資料報一塊傳送的時候,就可能造成粘包現象,例如我們五子棋的自定義協議是包頭+資料:第乙個包
第二個包::
第三個包::
這樣會造成二三包粘包,接收方會接收到,這樣就無法解析處理了。
3.解決粘包問題
<1>接收方在包頭記錄此次傳送包的大小,接收方根據包頭的寫的包大小,對包進行擷取處理。
<2>在包結尾處新增特殊字元,接收方根據此特殊字元進行處理。
對於socket最簡單的方法就是 socket.settcpnodelay(true); 來禁用nagle演算法。
4.斷包問題
斷包問題,就是一次傳送的包過大,導致傳送方緩衝區存不下,就會進行擷取傳送,導致包不連續。
斷包的處理和粘包的處理一樣(就上面的兩種方法)。
Java NIO 處理粘包 斷包問題
nio socket是非阻塞的通訊模式,與io阻塞式的通訊不同點在於nio的資料要通過channel放到乙個快取池bytebuffer中,然後再從這個緩衝池中讀出資料,而io的模式是直接從inputstream中read。所以對於nio,由於存在緩衝池的大小限制和網速的不均勻會造成一次讀的操作放入快...
處理tcp粘包問題
tcp是位元組流,無邊界,udp是訊息,是有邊界的。就是udp返回的就是乙個訊息。所以tcp會產生粘包問題。如何解決粘包問題,所以我們要在應用層維護訊息與訊息的邊界。比如說定長包,包尾加 r n ftp 包頭加包體長度,更複雜的應用層協議。readn接受確切資料的讀操作 cli include in...
socket中tcp的斷包 粘包處理方法
socket中tcp的斷包和粘包都是tcp協議中出現的問題。乙太網中存在乙個對於幀的有效資料大小的限制,即mtu,乙太網的mtu為1500位元組。所謂斷包的意思就是說傳送端一次傳送的訊息長度過大,如果超過了mtu,那麼ip會對其進行分片。在網路程式設計中,我們要避免出現ip分片,那麼為什麼要避免呢?...