- 浏览: 246291 次
-
文章分类
最新评论
Nagle 算法
引自http://blog.163.com/li_xiang1102/blog/static/607140762011111103213616/
1. Nagel算法
TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
Nagle算法只允许一个未被ACK的包存在于网络,它并不管包的大小,因此它事实上就是一个扩展的停-等协议,只不过它是基于包停-等的,而不是基于字节停-等的。Nagle算法完全由TCP协议的ACK机制决定,这会带来一些问题,比如如果对端ACK回复很快的话,Nagle事实上不会拼接太多的数据包,虽然避免了网络拥塞,网络总体的利用率依然很低。
Nagle算法是silly window syndrome(SWS)预防算法的一个半集。SWS算法预防发送少量的数据,Nagle算法是其在发送方的实现,而接收方要做的时不要通告缓冲空间的很小增长,不通知小窗口,除非缓冲区空间有显著的增长。这里显著的增长定义为完全大小的段(MSS)或增长到大于最大窗口的一半。
注意:BSD的实现是允许在空闲链接上发送大的写操作剩下的最后的小段,也就是说,当超过1个MSS数据发送时,内核先依次发送完n个MSS的数据包,然后再发送尾部的小数据包,其间不再延时等待。(假设网络不阻塞且接收窗口足够大)
举个例子,比如之前的blog中的实验,一开始client端调用socket的write操作将一个int型数据(称为A块)写入到网络中,由于此时连接是空闲的(也就是说还没有未被确认的小段),因此这个int型数据会被马上发送到server端,接着,client端又调用write操作写入‘\r\n’(简称B块),这个时候,A块的ACK没有返回,所以可以认为已经存在了一个未被确认的小段,所以B块没有立即被发送,一直等待A块的ACK收到(大概40ms之后),B块才被发送。整个过程如图所示:
这里还隐藏了一个问题,就是A块数据的ACK为什么40ms之后才收到?这是因为TCP/IP中不仅仅有nagle算法,还有一个TCP确认延迟机制 。当Server端收到数据之后,它并不会马上向client端发送ACK,而是会将ACK的发送延迟一段时间(假设为t),它希望在t时间内server端会向client端发送应答数据,这样ACK就能够和应答数据一起发送,就像是应答数据捎带着ACK过去。在我之前的时间中,t大概就是40ms。这就解释了为什么'\r\n'(B块)总是在A块之后40ms才发出。
当然,TCP确认延迟40ms并不是一直不变的,TCP连接的延迟确认时间一般初始化为最小值40ms,随后根据连接的重传超时时间(RTO)、上次收到数据包与本次接收数据包的时间间隔等参数进行不断调整。另外可以通过设置TCP_QUICKACK选项来取消确认延迟。
关于TCP确认延迟的详细介绍可参考:http://blog.csdn.net/turkeyzhou/article/details/6764389
2. TCP_NODELAY 选项
默认情况下,发送数据采用Negale 算法。这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Negale 算法。
此时,应用程序向内核递交的每个数据包都会立即发送出去。需要注意的是,虽然禁止了Negale 算法,但网络的传输仍然受到TCP确认延迟机制的影响。
3. TCP_CORK 选项
所谓的CORK就是塞子的意思,形象地理解就是用CORK将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去。设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据(不可能让数据一直等待吧)。
然而,TCP_CORK的实现可能并不像你想象的那么完美,CORK并不会将连接完全塞住。内核其实并不知道应用层到底什么时候会发送第二批数据用于和第一批数据拼接以达到MTU的大小,因此内核会给出一个时间限制,在该时间内没有拼接成一个大包(努力接近MTU)的话,内核就会无条件发送。也就是说若应用层程序发送小包数据的间隔不够短时,TCP_CORK就没有一点作用,反而失去了数据的实时性(每个小包数据都会延时一定时间再发送)。
4. Nagle算法与CORK算法区别
Nagle算法和CORK算法非常类似,但是它们的着眼点不一样,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。如此看来这二者在避免发送小包上是一致的,在用户控制的层面上,Nagle算法完全不受用户socket的控制,你只能简单的设置TCP_NODELAY而禁用它,CORK算法同样也是通过设置或者清除TCP_CORK使能或者禁用之,然而Nagle算法关心的是网络拥塞问题,只要所有的ACK回来则发包,而CORK算法却可以关心内容,在前后数据包发送间隔很短的前提下(很重要,否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。
引自http://blog.163.com/li_xiang1102/blog/static/607140762011111103213616/
1. Nagel算法
TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
Nagle算法只允许一个未被ACK的包存在于网络,它并不管包的大小,因此它事实上就是一个扩展的停-等协议,只不过它是基于包停-等的,而不是基于字节停-等的。Nagle算法完全由TCP协议的ACK机制决定,这会带来一些问题,比如如果对端ACK回复很快的话,Nagle事实上不会拼接太多的数据包,虽然避免了网络拥塞,网络总体的利用率依然很低。
Nagle算法是silly window syndrome(SWS)预防算法的一个半集。SWS算法预防发送少量的数据,Nagle算法是其在发送方的实现,而接收方要做的时不要通告缓冲空间的很小增长,不通知小窗口,除非缓冲区空间有显著的增长。这里显著的增长定义为完全大小的段(MSS)或增长到大于最大窗口的一半。
注意:BSD的实现是允许在空闲链接上发送大的写操作剩下的最后的小段,也就是说,当超过1个MSS数据发送时,内核先依次发送完n个MSS的数据包,然后再发送尾部的小数据包,其间不再延时等待。(假设网络不阻塞且接收窗口足够大)
举个例子,比如之前的blog中的实验,一开始client端调用socket的write操作将一个int型数据(称为A块)写入到网络中,由于此时连接是空闲的(也就是说还没有未被确认的小段),因此这个int型数据会被马上发送到server端,接着,client端又调用write操作写入‘\r\n’(简称B块),这个时候,A块的ACK没有返回,所以可以认为已经存在了一个未被确认的小段,所以B块没有立即被发送,一直等待A块的ACK收到(大概40ms之后),B块才被发送。整个过程如图所示:
这里还隐藏了一个问题,就是A块数据的ACK为什么40ms之后才收到?这是因为TCP/IP中不仅仅有nagle算法,还有一个TCP确认延迟机制 。当Server端收到数据之后,它并不会马上向client端发送ACK,而是会将ACK的发送延迟一段时间(假设为t),它希望在t时间内server端会向client端发送应答数据,这样ACK就能够和应答数据一起发送,就像是应答数据捎带着ACK过去。在我之前的时间中,t大概就是40ms。这就解释了为什么'\r\n'(B块)总是在A块之后40ms才发出。
当然,TCP确认延迟40ms并不是一直不变的,TCP连接的延迟确认时间一般初始化为最小值40ms,随后根据连接的重传超时时间(RTO)、上次收到数据包与本次接收数据包的时间间隔等参数进行不断调整。另外可以通过设置TCP_QUICKACK选项来取消确认延迟。
关于TCP确认延迟的详细介绍可参考:http://blog.csdn.net/turkeyzhou/article/details/6764389
2. TCP_NODELAY 选项
默认情况下,发送数据采用Negale 算法。这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Negale 算法。
此时,应用程序向内核递交的每个数据包都会立即发送出去。需要注意的是,虽然禁止了Negale 算法,但网络的传输仍然受到TCP确认延迟机制的影响。
3. TCP_CORK 选项
所谓的CORK就是塞子的意思,形象地理解就是用CORK将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去。设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据(不可能让数据一直等待吧)。
然而,TCP_CORK的实现可能并不像你想象的那么完美,CORK并不会将连接完全塞住。内核其实并不知道应用层到底什么时候会发送第二批数据用于和第一批数据拼接以达到MTU的大小,因此内核会给出一个时间限制,在该时间内没有拼接成一个大包(努力接近MTU)的话,内核就会无条件发送。也就是说若应用层程序发送小包数据的间隔不够短时,TCP_CORK就没有一点作用,反而失去了数据的实时性(每个小包数据都会延时一定时间再发送)。
4. Nagle算法与CORK算法区别
Nagle算法和CORK算法非常类似,但是它们的着眼点不一样,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。如此看来这二者在避免发送小包上是一致的,在用户控制的层面上,Nagle算法完全不受用户socket的控制,你只能简单的设置TCP_NODELAY而禁用它,CORK算法同样也是通过设置或者清除TCP_CORK使能或者禁用之,然而Nagle算法关心的是网络拥塞问题,只要所有的ACK回来则发包,而CORK算法却可以关心内容,在前后数据包发送间隔很短的前提下(很重要,否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。
发表评论
-
mac svn版本
2014-11-14 15:21 870http://xiayong.blog.51cto.com ... -
lucene索引结构比较好得博客
2014-11-03 21:16 648http://www.cnblogs.com/forfutur ... -
lucene再64位系统上使用MMapDirectory
2014-11-03 20:18 2106引子http://www.cnblogs.com/huang ... -
mvn发布单个文件
2014-10-31 15:38 649由于平时我们开发都是一个大项目中包含几个子项目,需要depl ... -
使用 ObjectOutputStream 可能引起的内存泄漏
2014-10-30 17:14 1469场景,线上堆栈10G,平时内存使用达到8个G而 ... -
CMS GC时出现promotion failed和concurrent mode failure
2014-10-29 23:44 839对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中 ... -
jboss发布war
2014-10-23 13:09 744http://www.blogjava.net/hello-y ... -
netty学习blog
2014-10-09 16:04 628http://www.infoq.com/cn/article ... -
java多线程
2014-10-08 13:37 618http://www.cnblogs.com/skywang1 ... -
volatile和重排序得一些小疑问
2014-09-24 15:38 1628http://yeziwang.iteye.com/blog ... -
内存映射文件
2014-09-19 11:09 731简介: 内存映射文件与虚拟内存有些类 ... -
心跳机制 heartbeat
2014-08-05 23:13 1815心跳机制可以分为集中式和分散式,简单说集中式 ... -
一个性能瓶颈分析的过程
2014-07-29 16:19 543引自http://blog.csdn.net/axm ... -
zip gzip
2014-07-29 15:09 610http://www.differencebetween. ... -
mvn expected: CRLF
2014-07-03 14:36 782Checkstyle error is not severe ... -
git远程分支更新
2013-10-09 16:44 888git remote prune origin清理掉远程不存 ... -
关于synchronized一个字符串的问题
2013-07-25 11:12 6296在memcached中我们公司首先根据查询条件获得key,然 ... -
php树型无限级分类结构[预排序遍历树算法]
2013-07-22 18:22 888预排序遍历树算法 modi ... -
linux下打开class文件
2013-03-04 20:22 2445linux下打开class文件 hexdump -C *.cl ... -
对象分配规则
2013-02-27 14:03 861对象分配规则 1.对象优先分配在Eden区,如果Eden区 ...
相关推荐
此外,还可以结合其他定位技术如时间到达(Time of Arrival, TOA)、时间差到达(Time Difference of Arrival, TDOA)或角度测量(Angle of Arrival, AoA)等,实现更精确的三维定位。 总之,本资源提供的MATLAB...
"angle155 growhze"可能是指特定的算法或者研究角度,而"块体"在此指的是将矿山划分为若干个具有相似地质特性的单元,以便于管理和分析。"优化算法"则是用于解决如何最佳地组合这些块体以实现最大经济效益的方法。 ...
此压缩包"**spectraMatch.rar**"提供了多种光谱匹配算法的实现,主要针对MATLAB环境,对于理解和应用光谱分析具有极大的帮助。下面将详细解释其中涉及的主要知识点: 1. **光谱角度匹配(Spectral Angle Matcher, ...
PID算法详解 从标题“最常用的PID算法”和描述“5中最常用的PID算法,帮助你了解、认识PID控制”中,我们可以了解到PID算法的重要性和应用场景。PID算法是指比例积分微分算法,是一种广泛应用于自动控制领域的算法...
3. 基于到达角度的定位算法:AOA(Angle Of Arrival),通过测量信号入射角来定位。 4. 混合型定位算法:结合了以上几种方法,例如,利用RSSI估计粗略距离,再结合TOA或TDOA进行精确计算。 5. 高级算法:可能包括...
MATLAB程序"contact_angle.m"可能包含了其中的一种或多种算法。这些模型可以用来推算固体的表面能,从而为材料设计、涂层优化等领域提供理论支持。例如,Young-Laplace方程通过接触角计算表面能,而Owens-Wendt模型...
例如,通过计算公式vernier_angle_out = vernier_angle - 302808,并将数值除以409.2得到最终的角度值。 6. 转速差计算:算法中涉及到转速差的计算,以及基于转速差判断结果的可信度。例如,通过计算vd_nominal与vd...
CHAN、Taylor和AOA(Angle of Arrival)是三种常见的定位算法,它们各有特点,适用于不同的应用场景。下面将详细介绍这三种算法及其基本原理。 首先,CHAN算法,也称为Chan-Van Vleck定位算法,是一种基于多基站...
"基于A*算法与Dijkstra算法的路径规划仿真对比:MATLAB代码实现及运行结果分析",基于Dijkstra算法与A*算法的路径规划仿真:算法性能对比与MATLAB代码实现,基于A*算法 、 Dijkstr算法对比的路径规划仿真 路径规划算法...
角度和时延联合估计(Joint Angle and Delay Estimation, 简称JADE)是一种在信号处理领域中广泛使用的算法,特别是在多输入多输出(MIMO)通信系统、雷达信号处理以及声源定位等场景中。JADE算法的核心是利用阵列...
AOA(Angle of Arrival)定位算法,也称为到达角定位技术,是无线通信领域中用于确定信号源位置的一种重要方法。在无线传感器网络(Wireless Sensor Networks, WSNs)或者移动通信系统中,AOA算法通过测量信号到达...
### 游标算法详解 #### 一、引言 在现代电子控制系统中,尤其是在汽车行业中,精确的角度测量对于实现各种安全关键系统至关重要。本篇旨在深入解析“游标算法”这一核心概念及其应用实例,通过分析给定伪代码示例,...
在给定的文件中,`EKF_angle.asv`可能包含了EKF应用于角度跟踪的特定参数或者仿真结果,而`EKF_angle.m`很可能是MATLAB编写的EKF算法实现代码。在MATLAB中,`.m`文件通常用于编写函数或脚本。 **四、EKF的优缺点** ...
基于Dijkstra与A*算法的路径规划仿真对比研究:MATLAB代码实现与结果分析,基于A*算法 、 Dijkstr算法对比的路径规划仿真 路径规划算法,MATLAB代码 运行结果如下: Dijkst算法规划时间 历时 0.083264 秒。 Dijkst...
在这个C++实践中,`angle.cpp`很可能是实现这个算法的主要源代码文件,它可能包含了定义点类、计算向量叉积、判断点是否在多边形内的函数等核心逻辑。而`allin.exe`则是一个编译后的可执行文件,用户可以通过运行它...
在MATLAB环境中,`angle`函数是一个非常重要的工具,它用于计算复数的幅角,即相位信息。这个函数在各种科学计算和工程...这个过程不仅可以提升开发者在数值计算领域的技能,也是跨平台移植和优化算法的一个实际案例。
这个压缩包包含的源代码提供了势场算法的具体实现,主要由四个文件组成:main.m、compute_repulsion.m、compute_angle.m和compute_Attract.m。 主文件`main.m`通常是整个程序的入口,负责调用其他函数,设置初始...
传统 MUSIC 算法是信号处理领域中的一种常用算法,用于估计信号的方向arrival angle。该算法通过将阵列信号分解为噪声子空间和信号子空间,来估计信号的方向arrival angle。在这个实现中,我们使用 MATLAB 语言来...
老生谈算法:用CZT求解系统函数的零极点 在信号处理中,了解系统函数的零极点是非常重要的,因为它们决定了系统的稳定性和频率响应。然而,在实际应用中,系统函数的零极点通常是非常难以计算的,尤其是当系统函数...
projection_matrix = build_projection_matrix(angle, detector); % 设置迭代参数 max_iterations = 100; error_threshold = 1e-5; for i = 1:max_iterations % 预测步 predicted_projections = projection_...