2011-09-02 78 views
11

如果您在套接字上的每次調用中設置了TCP_QUICKACK設置,並且之前設置了TCP_NODELAY,那麼QUICKACK選項是否會覆蓋NODELAY調用?Set TCP_QUICKACK and TCP_NODELAY

在連接:

int i = 1; 
setsockopt(iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i)); 

在每次寫:

int i = 1; 
setsockopt(iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i)); 

將調用TCP_QUICKACK空上一次調用TCP_NODELAY?

+0

當你這樣做,和監控使用類似Wireshark的行爲發生了什麼事? –

+2

使用getsockopt,我已驗證TCP_QUICKACK不會覆蓋TCP_NODELAY。 – donalmg

+0

你爲什麼每次都寫這個?爲每個收到的數據包發送一個ACK,所以在每次recv之後應該設置TCP_QUICKACK,或者我缺少某些東西 –

回答

11

這兩個選項之間沒有直接的關係,它們只是爲了不同的目的。

TCP_NODELAY旨在禁用/啓用段緩衝,因此數據可以儘快發送到對等,因此通常用於提高網絡利用率。 TCP_QUICKACK用於在某些協議級別交換時儘可能早地發送確認,並且它不是穩定/永久的,隨後的TCP事務(可能發生在引擎蓋下)可以根據實際的協議級別處理忽略此選項或用戶設置和堆棧行爲之間的任何實際分歧。

注意TCP_NODELAY是便攜式,而TCP_QUICKACK不是(只適用於Linux 2.4.4+)。

1

TCP_QUICKACK和TCP_NODELAY影響TCP中的不同操作。 tcp(7)手冊頁描述了互相干擾的TCP的哪些套接字選項,例如, TCP_CORK和TCP_NODELAY。

3

使用TCP_QUICKACK,不TCP_NODELAY

打開TCP_NODELAY具有類似的效果,但可以使吞吐量 壞爲小型寫入。如果寫一個循環向「write()」的套接字發送幾個字節(最壞情況,一個字節),並且使用TCP_NODELAY禁用Nagle 算法,則每個寫入將成爲一個IP 數據包。這將流量增加40倍,每個有效負載的IP和TCP標頭爲 。除非您有足夠的數據填充最大大小的數據包,否則防止Tinygram將不會讓您發送 第二個數據包(如果您有一個數據包在飛行中)。它累計一個週期的字節數 行程時間,然後發送隊列中的所有內容。這幾乎總是 你想要的。如果你設置了TCP_NODELAY,你需要知道更多的緩衝和沖洗問題。這對於大量的 單向傳輸來說都不重要,它是當今最流行的HTTP。 (我從來沒有看過 對SSL握手的影響,它可能很重要。)短版 版本:set TCP_QUICKACK。如果你發現一個事情會讓事情變得更糟,請告訴我。約翰·納格

https://news.ycombinator.com/item?id=10608356

相關問題