發送字節和接收字節是什么意思?
接收端接收緩沖區滿后,發送端會收到0 win并啟動persist timer,當persist timer過期后,發送端會發探針包試探接收端的接收窗口還是不是0。在0 win期間,接收端應用從緩沖區中讀出256字節消費掉,persist timer再次過期后,發送端會發送1個字節過來,接收端因為當前接收緩沖區已經有256字節的可用空間了,完全可以接收這1個字節,所以就確認了這1個字節。但是因為接收緩沖區沒有滿足一定的條件,所以0 win還沒有解除。這段描述應該是這個意思!
回到題主的疑惑,這1個字節被ACK了,是不是會被應用讀取?會的!這個字節是業務數據,應用程序真正需要的,缺1字節就不完整的。只是因為在tcp傳輸這1個字節時趕上了接收端的0 win,導致他作為探針發送過去的!------------------------------------------------------------------------------------------
有點奇怪,我在我的機器上并沒有模擬出來這種情況:
1:服務端接收緩沖設置為1024,客戶端發送2000個字節,導致了0 win。
2:在0 win期間,服務端recv了1151個字節,當定時器過期后,發送探針包,依然還是0 win。
3:服務端把剩下那一個字節消費掉,通知發送端,0 win狀態解除了。
我的機器是centos 7.6,發送端0 win的探針包沒看到有帶應用數據的。