面试_计算机网络_TCP协议如何保证可靠传输

109 阅读5分钟

TCP协议如何保证可靠传输

  • (采用三次握手四次挥手来建立与释放TCP连接,从而保证建立的传输信道是可靠的)这一项算是吗?
  • 首先,TCP采用了 数据包校验 和 序列号 机制,对报文进行基本的校验
  • 其次,TCP采用了ARQ协议(包括:停等ARQ、连续ARQ、回退N重传)来保证数据传输的正确性,使用滑动窗口协议来保证接方能够及时处理所接收到的数据,进行流量控制
  • 最后,TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞。




基本校验

校验和

在发送算和接收端分别计算数据的校验和,如果两者不一致,则说明数据在传输过程中出现了差错,TCP将丢弃报文段。



序列号

TCP会对每一个发送的报文进行编号,接收方接到数据后,会对发送方发送ACK确认应答报文,并且这个ACK报文中带有相应的确认编号,告诉发送方,下一次发送的数据从编号多少开始发。如果发送方下一次发送编号不匹配的数据,接收端直接将数据丢弃。




ARQ自动重传协议

停止等待ARQ

如果发送方在发送数据后一段时间内没有收到ACK确认报文,那么发送方就会重新发送数据。如果又过了一段时间还是没有收到 ACK 确认,则进行再次发送。等待时间双倍递增,直至连接关闭。



连续ARQ

停等ARQ等待时间太长,信道利用率低。连续 ARQ发送方维持一个发送窗口,凡位于该窗口内的分组可以连续发送出去,期间不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组回复ACK,表明 到这个分组为止的所有分组 都已经正确收到了。



回退N重传

连续ARQ不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第3条丢失,接收方就算第1、2、4、5个消息都收到了,也直接丢弃后面三个。接收方只能对前两个发送确认,发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。




滑动窗口协议

解决的问题:如果发送端发送的数据太快,接收端来不及接收就会出现丢包问题。

解决的方法:在TCP首部设置一个16位字段大小的窗口,窗口的大小就是接收端接收数据的缓冲区的剩余大小。接收端会在收到数据包后发送ACK报文时,将自己的剩余大小填入ACK中,发送方会根据ACK报文中的剩余大小进而控制发送速度。如果窗口大小为零,发送方会停止发送数据。




拥塞控制的四种算法

如果网络出现拥塞,则会出现丢包问题,发送方会继续重传,网络拥塞会更加严重。因此当出现拥塞时,应当控制发送方的速率。方法是维护一个拥塞窗口的状态变量 cwnd 。具体包括了四个算法,分别为:慢开始,拥塞避免,快速重传,快速恢复。

【拥塞窗口】和【滑动窗口】的区别:

滑动窗口是根据接收方数据缓冲区大小确定的,而拥塞窗口是根据网络的拥塞情况动态确定的,一般来说发送方真实的发送窗口为滑动窗口和拥塞窗口中的最小值。



慢开始

一开始先设置小的拥塞窗口试探,一般为1,当收到ACK后再设置cwnd为2,以此类推成指数形式增长。

  • 慢开始阶段:每经过一个往返时间RTT,cwnd加倍


拥塞避免

上面提到cwnd在慢开始阶段是指数增长的,为了防止cwnd数量增长过快导致网络阻塞,会设置一个慢开始的门限值ssthresh,当cwnd>=ssthresh时,进入到拥塞避免阶段。

  • 拥塞避免阶段:每经过一个往返时间RTT,cwnd加1

无论是满开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(依据:出现超时),就将门限值ssthresh变为当前cwnd数值的一半,cwnd重新设置为1。



快重传

如果接收机接收到一个序列号不对的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段,而不要等到超时重传。



快恢复

当收到重复确认后,发送方知道了只是数据段的丢失,而不是网络拥塞导致丢包,于是不启动慢开始,而是执行快恢复算法,快恢复算法的过程如下:

  • 将ssthresh设置为当前cwnd的一半,cwnd减半。
  • 进入拥塞避免阶段。




UDP如何保证可靠传输?

当前有如下开源程序利用udp实现了可靠的数据传输。分别为 RUDP、RTP、UDT

segmentfault.com/a/119000003…