TCP协议的可靠性

保证数据能到达对端:  超时重传和确认应答机制、滑动窗口(发送方发送速率与接收端的接收缓冲区空间匹配) 、拥塞控制(发送方发送速率与网络环境匹配)

保证数据不乱序,不重复:TCP报头中的32位序号,序号值为随机值ISN+报文段所携带数据的第一个字节在整个字节流中的偏移量。

保证数据不失真: TCP报头中的16位冗余校验码,接收端对TCP的头部和数据部分通过CRC算法进行冗余校验

1.检验和冗余校验位

  • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
  • 监测数据在传输过程中的变化。

2.序列号

  •   通过序列号,可以去重、超时重传、数据有序到达(数据有序指的是数据全部到达对端之后会进行重组)。

3.确认应答

  • 可以确认ACK之前的数据肯定到达了,保证了可靠性。

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

  •   发送的数据有可能因为网络拥堵,没有及时到达,发送端没有收到确认,就会进行重发。
  •   接收端有可能收到许多重复文件,通过序列号可以去重。
  •   累计到一定次数,TCP认为网络或者接收端出现异常,强制关闭连接。

5.连接管理

  • 通过三次握手建立连接、四次挥手断开连接,维护必要的连接。

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

  • 接收端将自己可以接收的缓冲区大小放入报头窗口大小中,通知发送端。
  • 窗口大小越大,说明网络的吞吐量越高。
  • 接收端如果发现自己的缓冲区快满了,就会将自己的窗口大小调低,发送端收到后会降低自己的发送速度。
  • 如果接收端满了,将自己的窗口大小设置为零,发送不在发送数据,但是会定期发送一个窗口大小探测数据段。

(1)窗口机制:连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端,接收方发送的确认信息中包含了自己剩余的缓冲区尺寸。剩余缓冲区空间的数量叫做窗口

(2)滑动窗口:支持流量控制它是一种接收方能够控制发送方使其降低速度的反馈机制。这种机制用于抑制发送方发送速度过快,即抑制传输比接收方所能处理的更多的数据。这通常通过扩展滑动窗口协议完成,使接收方不仅确认收到的帧,而且通知发送方它还可接收多少帧。

(3)TCP利用滑动窗口实现流量控制的机制。

发送窗口里面的序号表示允许发送的序号。发送窗口后沿的后面部分表示已发送且已收到确认,而发送窗口前沿的前面部分表示不允许发送。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口的前沿通常是不断向前移动的。一般来说,我们总是希望数据传输更快一些。但如果发送方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

7.拥塞控制:慢启动、用塞避免 ------------------------------当网络拥塞时,减少数据的发送。

  • 慢开始:慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。 
  • TCP用拥塞窗口(cwnd)来进行拥塞控制,主要利用了慢启动、拥塞避免、快速重传和快速恢复
  • 拥塞避免算法:让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1.
  • 快速重传:在接收到相同ACK后,推断出丢失报文段起始序号,然后立即重传此报文
  • 快速恢复:在快速重传的基础上,如果发生了快速重传,则执行拥塞避免算法而非慢启动。

在TCP/IP中,快速重传和恢复是一种拥塞控制算法,它能快速恢复丢失的数据包。没有FRR,如果数据包丢失了,TCP将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了FRR,就不会因为重传时要求的暂停被耽误。  当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

TCP协议的可靠性_第1张图片

 

概念原理参考:https://blog.csdn.net/yuliantao/article/details/81559580

  • 拥塞避免算法和慢启动算法是两个目的不同、独立的算法。慢启动的目的是:防止一开始速率过快,导致耗尽中间路由器存储空间,从而严重降低TCP连接的吞吐量。拥塞避免的目的是:当拥塞发生时,降低网络的传输速率。这可以通过调用慢启动的动作来降低网络的传输速率。所以在实际中这两个算法通常在一起实现。
  •  其将窗口置为现有窗口的大小,同时慢启动门限tp->snd_ssthresh设置为现有窗口大小的一半。snd_cwnd(拥塞窗口)被设定为只能容纳一个报文t_maxseg),这样就强迫TCP执行慢启动。之后拥塞窗口会先以指数形式增长,达到慢启动门限snd_ssthressh之后,再线性增长。线性增长的过程即是拥塞避免算法。
  • TCP将应用数据分割成TCP认为最适合发送的数据块。TCP的接收端会丢弃重复的数据。

8.停止等待ARQ协议也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停下来等待对方确认。这样可使信道上一直有数据不间断的在传送。这种传输方式可以明显提高信道利用率。

9.TCP粘包:

由于UDP支持的是一对多的模式,所以接收端的套接字缓冲区采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),就容易进行区分处理了,所以UDP不会出现粘包问题。TCP窗口的大小取决于当前的网络状况、对端的缓冲大小等因素,TCP没有消息边界,发送方等到缓冲区满才发送数据,接收端不能及时接受数据都会造成粘包问题。避免方式:

  • 命令控制:通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
  • 一般实现:消息尺寸和消息一起发送(变长数据包)、发送固定长度的数据(定长数据包)、使用特殊标记作为消息间隔(保证标记与正文数据不冲突)

你可能感兴趣的:(计算机网络,TCP,可靠性,粘包问题,用塞控制)