传输层-2、可靠数据传输原理与实现

参考哈工大公开课。

在网络传输数据中,应用层、网络层、数据链路层、物理层都不会保证数据的可靠性,只有运输层会保证数据的可靠性,即保证数据的不错,不丢,不乱。在UDP协议中,仅仅是采用校验和的方式做了简单的错误检测,而且没有做错误矫正,在这里,笔者将讲述网络传输中对数据的错误检测和错误矫正的一般方法。

 

在网络数据传输中,应用层和传输层是单向通讯的:对于发送方,应用层只需要把待发送数据发给应用层;对于接收方,运输层只需要把可靠的数据传送给应用层即可。

传输层-2、可靠数据传输原理与实现

图一:各层间的通讯关系

 

在下面,笔者将从错误矫正和错误发现进行讲述。

为了保证数据的可靠传输,设置了如下机制:

1、 我们需要采用类似于应答这样的方式这样的方式来确保消息传输的可靠性,发送方传给接收方的是数据包,接收方发给发送方的则是确认消息(ACK),来通知发送方是否正确接收或者接收到正确的消息。

2、采用停等方式:就是只有在上一个确认正确接收了,收到了ACK,才发下一个;如果ACK不符合预期,或者等待超时没有接收到ACK,就选择重发。

 

 

先说错误矫正的方法就是重发,发送方在接收方没有回复确认消息ACK,或者ACK中的信息不是发送方希望得到的,那么发送方就会重新发送,直到收到正确的ACK。

 

发现错误,在数据过程中,主要可能产生以下错误:数据出错;数据包乱序;数据包丢失等问题。

 

对于数据出错,可以采用校验和,具体做法是发送方求数据的和,然后把这个值一起发送出去,接收方接收到数据就再次对数据求和与发送过来的和进行比较,如果相等就认为数据是正确的;如果不等,则在ACK中添加相关信息,告诉发送方数据有误,发送方就会重发。


对于数据包乱序的问题,只需要对数据包进行编号,ACK中即可。由于我们的数据包是用停等规则发送的,所以只需要0,1,0,1…的交叉编号即可,发送完0号,只有收到确认0号已经收到的ACK才发送1号,以此类推。

 

对于数据包丢失:数据包丢失了,那么接收方就接收不到数据包,就不会发送ACK,发送方在设定的时间长度内没有接收到ACK,就会直接选择重传。在这个过程中需要关注两个问题:1、就是不是数据包丢了,而是ACK丢了,那么发送方也接收不到ACK,那么同样选择重新发送;2、如果是网络延迟比较高,导致数据包或者ACK传输的速度慢了,发送方就可能重复发送,这时接收方只需要丢弃重复的数据包,并发送包含数据包编号ACK,告诉丢弃的数据包已经正确接收即可。

 传输层-2、可靠数据传输原理与实现

图二:几种典型的丢包处理过程

 

对于上面的方式,它的确保证了数据的可靠传输,但是它的性能却不尽人意。发送方一次发送一个数据包,接收方一次发送一个ACK,中间有大量的时间浪费在了等上,性能问题是它致命的缺陷。