接收端接收緩衝區滿後,傳送端會收到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的探針包沒看到有帶應用資料的。
接收端接收緩衝區滿後,傳送端會收到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的探針包沒看到有帶應用資料的。