为什么TCP是可靠传输?

1.停止等待协议
通过确认与超时重传机制实现可靠传输
在发送一个分组后,必须暂时保存已发送的分组副本
分组和确认分组都必须进行编号
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长
出现差错或者丢失时,发送方会将自己的备份的副本重传一次,直到收到接受的确认消息。当接收方收到重复的数据时会直接丢弃,但是会告诉发送方自己收到了。

2.连续的ARQ和滑动窗口协议
上面的停止等待协议每发送一组数据就必须等到接收方回复确认后,再发送第二组数据,如果出现超时重传的话,效率更低。因此,为了提高传输的效率,改进了等待的传输协议。
连续的ARQ协议和滑动窗口协议的机制是以接收方回复确认为单位的,每次连续发送一个滑动窗口指定的数据组。

接收方怎么回复确认?

发送方不对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就认为这个分组为止的所有分组都已经正确收到了。
优点:容易实现,即使确认丢失也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组信息。

Go-back-N(回退 N
为了解决上述同一个窗口中数据不能完整确认的问题,连续ARQ采用了回退机制。比如:发送方发送了前五个分组,而中间三个丢失,这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,只好把后面的三个分组都重传一次。当通信线路质量不好的时候,连续ARQ协议会带来负面影响。

TCP可靠传输的实现
TCP链接的每一端都必须设有两个窗口,一个发送一个接收
TCP的可靠传输机制用字节的序号进行控制,TCP所有的确认都是基于序号而不是报文段
TCP两端的四个窗口经常处于动态变化中
TCP链接的往返时间RTT也不是固定的,需要用特定的算法估算

TCP的流量控制

流量控制就是让发送方的发送速率不要太快,既要让接收方来得及接受,也不要使网络发生拥塞。
零窗口处理——持续计数器
考虑上面的例子中,当A发送的数据已经到达B的接受窗口上限,此时A就必须等待B处理部分数据后,待接受的窗口有空闲的时候,再次发送数据,那么A如何得知B有空闲?这就引入了持续计时器
TCP为每一个链接都有一个持续计时器,只要TCP链接的乙方收到对方的零窗口通知,就启动了计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文(1个字节),而对方就在确认这个探测报文段给出了现在的窗口值。若窗口任然是0,则收到这个报文的乙方就重新设置计时器,若不是0,则死锁的僵局就可以打破。