TCP按照分组数量计算可以分为下面2类
- TCP交互数据流
- TCP成块数据里
前者用于交互命令产生的数据分组,如telnet和rlogin,特点是交给上层的应用数据少,但是又要为这个很少的数据封包,利用率不高
后者基本是满长度,如ftp、电子邮件等,所以利用率比前者高
TCP交互数据流
提高效率有如下方法
捎带ACK
比如rlogin需要远程服务器回显客户端输入的字符,不做处理的话会产生如下交互
- 来自客户端按键输入的字节
- 来自服务器的确认
- 来自服务器的按键字节回显
- 来自客户端的回显确认
注意是客户端每输入一个字节就会产生一个封包,即20字节IP头+20字节TCP头+1字节按键,这样利用率很低
捎带ACK就是把2.3步骤合并,变成如下交互
- 来自客户端按键输入的字节
- 来自服务器的按键字节回显和按键输入确认
- 来自客户端的回显确认
提高利用率
经受延时的确认,延时确认
是在上面的第2点,再做处理,即服务端收到客户端数据后,延时一段时间(大概40ms),查看这段时间内服务端有没有什么数据要发给客户端,有就把数据捎带上ACK一起发出去,否则就只发ACK
Nagle算法
任意时刻,最多只能有一个未被确认的小段。所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
比如要发送hello
给服务端,应用层虽然每次发送一个字节,连续发送5次,由于Nagle算法,ello
会被攒成一个包放在缓冲区,直到收到h
的ACK才会把ello
一起发出去,通过这样来提高利用率
Nagle算法的规则:
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送
TCP_NODELAY选项可以禁止Nagle 算法。
注:TCP的延时确认机制并不会导致发送数据的延时,只有在延时确认机制和Nagle算法共同作用下才会导致后续包(Nagle 算法攒起来包)的发送延时。