欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

详细总结:TCP为何是可靠的

程序员文章站 2024-03-18 08:58:40
...

TCP协议保证数据传输可靠性的方式主要有5种:

1.校验和

   发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。
   如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 

2.确认应答+***

   TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。 

3.超时重传

   当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。
   如果不能及时收到一个确认,将重发这个报文段。 

4.流量控制

   TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。
   当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
   TCP使用的流量控制协议是可变大小的滑动窗口协议。
   接收方有即时窗口(滑动窗口),随ACK报文发送

5.拥塞控制

   当网络拥塞时,减少数据的发送。
   发送方有拥塞窗口,发送数据前比对接收方发过来的即使窗口,取小
   慢启动、拥塞避免、拥塞发送、快速恢复

说一下流量控制和拥塞控制的区别:
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况

分别仔细分析一下这五种:

1.校验和

校验和的计算方法( IP 首部中的校验和为例)
方法是计算16位的二进制和,首先将校验和字段(16位)置0,将每个16位相加,若最后未到16字节,则以0补充,然后对结果取反,结果存在校验和字段中,
然后接收端接收到报文后,头部是包含之前的校验和,则接收端又计算全部的二进制和,然后取反,如果结果为0则传输没出问题。否则出错
如果出错:接收端就会丢弃这个报文的接收。从而发送端等待确认超时后,会自动重发该数据包

我引用了之前学习保存的一张图。能很好的说明情况。
详细总结:TCP为何是可靠的

2.确认应答+***

以TCP三次握手和四次挥手为例子。
如果是传输过程中。ACK代表期望下次收到的是什么报文,如果丢包了,假设X端发给Y端1000-1009的包,如果1004在这个过程丢包了,那么ack这个应答就跟***不匹配。就会转到重传阶段
如果重发:接收方发现接收的数据已存在(,所以***还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

详细总结:TCP为何是可靠的

3.超时重传

发送方没有接收到响应的ACK报文原因可能有两点:

a、数据在传输过程中由于网络原因等直接全体或者部分丢包,接收方没有接收到。
b、接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。

TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制
如果是第一个原因,接收方收到二次重发的数据后,便进行ACK应答。
如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是***,***还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

超时以500ms为一个单位进行控制
如果重发一次后,得不到应答,等待2500ms后进行重传
如果仍然得不到应答,等待4
500ms进行重传,依次类推,以指数形式递增
累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接

4.流量控制

接收端滑动窗口大小是由接收端的接收能力决定的,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

详细总结:TCP为何是可靠的

4.拥塞控制

TCP传输的过程中,发送端开始发送数据的时候,如果刚开始就发送大量的数据,那么就可能造成一些问题。网络可能在开始的时候就很拥堵,如果给网络中在扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧就会产生大量的丢包,就对大量的超时重传,严重影响传输。

慢启动:所以TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫做拥塞窗口的概念。发送刚开始定义拥塞窗口为 1,每次收到ACK应答,拥塞窗口加 1。在发送数据之前,首先将拥塞窗口与接收端反馈的窗口大小比对,取较小的值作为实际发送的窗口。

拥塞避免:拥塞窗口的增长是指数级别的。慢启动的机制只是说明在开始的时候发送的少,发送的慢,但是增长的速度是非常快的。为了控制拥塞窗口的增长,不能使拥塞窗口单纯的加倍,设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时,不能再按照指数来增长,而是线性的增长。在慢启动开始的时候,慢启动的阈值等于窗口的最大值,一旦造成网络拥塞,发生超时重传时,慢启动的阈值会为原来的一半(这里的原来指的是发生网络拥塞时拥塞窗口的大小),同时拥塞窗口重置为 1。

快重传:比如发送了1001,1002接收方也正常回应了,而发送1003丢包,接收方没有收到,此时发送方发送了1004,接收方还是回应ACK1003表示期望收到1003的包,这种情况会持续三次,三次之后发送方不必等待超时的时间,即可立即发送丢失的1003,此时三次之后假设1004,1005,1006都正常接收,那么下次也是回应ACK=1007,因为缓存队列中已经有了

快恢复:新的阈值通常为窗口大小的一半,如图中24->12,阈值只要作为一个门槛,达到阈值了就是拥塞避免算法慢慢加,别以为到了阈值就会发生堵塞。其实要到真的堵塞了才知道堵塞了。把cwnd值设置为慢启动门限减半后的值,然后开始执行拥塞避免算法,拥塞窗口cwnd值线性增大。

这里引用计算机网络书上的图作为例子理解:

详细总结:TCP为何是可靠的

相关标签: tcp