概览本文主要分析在数据链路层通过哪些方式实现可靠传输。从用户角度希望接收到的 数据正确数据有序。那么在这个过程中可能出现的问题是数据错误数据乱序数据丢失。下文中的可靠传输协议就是解决这些问题的。ARQAutomatic Repeat reQuest 自动重传请求如何解决解决这些传输中出现的问题呢最简单方式就是—重新发送一次正确的数据。首先发送方需要知道数据出现了问题。这可以通过接收方主动返回数据 通知 发送方。那么如果数据正确就可以返回一个ACK(acknowledgement)表示数据正确如果数据错误就返回NAK(negative acknowledgement)表示需要重新发送数据。相似的返回的数据也可能会丢失也不能无限等待着----那么就可以每次设置一个返回值如果超过时间没有接收到返回值就说明发送失败同样会触发重传。1 停止等待协议 (Stop-and-Wait ARQ)现在按照前文的想法已经可以直接构造出停止等待协议了每次只发送一个数据帧发送后等待ACK。如果数据正确到达返回ACK。如果数据出现错误或者丢失不返回NAK等待发送端计时器超时后重传。例子发送成功发送失败数据丢失数据错误ack帧丢失超时时间的设定现代的协议中超时重传时间一般略大于RTT避免导致不必要重传。一般通过持续测量RTT得到一个EstimatedRTT 4 * DevRTT 这里DevRTT是一段时间内容的RTT偏差值。能够看出这种协议简单但是效率低。每次发送后只能等待十分低效。具体举出一个例子如果一个数据帧 1000 bit链路速率100Mps,传播距离3000km传播速度3*10^8m/s。那么传播时延为10ms传输时延很小远小于1ms可以忽略。那么发送一次数据帧至少需要20ms才能发送下一个数据帧这样效率也太低了怎么提高效率呢那么就需要其他的协议了。总结一下 停止等待协议每次只能发送接收1一个只有确认对方收到后才能发送下一个。2 后退N步协议 (Go-Back-N APQ)前文提到停止等待协议问题是效率太低了发送一个数据帧必须等待响应。那么只要每次多发送几个不要一直等待不就可以了吗是的但是这样又会带来新问题接收方怎么知道数据顺序呢 那就给数据编号。GBN的核心规则就是发送方可以连续发送多个数据接收方每次只能接收一个数据。发送窗口1发送方可以连续发送多个数据帧不需要等待每一个帧的ACK。接收窗口1每次只能接受一个数据帧。不同确认实现风格接收方可以没接收一个帧就返回一次ACK也可以接收多个帧后再返回一个ACK个人所见教学中常用后者例子发送成功数据帧丢失确认帧丢失那么快速总结一下GBN协议允许一次发送多个数据帧的但接受方一次只能接收一个数据只能按顺序接收数据超出接收窗口的只能丢弃。3 选择重传协议 (Selective Repeat ARQ)后退N步协议 相比较 停止等待协议效率高了不少但是如果最开始数据帧错误或者丢失及时后面的数据帧发送成功也不能被接收只能重新发送。如果一次可以接收多个数据就好了只让错误丢失的单独重传好了。那么选择重传协议就是这样做的。选择重传又特殊的限制这里的接收窗口可以大于1需要满足接收窗口小于发送窗口。这主要是接收窗口大于发送窗口没有意义接收窗口永远不满而且由于发送窗口接收窗口2n这样还会减少发送窗口大小。同时这里那么这里SR的核心规则就是发送数据后如果正确接收方发送ACK随后窗口移动。如果出现错误或者丢失只对出现错误的帧进行重传已经成功接收的不需要重传。例子发送成功数据帧丢失数据帧错误确认帧丢失简单总结一下SR协议SR协议比GBN协议控制更加准确每次可以单独处理出现问题的数据帧并且可以接收到乱序的数据帧。总结本文主要介绍了计算网络的数据链路层中实现可靠传输的三个协议SWGBN与SR协议。SW通过ACK与超时解决数据帧的丢失。GBN通过连续发送累计确认解决SW协议的低效。SR通过缓存乱序帧与只重传出错帧进一步减少不必要的重传。这三种协议一步步实现链路层的可靠传输。