【HBZ分享】TCP可靠性传输如何保证的?

ACK机制

  1. ACK机制是发送方与接收方的一个相互确认
  2. 客户端向服务端发送连接请求,此时服务端要回馈给客户端ACK,以表示服务端接到了客户端请求,这是第一和的第二次握手
  3. 客户端接收到服务端响应后,同样也要回馈服务端的响应,告知服务端我收到了你的回馈,我们可以进行传输数据了,此时客户端就会带着数据发送给服务端。、
  4. 以上就是ACK机制,只有当双方都确认了,才会进行数据发送

流量控制

  1. 流量控制是接收方发起的,即服务器端
  2. 服务器端通过win来告知客户端自己还剩多少流量来接受数据
  3. 比如服务端告知客户端我只有200个字段的流量了,则此时服务端会携带一个rwnd = 200的报文给客户端,这是客户端就知道了服务端能接收的流量,那么客户端发送的数据包就不会超过200字节

拥塞控制

  1. 拥塞控制是发送方发起的,即客户端,是一种自适应算法,利用多种机制,根据网络状况自动调整发送频率,以避免网络拥堵
  2. 慢启动:发送端会以一个较小的窗口值开始发送,每收到一个ACK后,下一次窗口值就会翻倍增加,知道窗口值达到最大值位置。如果过程中没有丢包,那就会加快发送的速度频率,如果丢包,就会降低发送速度
  3. 快速重传:当发送端发送的数据报文没有在规定时间内收到ACK回复,发送端会认为该数据报文丢失了,那客户端就会立刻重传
  4. 拥塞避免:当收到3个重复ACK,注意,这里是收到。发送端会认为网络拥塞,他会减少发送速率。并降低发送端发送的数据量,从而减少网络拥塞现象

重传机制

  1. 触发重传也有很多种方式
  2. 超时重传:超过等待时间依然没有收到ACK响应,则会重传, 一般来说超时时间(RTO) > 往返时间(RTT), 往返时间就是发送到服务端,再由服务端返回的两段时间相加
  3. 快速重传(数据驱动): TCP会给每个包编号seq, 第一个包编号就是随机数,接收方收到多个包后,方便组装还原,如果发生丢包,可以知道是哪一个包丢了。
  4. 比如服务端收到6号包,但没有收到14号包,ACK就会记录,期待收到14号包。过了一段时间,14号包还是没收到,但是收到了24号包,ACK里面编号不会变化,会一直期待收到14号包。所以就会不断的重试。当客户端收到了3个连续的ACK回复 或 超时了还没收到ACK,会认为14号包丢失,会重新发14号包,因为14号包已经记录在ACK编号里面了,所以客户端收到的ACK就会有期待14号包的信息,重传成功后,双方才会进行正常通信。
  5. 缺点:快速重传解决了时间超时问题,但存在重传的时候,究竟是重传丢失的那一个包,还是重传丢失包之后的所有包。因为丢失的包会导致后面的包不会记录在ACK中,所以此时客户端时不知道后面的包是否已经收到

你可能感兴趣的:(tcp/ip,网络,服务器)