TCP_NODELAY和TCP_CORK nagle算法和cork算法
TCP_NODELAY
TCP_CORK
所谓的CORK就是塞子的意思,形象地理解就是用CORK将连接塞住。使得数据先不发出去,等到拔去塞子后再发出去。设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去。当然若一定时间后(一般为200ms,该值尚待确认)。内核仍然没有组合成一个MTU时也必须发送现有的数据(不可能让数据一直等待吧)。
然而。TCP_CORK的实现可能并不像你想象的那么完美。CORK并不会将连接全然塞住。
内核事实上并不知道应用层究竟什么时候会发送第二批数据用于和第一批数据拼接以达到MTU的大小,因此内核会给出一个时间限制。在该时间内没有拼接成一个大包(努力接近MTU)的话。内核就会无条件发送。
也就是说若应用层程序发送小包数据的间隔不够短时。TCP_CORK就没有一点作用,反而失去了数据的实时性(每一个小包数据都会延时一定时间再发送)。
Nagle算法
为了尽可能的利用网络带宽。TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS參数。因此,TCP/IP希望每次都可以以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着很多小数据块。
Nagle算法的基本定义是随意时刻,最多仅仅能有一个未被确认的小段。
所谓“小段”。指的是小于MSS尺寸的数据块,所谓“未被确认”。是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
Nagle算法的规则(可參考tcp_output.c文件中tcp_nagle_check函数凝视):
Nagle算法仅仅同意一个未被ACK的包存在于网络,它并无论包的大小。因此它其实就是一个扩展的停-等协议,仅仅只是它是基于包停-等的,而不是基于字节停-等的。Nagle算法全然由TCP协议的ACK机制决定。这会带来一些问题。比方假设对端ACK回复非常快的话。Nagle其实不会拼接太多的数据包。尽管避免了网络拥塞。网络整体的利用率依旧非常低。
注意:BSD的实现是同意在空暇链接上发送大的写操作剩下的最后的小段,也就是说,当超过1个MSS数据发送时。内核先依次发送完n个MSS的数据包,然后再发送尾部的小数据包。其间不再延时等待。(如果网络不堵塞且接收窗体足够大)
整个过程如图所看到的:
这就解释了为什么'\r\n'(B块)总是在A块之后40ms才发出。
当然,TCP确认延迟40ms并非一直不变的,TCP连接的延迟确认时间一般初始化为最小值40ms,随后依据连接的重传超时时间(RTO)、上次收到数据包与本次接收数据包的时间间隔等參数进行不断调整。
另外能够通过设置TCP_QUICKACK选项来取消确认延迟。
CORK算法
Nagle算法和CORK算法非常类似。可是它们的着眼点不一样,Nagle算法主要避免网络由于太多的小包(协议头的比例非常之大)而拥塞。而CORK算法则是为了提高网络的利用率,使得整体上协议头占用的比例尽可能的小。如此看来这二者在避免发送小包上是一致的,在用户控制的层面上。Nagle算法全然不受用户socket的控制,你仅仅能简单的设置TCP_NODELAY而禁用它,CORK算法相同也是通过设置或者清除TCP_CORK使能或者禁用之。然而Nagle算法关心的是网络拥塞问题,仅仅要全部的ACK回来则发包,而CORK算法却能够关心内容。在前后数据包发送间隔非常短的前提下(非常重要,否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也能够通过使能CORK算法将这些内容拼接在一个包内,假设此时用Nagle算法的话,则可能做不到这一点。
在JAVA编程中,能够通过Socket中的
setTcpNoDelay
public void setTcpNoDelay(boolean on)
throws SocketException
- 启用/禁用 TCP_NODELAY(启用/禁用 Nagle 算法)。
-
- 參数:
on- 为true表示启用 TCP_NODELAY;为false表示禁用。- 抛出:
SocketException- 假设底层协议出现错误,比如 TCP 错误。- 从下面版本号開始:
- JDK1.1
- 另请參见:
getTcpNoDelay()
来设置是否启用tcp_nodelay,提高网络吞吐量的同一时候必定减少了网络的实时性。
TCP_NODELAY和TCP_CORK nagle算法和cork算法的更多相关文章
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...
- 使用Apriori算法和FP-growth算法进行关联分析
系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论
一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...
- 用Spark学习FP Tree算法和PrefixSpan算法
在FP Tree算法原理总结和PrefixSpan算法原理总结中,我们对FP Tree和PrefixSpan这两种关联算法的原理做了总结,这里就从实践的角度介绍如何使用这两个算法.由于scikit-l ...
- 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)
字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...
- 最小生成树之Prim算法和Kruskal算法
最小生成树算法 一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决. Prim算法 ...
- java实现最小生成树的prim算法和kruskal算法
在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...
随机推荐
- 无聊的我写了一个代码 。。。P1605 迷宫
搜索水题 哎 直接不行了 . #include <ctype.h> #include <cstdio> void read(int &x) { x=;char ch=g ...
- parsley.js正确使用姿势
1.第一式 当然要先引用:parsley.js 2.第二式 页面中定义需要使用自定义校验,注意红色的地方,必须要使用小写,重要的问题说三遍,小写,小写 <form class="for ...
- Laravel Passport认证-多表、多字段解决方案
Laravel Passport认证-多表.多字段解决方案 2018年08月19日 09:31:01 醉卧码场君莫笑 阅读数:1632 1. 概述 API 通常使用令牌(token)进行认证并且在 ...
- CAD参数绘制直线(com接口)
用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...
- Asp.Net MVC中Controller、Action、View是如何激活调用的
上篇我们介绍了MVC的路由,知道在注册路由的时候会创建一个MvcHandler将其和Url规则一起放入到了RouteCollection中,之后请求通过UrlRoutingModule,根据当前的UR ...
- vue中的组件传值
组件关系可以分为父子组件通信.兄弟组件通信.跨级组件通信. 父传子 - props 子传父 - $emit 跨级可以用bus 父子双向 v-model 父链(this.$parent this.$ch ...
- [PyTorch] rnn,lstm,gru中输入输出维度
本文中的RNN泛指LSTM,GRU等等 CNN中和RNN中batchSize的默认位置是不同的. CNN中:batchsize的位置是position 0. RNN中:batchsize的位置是pos ...
- Python机器学习——Agglomerative层次聚类
层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构.AggregativeClustering是一种常用的层次聚类算法. 其原理是:最初将 ...
- [Python3网络爬虫开发实战] 1.3.2-Beautiful Soup的安装
Beautiful Soup是Python的一个HTML或XML的解析库,我们可以用它来方便地从网页中提取数据.它拥有强大的API和多样的解析方式,本节就来了解下它的安装方式. 1. 相关链接 官方文 ...
- PHP典型功能与Laravel5框架开发学习笔记
步骤一:PHP的Redis应用及HTTP协议 一.Redis初识 1.Linux下安装redis:具体看官网:https://redis.io/download:以下为以个人习惯的安装目录进行的red ...