滑动窗口
对于每一个发送的数据段,都要给一个ACK确认应答,收到ACK后才可以发送下一个数据段,这样未免效率太差,所以TCP中引入了滑动窗口机制。
如上图所示,发送前4000字节数据的时候不需要收到任何回应,当收到一个ack后,滑动窗口就往后移动一个报文的长度,但是窗口大小是不变的
- 窗口大小指的就是无需等待回应就可以发送数据量的最大值,上图中的窗口大小就是4000字节
- 当发送完前4000字节的数据后,滑动窗口就开始等待ack,收到一个ack,就往后移动,开始发送5001-6000字节的数据
- 发送端的发送窗口大小受制于接收端接收窗口的大小和拥塞窗口的大小
- TCP的滑动窗口是动态变化的,随时通过本端的接收窗口大小控制来对对端的发送窗口(滑动窗口)流量进行限制
- 窗口越大,网络的吞吐量就越高
如果中间出现数据报丢失,该怎么样进行重传呢?
- 如果是某个ack报文丢失了就很简单,因为会有后续的回应来表明之前的数据都被接收到了,比如2001的确认应答丢了,但是主机A后续收到了4001的确认应答,就表明4001前的数据全发送成功了,其中包括2001之前的数据
- 如果是发送的数据段丢失了就会进行重传
快重传
- 如果发送端一次性发送了多个数据段,而其中有一个或几个片段丢失了,
- 接收端虽然收到了之后的报文,但为了保证数据段的按序到达,还是会从断点处发送ACK,这时接收端就会发送多个相同的ACK,
- 发送端在收到3个同样的重复确认应答后,就会对相应报文立即重传,而不必等待超时重传的计时器超时
- 接收端收到丢失的中间数据段时,会从收到最后的按序到达的报文出发送确认应答,而不是从断点处之后的报文都回应一次
延迟应答
如果接收端收到数据就立即返回ACK应答,则返回的窗口大小是比较小的,因为可能接收端处理数据的速度很快,本来可以返回更大的窗口,所以TCP中引入了延迟应答机制,接收到数据后并不马上返回ACK应答,而是会延迟一会再统一返回一个应答,但也不是所有的包都可以被延迟应答
- 数量限制:每隔N个包就应答一次
- 时间限制:超过最大延迟时间就应答一次
- 一般N取2,延迟时间取200ms,具体的依照操作系统而定
- 比如:接收端的接收缓冲区大小为1M,一次收到了500K的数据,则返回的窗口大小为500K,但是接收端可能处理数据的速度很快,10ms后500K数据就被读走了,本来可以接收更多数据的,但是刚刚却返回了一个较小的窗口大小,浪费了部分空间,导致性能降低
- 所以接收端完全可以延迟一会儿再应答,比如等上200ms,这时返回的窗口大小就是1M
捎带应答
根据应用层协议,发送出去的消息到达对端,对端进行处理以后,会返回一个回执。
例如,电子邮件协议的SMTP或POP、文件传输协议FTP中的连接控制部分等。
所以,TCP的确认和应用端的回执数据就被放到了一个数据包内,这种方式就叫捎带应答。
注意: 接收数据之后,如果立刻返回确认应答,就无法实现捎带应答。也就是说,如果没有启用延迟确认应答就无法实现捎带应答。延迟确认应答是能够提高网络利用率从而降低计算机处理负荷的一种较优的处理机制。
正是因为延迟确认和捎带应答机制,让TCP断开连接的时候四次挥手有时候变成三次挥手。
- 因为,如果在TCP断开连接的时候,有时候只能够抓取3个数据包。这三个数据包为客户端的FIN,服务器的FIN和ACK,客户端的ACK。