問題:
客戶端需要發送2062位元組資料,然后從服務器讀取回應。
通過wireshark抓包,資料分成了1460位元組和602位元組兩段發送。
如圖所示:發送第一段1460位元組后,服務器等待40ms后才發送ACK;客戶端也是收到ACK后才發送第二段的602位元組。

現象看起來跟Nalge演算法和ACK延遲確認機制相符。客戶端發送的第一段資料大小滿足MSS,立即發送。服務器收到后因為要等待接收剩下的602個位元組,所以沒有發送回應資料,也就不能攜帶ACK,導致ACK延遲。客戶端第二段602位元組資料因為第一段資料沒有確認而被延遲發送,直到40ms后收到ACK。
于是,客戶端參照網上的教程設定了TCP_NODELAY選項:
int flag = 1;
result = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
服務器在每次recv后設定TCP_QUICKACK選項:
int quickack = 1;
result = setsockopt(sockset[socknr].sockfd, IPPROTO_TCP, TCP_QUICKACK, &quickack, sizeof(int));
然而測驗結果并沒有發生變化,是不是還有其他因素影響?
uj5u.com熱心網友回復:
等待大神,學習一下感覺這里面涉及太多:物理鏈路、網卡驅動、協議堆疊、資料的拷貝和搬運等等...
uj5u.com熱心網友回復:
兩邊都設定一下轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43798.html
標籤:網絡通信
上一篇:手動創建3G撥號 請大佬指教
下一篇:關于Link Layer的習題
