tcp数据传输分为两种:
-
交互数据传输
交互数据就是发送控制命令的数据流,如telnet、ftp等;利用Nagle算法与delay-ack进行拥塞避免
-
块数据传输
块数据是用来发送控制命令的包;利用滑动窗口进行流控、利用“慢启动与拥塞避免算法、快速重传算法”进行拥塞避免
为何Nagle算法和delay-ack可以使交互数据避免拥塞
交互数据流属于多而小的数据流,如果是在局域网内则没什么问题,但如果是在广域网上,时刻充斥着大量TCP小分组,那么可能会造成网络的拥塞。此二算法就是为了减少TCP小分组而产生的,目的即是为了提高网络效率。
Nagle算法
Nagle要求一个TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他小分组。TCP会搜集这些小的分组,然后在之前小分组的确认到达后将刚才搜集的小分组合并发送出去。
该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发送的越快;而在希望减少微小分组数目的低速广域网上,则会发送更少的分组。
当然,有些时候是需要禁用Nagle算法的,如远程连接时的鼠标移动操作
delay-ack
通常Server在接收到从Client发送过来的数据时,并不马上发送ACK,而是等一个规定时延,看看本机是否有数据要反馈给Client,如果有,就将数据包含在此ACK包中,以前发送给Client。一般情况下这个时延为200ms。
好处:
- 避免糊涂窗口综合症
- 捎带ack,减少小分组
当Nagle遇上延迟ACK
试想:通过多个写小片数据向对端发送单个逻辑的操作,两次写数据长度小于MSS,当第一次写数据到达对端后,对端延迟ack,不发送ack,而本端因为要发送的数据长度小于MSS,所以nagle算法起作用,数据并不会立即发送,而是等待对端发送的第一次数据确认ack;这样的情况下,需要等待对端超时发送ack,然后本段才能发送第二次写的数据,从而造成延迟;
网友评论