关于回退n协议的一些问题

TCP的话,对面发送到窗口空间用完就暂停了,然后就可以回复ACK。跟别人冲突了就指数倒退。
■网友
这是几个不同层面的问题。学这些最好摘开来一个个解决,不要混在一起。先回答“网络上多个发送者同时发送导致冲突”问题。这个问题有几种解决方式。其一是令牌协议,几台机器通过一定的算法选举,给一台机器授予令牌;拿到令牌的机器才能发送数据,其它机器必须等待。当一台机器持有令牌若干时间、或者发送若干数据后,就会把令牌交给下一台机器。这样通过令牌流转,就可以保证多台机器在同一介质中传递数据而不相互干扰了。这个协议目前已很少使用。另一个就是目前最流行的以太网的CSMA/CD(carrier sense multiple access- collision detect)协议,即“带冲突检测的载波监听多路访问”。意思就是如果网络空闲了,想发你就发,一边发一边读取网上正在传输的信息——内容应该和你发的一样;如果不一样,就说明别人也在发,也就是说,检测到冲突了。一旦发现冲突,要立即停止发送数据;然后主动等待一个随机的短时间,检测网络空闲就继续发——如果还冲突,就等待更长的一个随机时间然后继续。这样反复几次之后,肯定能找到不受干扰的传输机会。Carrier sense multiple access with collision detection不过,你应该注意到,这些都不是IP协议的内容。这是因为,IP协议其实并不是最底层的网络协议。你可以认为,冲突检测之类是更底层的传输协议要考虑的问题,它们要负责模拟出一个无冲突、全双工、点对点的网络环境;而TCP/IP“天生”是全双工的,它才懒得管这么底层的东西。然后说TCP协议:大多数时候,你可以认为ACK包像ping一样,接收方收到包、校验完成就要马上响应。不过,标准允许延迟一个较短的时间、把多个ACK组合起来返回(或者,“趁”着下一个要向发送方发送的数据包发送——注意在TCP/IP看来,网络总是全双工的):但这个延迟是很短的,不会超过两个数据包。
■网友
一般窗口大小是指一定数量的帧。最简单的情况是每发送一帧,然后等待确认帧,收到确认帧后再发下一帧,但是这样效率就很低。于是定义一定数量的帧为一个窗口,比如窗口大小为3,那么发送方在发送完第一帧后,不必等待确认帧,可以接连发送后续两帧。假如发送第三帧的时候收到了确认帧,并且确认帧中的帧序号确认了前两帧,那么发送方就会刷新窗口的位置,可以在第三帧后再连续发送两帧,而不需要等待确认帧。如果连续发送完三帧还没有收到确认帧,那么就要启动超时重传等机制。假如连续发送了三帧,这时候收到了一个特殊的确认帧,确认帧表示第二帧出错了,那么发送方就要从第二帧开始重新发送后两帧数据。这种协议一般都是全双工通信里用的,半双工每帧都要确认的。


    推荐阅读