TCP 可靠传输

TCP是传输层协议,提供可靠传输,本文列举一下 TCP 可靠传输的一些实现机制。

1. 重传机制

1.1 序号和确认号

TCP 是面向字节流的,然后针对每一个要传递的字节在TCP中都会有一个编号。在TCP header中有两个字段 序号和确认号用于表示发送了多少数据和接收了多少数据。举例就是客户端发送请求,请求报文里面的序号就是客户端发送了多少数据;服务端接收到之后回复的ACK报文的确认号就是当前服务端接收了多少数据。

序号和确认号是重传机制实现的基础。

1.2 常见重传机制

在复杂的网络情况下有可能出现数据丢失的情况,所以TCP通过重传机制来解决这个问题。下面列举一下常见的重传机制:

超时重传

发送数据时,设置一个定时器,当超过指定时长之后还没收到对应的 ACK 应答则重发该数据,这就是超时重传。

有两种情况可能触发超时重传:

  1. 数据包丢失
  2. 服务端 ACK 丢失

问题一: 如何设定超时时长

超时重传时间以RTO表示,RTO需要是一个合理的值,不然会导致如下影响:

  • 当超时时间 RTO 较大时,重发就慢,丢了老半天才重发,没有效率,性能差;
  • 当超时时间 RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。

超时重传时间 RTO 的值应该略大于报文往返 RTT 的值。RTT的计算是一个采样取平均值的过程。

快速重传

快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。在快速重传中服务端需要在收到数据后返回之前没有收到的ACK序号。

SACK 方法:( Selective Acknowledgment 选择性确认)

这种方式需要在TCP header的 [选项] 字段里加一个 ACK 字段,它可以将缓存里的地图发送给发送方。这样发送放就知道那些数据收到了,那些没有收到。知道这些就可以只发送丢失的数据,建立在快速重传的基础之上。

1.3 总结

  1. 重传机制针对的是丢包的问题,通过序号和确认号可定位那些数据需要重新发送
  2. 重传机制的演变提升了效率,超时重传是保底的方式,快速重传和SACK则提高了效率
2. 滑动窗口

如果没有窗口这个概念,那么上面的重传机制描述的实际效果就是,客户端发送一个数据,服务端就要回复一条数据,客户端只有收到服务端的回复之后才会继续发送剩余数据。这种串行的方式非常影响传输的效率和网络的吞吐量。

窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在确认应答返回之前必须缓存已发送的数据。如果需要重发服务端未收到的数据可以直接从缓存中取,同样的缓存空间可以使得客户端发送更多的数据。当收到确认应答时,则从窗口中移除这部分数据。

窗口的大小由那一端确定

窗口的大小就是设定的缓存的大小。在 TCP header里面有一个 window 字段,这个字段就是窗口的大小。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

2.1 发送方窗口

发送方数据大致分为四种状态:

  1. 已发送且已确认状态的数据,这部分数据代表服务端已收到,不会有重发的可能
  2. 已发送但未确认的数据,这部分数据在窗口内,有可能被重发,所以占用窗口内存
  3. 未发送但可发送的数据,就是说接收方的窗口还有剩余空间,可以继续接收数据
  4. 未发送且不可发送的数据,这部分数据是服务端无法继续接收的数据,如果继续发送,服务端也处理不过来。

发送方窗口的数据是一直在变动的,直到全部发送完毕。

2.2 总结

窗口的出现提高了传输的效率且能很好的控制网络传输的吞吐量。

3. 流量控制

如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。

为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。

4. 拥塞控制

网络出现拥塞的情况下,超时重发触发的可能性增大,此时触发重发机制的话,会导致网络中的报文越来越多,网络的拥塞情况就会越严重,进而恶性循环。

所以为了避免出现这种情况,发送方需要知道网络的拥塞情况,防止出现发送方数据填充满网络的情况。

4.1 拥塞窗口

拥塞窗口cwnd是发送方维护的一个 的状态变量,它会根据网络的拥塞程度动态变化的。

  • 只要网络中没有出现拥塞,cwnd 就会增大;
  • 但网络中出现了拥塞,cwnd 就减少;

拥塞窗口会影响发送方的实际窗口大小,计算规则是 swnd = min(swnd, cwnd), 也就是说网络拥塞的情况下, cwnd 越小,发送方窗口 swnd 就越小。

发送方如何确定出现网络拥塞?

如果发送了超时重传就认为出现了拥塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值