1、ARQ(Automatic Repeat Request自动重复请求)和重传
一个直接处理分组丢失或比特差错的方法是重发分组,那么发送方如何判定需要重发呢?引入接收方的确认机制ACK(Acknowledgment)。接收方在接收到一个正确的分组后给发送方发送一个ACK。于是又引入了三个问题:
- 发送方对一个ACK应该等待多长时间
- 如果ACK丢失了怎么办
- 如果分组被接受了,里面有错怎么办
问题1比较复杂,之后讨论。对于问题2,发送方不能轻易地把这种情况和分组丢失了区分开来,他只能再次发送原分组。问题3可以通过校验和与CRC(循环冗余校验算法)检测到,检测到出错后将不会发送ACK。
在问题3发生之后,发送方会再次发送分组,接收方则会收到重复的副本,这个问题需要使用序列号来处理。每个分组都有一个唯一的序列号,接收方通过序列号来判断是否已经见过这个分组,如果有则丢弃新来的分组
2、分组窗口和滑动窗口
分组窗口是一个已被发送但还没被确认的分组的集合,这个窗口的分组数量成为窗口大小,下图是一个发送方的窗口
发送方下一步可能收到一个分组4的ACK,这时窗口会向右滑动一个分组,此时意味着分组4已被确认,可以释放了,而分组7进入窗口可以被发送了。
接收方也会维护一个类似的窗口用来记录哪些分组已经被接收和确认,哪些分组是下一步期望的,哪些是即使被接收也将会因为内存限制而被丢弃。
而对于这个窗口应该取多大,或者当接收方或网络处