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 。