重传 对于丢失分组 n,在GBN中,发送方会重传n及n以后的数据包;在SR中,只会重传n。
缓存 对于乱序达到的分组,在GBN中,接受段端会直接丢弃;在SR中,会把它们缓存下来。
定时器 在GBN中一个连接只会设置一个定时器,在SR中会为每个分组设置定时器。
而TCP呢?
重传和缓存像SR,定时器像GBN。
TCP协议中的ack指的是 期望收到的分组。而GBN,SR中ack指的是已经确认的分组。
GBN:
- 如果某个报文段没有被正确接收,则从这个报文段到后面的报文段都要重新发送。
- 采用累计应答的方式。例如接收端返回ACK=3,则证明报文段3以及之前的报文段都被正确接收。
- 这里顺便解释一下为什么GBN可以采用累计应答的方式?怎么就能保证3之前的被正确接收了呢?
- 这还要由GBN的工作机制来决定:在GBN机制下,在接收端的运输层一次只交付给上层一个分组,并且保证是按序交付的,因此如果分组k已接收,则所有序号小于k的分组也已经交付了。
- 接收端不对失序到达的分组进行缓存。
SR:
- 接收方设置缓存区,用于接收失序到达的分组。(从这里可以感受到,所谓的GBN中的发送端窗口和SR中的发送端与接收端的窗口其实就是缓存区,用于缓存分组。注意,由于GBN是单个分组交付,不设置缓存区,所以GBN的接收端是没有窗口的)
- 为每个报文段设置单独的计时器,单个分组计时器超时只重发这一个报文段。
- 接收端返回ACK是当前接收成功报文段的序号,SR不采用累计应答的方式。
TCP:
- TCP使用累计应答的方式。这一点与GBN类似。
- TCP在接收端会设置缓存,来缓存正确接收但是失序的分组,这点与SR类似。(实际上TCP RFC并没有对接收端要怎样处理失序到达的分组提出要求,但是在接收端设置缓存是实践中大家都采用的方法)
- TCP使用快速重传机制:如果收到对于一个特定报文段的3个冗余ACK,则在超时事件发生前就会对该报文段进行重传,这大大节约了时间。
- 注意:TCP中的ACK是指接收端希望从发送端收到的下一字节的序号。例如发送端发送了编号为0-5的字节,这时接收端成功接收后就会发送ACK为6。
- 注意:这里介绍的TCP这是理论上的,在实际使用过程中,大家加入了很多其他的机制等。目前计网学习的都是基础理论的知识。
GBN和SR是滑动窗口协议的两个典型例子,可以看做是“理论”协议,实际协议可以完全按着GBN或SR协议实现,当然也可以根据需要引入或综合不同的机制。TCP协议可以认为综合了GBN协议和SR协议的一些机制,比如TCP协议采用累积确认机制、通常在接收端提供缓存等。
【例题】
本文内容参考于