本人最近在用Java做TCP斷連接收發報文的應用,使用了第三方的Netty包,目前遇到一個很奇怪的問題,因為對TCP協議不是非常熟悉,所以感覺有些迷惑,希望得到大家的幫助!具體情況如下:
1. 我方做為Client發送報文到Server,Server會進行應答,對方報文分兩部分:Len(4位元組)和Body
2. 我方在channelRead只會收到Len,然后就會觸發channelReadComplete,從而導致無法收到Body
3. 我方用tcpdump抓包,發現收到的資料順序是:Len(4位元組)、FIN、Body,具體見下圖1
4. 對方用tcpdump抓包,發現發送的順序是正常的:Len(4位元組)、Body、FIN,具體見下圖2
我的疑問是:TCP的包順序不是網路協議層處理的嗎?應用層面怎么會出現不一致的情況呢?是Netty需要特別設定嗎?不應該吧?
uj5u.com熱心網友回復:
因為Server端不是我方開發,也不可能為我們調整代碼,否則我們還可以人為約定協議。所以,如果發過來的順序是亂的,那不是亂套了?請大家指點,謝謝!uj5u.com熱心網友回復:
是TCP協議的問題嗎?還是Netty的問題呢?請熟悉不吝指教,非常感謝!uj5u.com熱心網友回復:
是否考慮過位元組序的關系。java 是大端的,發過來的資料是大端還是小端。uj5u.com熱心網友回復:
@Drunkard2000 非常感謝你的回復,按我的理解(或許不正確):大端與小端應該只會影響一個包資料接收后的正確與否,應該不會影響包的收發順序錯亂吧?是這樣嗎?謝謝!uj5u.com熱心網友回復:
確定收到的Len是正確的么?TCP是流式的,先后順序應該是沒問題的
是否是因為應用層檢查Len<=0,從而觸發channelReadComplete事件
uj5u.com熱心網友回復:
@Drunkard2000 收到的Len是對的,但因為收到FIN從而導致Netty自動觸發channelReadComplete事件,應用層沒有做Len<=0的處理(也沒有機會做)。所以很奇怪呢!轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/106673.html
標籤:網絡協議與配置
上一篇:新手的新奇特問題,VLAN內,VLAN間主機都不能通信,各位大大進來幫看看
下一篇:異步一致性問題
