欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

TCP_NODELAY 和 TCP_CORK主要区别 有大用

TCP_NODELAY 和 TCP_CORK主要区别

一句话总结:

tcp_nodelay:禁止nagle算法,有需要发送的就立即发送,比较常见

tcp_cork:它是一种加强的nagle算法,过程和nagle算法类似,都是累计数据然后发送。但它没有 nagle中1的限制,所以,在设置cork后,即使所有ack都已经收到,但我还是不想发送数据,我还想继续等待应用层更多的数据,所以它的效果比nagle更好。效率上与Nagle算法相比,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小

 

tcp_cork使用方法

 

int on = 1; 
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 设置cork */ 
write (fd, …); 
...
sendfile (fd, …); 
… 
on = 0; 
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 拔去塞子 ,发送数据*/ 


来自   https://www.cnblogs.com/biyeymyhjob/p/4670502.html


tcp 选项

古则
字数 23阅读 240

TCP_QUICKACK选项来取消确认延迟
TCP_NODELAY选项可以禁止Negale 算法
TCP_CORK 选项

 所谓的CORK就是塞子的意思,形象地理解就是用CORK将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去。
设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认)
,内核仍然没有组合成一个MTU时也必须发送现有的数据(不可能让数据一直等待吧)。    然而,TCP_CORK的实现可能并不像你想象的那么完美,CORK并不会将连接完全塞住。
内核其实并不知道应用层到底什么时候会发送第二批数据用于和第一批数据拼接以达到MTU的大小,
因此内核会给出一个时间限制,在该时间内没有拼接成一个大包(努力接近MTU)的话,内核就会无条件发送。
也就是说若应用层程序发送小包数据的间隔不够短时,TCP_CORK就没有一点作用,反而失去了数据的实时性(每个小包数据都会延时一定时间再发送)。

来自  https://www.jianshu.com/p/d4c72ad0fc5f

普通分类: