7. TCP可靠数据传输

说可靠数据传输之前,先说下什么是可靠传输。
数据传输过程中,如果能够不错、不丢、不乱的被接收方接到,就是可靠数据传输。

我们知道TCP在OSI模型中,位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。IP层的不可靠特性决定了TCP实现可靠数据传输的复杂性。

渐进的看TCP为保证可靠数据做的措施
  1. 假设底层信道可以保证,信息有序且不丢的到达接收端,但是可能会出现传送数据的错位,即传送数据可能出错

我们主要聚焦看数据,如何保证不错的及错误后如何处理。

差错检测机制-校验和

校验和提供了验证数据正确性的能力,发送方根据算法对数据进行求和,接受方接到数据后做验证,验证通过即证明数据正确传输。
校验算法:

  1. 获取到伪首部、tcp报文部分数据。
    伪首部:从IP报文获取,包括源IP、目标IP、保留字节(置0)、传输层协议号(TCP是6)、TCP报文长度(报头+数据)。
  2. 把所有数据视为16-bit整数。
  3. 计算所有整数的和,进位加到和的后面,将得到的值按值取反。得到校验和。
确认机制-ack

接受方如何显试的告诉发送方,消息接受成功?
通过ACK

  1. 发送方发送数据后,进入等待状态,等待接受方确认数据信息。
  2. 接受方成接受到消息后,给发送方发送ACK消息。
  3. 发送方确认ACK消息后,继续发送信息。
超时重传机制

通过确认机制,可发现若发送方一直接受不到ack消息,则会一直等待下去,此处需要给发送方一个最大的等待时长即超时重传时间。
发送方使用一个保守估计的时间作为收到数据包的确认的超时上限。如果超过这个上限仍未收到确认包,发送方将重传这个数据包。每当发送方收到确认包后,会重置这个重传定时器。

  1. 现在数据正确性得到的了保证,如何保证数据传送顺序不丢、不乱呢?假设底层信道不会出现乱序数据,但是数据可能丢。

场景1,数据包在传输过程中丢失
丢失后,接收方不会感知到数据,也不会发送ACK消息。发送方触发超时重传机制后,会向接收方重新发送消息内容。

场景2,ACK消息丢失
丢失后,发送方等待一段时间后,会触发超时机制,重新发送数据。此时,接受方并不知道本次接收到的数据是重复,还是新数据,会导致重复消息的错误。
所以当前场景无法满足,ACK消息发送失败还保证可靠。需要引入序列号机制。

序列号

发送方,在连接建立阶段和接收方协商好一个序列号。每次发送数据都携带一个序列号,接受方接收到重复序列号数据,可以直接丢弃。

校验和 + 序列号 + ACK + 重传 可以保证可靠传输吗?




分析可见,可以满足可靠数据传输的不丢、不错、不乱的需求。

你可能感兴趣的:(7. TCP可靠数据传输)