背景
TCP/IP
协议是当前网络时代的基础,所有的网络产品,或者是开发语言、开发框架都是基于tcp/ip
协议的,所以说,学好tcp/ip
对个人以后从事互联网行业会有巨大的帮助。
但是这是一个基础理论课程,就像操作系统这门课一样,学完之后可能不会对你产生太大的影响,不会让你立马拥有能够投入工作中的技能。但正是因为这是一个基础理论课,所有的互联网技术都是基于它的。所以如果你了解tcp/ip
协议,将会对你未来发展或者在工作中排查问题产生积极的作用。
Nagle算法
试想这样一个场景,发送端不停地给接收端发很小的包,一次只发1
个字节,那么发送1000
字节需要发1000
次。这种频繁的发送是存在问题的,不光是传输时延消耗,发送和确认本身也是需要消耗时间的,频繁的发送接收带来了巨大的时延。
Nagle
算法就是为了解决上述的情况,具体规则如下:
- 当第一次发送数据时不用等待,就算是
1
字节的包也立即发送 - 后面发送需要满足下面条件
Nagle
要求,一个tcp
连接最多只能有1
个未被确认的未完成小分组,在该分组确认到达之前,不能发送其他小分组。
注意:
Nagle
算法针对于发送端
延迟确认
试想这样一个场景,当我收到了发送端的一个包,然后在极短的时间内又收到了第二个包,那我是一个个回复,还是稍微等一下,把2
个ACK
合并之后一起回复呢?
延迟确认(delayed ack
)所做的事情就是后者,稍稍延迟,然后合并ACK
,最后回复给发送端。tcp
要求这个延迟的时间必须小于500ms
,一半的操作系统实现都不会超过200ms
但是有些场景不能延迟确认,必须马上回复。如下:
- 接收到一个大于
frame
的报文,且需要调整窗口大小 tcp
处于quick ack
模式(tcp_in_quickack_mode
设置)- 发现乱序包
注意:
- 延迟确认针对的是接收端
Nagle
算法和延迟确认不建议一起使用,因为会造成更大的延迟
总结
这是tcp/ip系列的第十篇,主要讲解了Nagle算法
和延迟确认
,两者均为理论知识,只需了解下有这个即可。后面还有更深入、更多使用的场景讲解,这个系列的文章会很长。
开始下一篇吧。