TCP报文段一般有两类,分别是成块数据和交互数据。
1.交互式输入
Rlogin连接上键入一个交互命令的数据流如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/045e61062f74f45ddc3aef18cc34cbf6.png)
每一个交互按键都会产生一个数据分组,每次从客户传到服务器的是一个字节的按键。而Rlogin需要远程系统回显客户键入的字符,这样就会产生4个报文段:
(1)来自客户的交互按键
(2)来自服务器的按键确认
(3)来自服务器的按键回显
(4)来自客户的按键回显确认
2.延时确认
通常TCP在接收到数据之后不会立即发送ACK,相反,它推迟发送,以便ACK和需要沿该方向发送的数据一起发送(捎带ACK)。绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一起发送。如果200ms之后依然没有等到发往对方的数据,则单独发送ACK。
如果定时器溢出时,TCP接收缓冲区中海油数据没有被应用层读取完,则返回报文段的窗口大小为初始窗口大小减去缓冲区的数据大小。
3.Nagle算法
一、介绍:
在Rlogin连接中,客户每次发送一个字节到服务器,产生一个41字节长的分组。在广域网上,这些小分组会增加拥塞出现的可能,降低网络的发送效率。可以采用Nagle算法解决这个问题。
该算法要求一个TCP连接上最多只能由一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。TCP收集这些少量的分组,并在确认到来时以一个分组的方式发送出去。该算法具有适应性,确认到达的越快,数据发送越快。
二、Nagle算法的规则: MSS-
最大报文段长度
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
三、关闭Nagle算法:
某些情况下,小消息必须无时延发送(例如鼠标移动),以便提供实时反馈,这时需要关闭Nagle算法。
4.窗口大小通告
TCP连接中,通告的窗口大小会因为缓冲区中的数据大小实时进行调整。