linux tcp cork,在此用例中,TCP_CORK和TCP_NODELAY是否有显着差异?
在寫完關于TCP_NODELAY和TCP_CORK的答案之后,我意識到我必須缺少對TCP_CORK的要點的了解,因為我尚不清楚100%為何Linux開發人員認為有必要引入一個新的TCP_CORK標志,而不是僅僅依靠應用程序在適當的時間設置或清除現有的TCP_NODELAY標志。
特別是,如果我有一個Linux應用程序想要通過TCP流send()一些小/非連續的數據片段,而無需支付200mS
Nagle延遲稅,同時將發送所需的數據包數量減到最少它,我可以通過以下兩種方式之一進行操作:
使用TCP_CORK(偽代碼):
int optval = 1;
setsockopt(sk, SOL_TCP, TCP_CORK, &optval, sizeof(int)); // put a cork in it
send(sk, ..);
send(sk, ..);
send(sk, ..);
optval = 0;
setsockopt(sk, SOL_TCP, TCP_CORK, &optval, sizeof(int)); // release the cork
或使用TCP_NODELAY(偽代碼):
int optval = 0;
setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)); // turn on Nagle's
send(sk, ..);
send(sk, ..);
send(sk, ..);
optval = 1;
setsockopt(sk, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(int)); // turn Nagle's back off
多年來,我一直在使用后一種技術,并且效果很好,它的好處是還可以移植到非Linux操作系統(盡管在Linux外部,您必須在關閉Nagle的關閉后再次調用send())以確保立即發送數據包并避免Nagle延遲-
send()為零字節就足夠了)。
現在,Linux開發人員很聰明,所以我懷疑他們對TCP_NODELAY的上述使用從未發生過。他們一定有某種理由感到不足,這導致他們引入了新的專有TCP_CORK標志。誰能解釋這個原因是什么?
總結
以上是生活随笔為你收集整理的linux tcp cork,在此用例中,TCP_CORK和TCP_NODELAY是否有显着差异?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 12 sqlplus 使用
- 下一篇: JAVA物体运动检测_基于OpenCv的