https://blog.youkuaiyun.com/mijichui2153/article/details/81356115
SOL_TCP, TCP_CORK 的头文件:#include <netinet/tcp.h>
CORK选项提高了网络的利用率,因为它直接禁止了小包的发送。
Nagle算法没有禁止小包发送,只是禁止了大量小包的发送。
如果把tcp当成服务端与客户端的管道,cork 就是给管道加个塞子。
为什么 要加个塞子呢?
先来举个例子:
int times = 10;
while( times–)
{
send( sock_fd, buf, 1, 0 )
}
这段program会发送数据10次,每次就发送1个字节,这样会不会什么问题呢?
记得以前农忙的时候,田里的稻子收割完了,要打成稻谷,就放一个打稻机子,父亲在机子旁打稻,而我则负责抱起稻子送给他。父亲打稻的速度很快,很小的时候我每次只抱一捆稻子,就会不停 地奔跑,很忙很累。。。等我稍大一点,能一次抱几捆的时候绝不会只抱一捆,这个道理是不是很浅显。
话说回来,如果发送数据的包很小,而次数又很多,网络也会很累,这个累也有学名的,叫网络拥塞。
我们需要将稻子收集多一点再送,意思就是将网络包整大一点,怎么做到 呢?
当包很小的时候先停一停,等到 一定的数量的包产生了再一起发,是不是有点像给水流管道加个塞子塞住,等水够多的时候才放出,其实我觉得更像一个水闸,什么时候放水由闸门开关决定。
上面的代码稍改一下:
int times = 10;
int on = 1;
setsockopt ( sock_fd, SOL_TCP, TCP_CORK, &on, sizeof (on));
while( times–)
{
send( sock_fd, buf, 1, 0 )
}
on = 0;
setsockopt ( sock_fd, SOL_TCP, TCP_CORK, &on, sizeof (on));
2-3行相当于塞上塞子(关掉闸门),4-7行相当于收集更多的水,8-9行相当于拨去塞子(打开闸门),这样就解决了网络拥塞的问题。
后面的学习我们会发现第9行其实有时候可以省掉。。。