TCP如何实现可靠传输
累计确认
首先为了保证顺序性,每个包都有一个 ID。在建立连接的时候会商定起始 ID 是什么,然后按照 ID 一个个发送,为了保证不丢包,需要对发送的包都要进行应答,当然,这个应答不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,这种模式成为累计应答或累计确认。
为了记录所有发送的包和接收的包,TCP 需要发送端和接收端分别来缓存这些记录,发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分
发送并且确认的
发送尚未确认的
没有发送等待发送的
没有发送并且暂时不会发送的
这里的第三部分和第四部分就属于流量控制的内容
在 TCP 里,接收端会给发送端报一个窗口大小,叫 Advertised window。这个窗口应该等于上面的第二部分加上第三部分,超过这个窗口,接收端做不过来,就不能发送了
于是,发送端要保持下面的数据结构
对于接收端来讲,它的缓存里面的内容要简单一些
接收并且确认过的
还没接收,但是马上就能接收的
还没接收,但也无法接收的
对应的数据结构如下
顺序问题和丢包问题
超时重传机制
流量控制
缓冲区窗口
拥塞控制
慢开始,快恢复,