我们知道TCP有确认应答机制,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送ACK中携带的序列号。这样保证了可靠传输。但是有时数据往返的时间比较长时,性能就比较差了。
既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大提升性能。
TCP中提出了滑动窗口这个机制。这个机制是什么?我们看看…
- 窗口大小是指无需等待确认而可以继续发送数据的最大值,上面的图的窗口大小是 4000 字节(4个段)
- 发送前4个段时,无需ACK,直接发送
- 收到第一ACK后,滑动窗口向后移动,继续发送第五个段的数据
- 操作系统内核为了维护这个滑动窗口,需要开辟 发送缓存区来记录当前还有哪些数据没有应答,只有应答了才会把该数据从缓冲区中删除掉
- 窗口越大,则网络的吞吐率就越高
我们知道在复杂的网络环境下,有可能会有丢包的情况:
TCP中有两种情况:
1.
上面的图中,接受方发送的ACK(下一个是2001)丢失了。但是发送方还接受到了ACK(下一个是3001),说明1001 - 2000 该段数据包已经接收到了。数据已经传输到,不用理会。
2.如果数据包丢失,会怎么办?(快速重传)
当某一段报文丢失了,图中(1001 - 2000)数据段丢失了,接受方没有接收到该数据段,则会一直的给发送方发送ACK(下一个是1001),如果发送端主机连续收到同样一个(下一个1001),就会将对应的数据(1001 - 2000)重新发送。
这时候如果接收端收到1001之后,再次返回的就是ACK(8001)了。之前的(2001 - 8000)都接收到了接受缓存区。
这种机制被称为“高速重发机制”(快速重传)