TCP如何保证传输的可靠性

校验和 

  TCP校验和的校验范围包括TCP首部及数据部分,在计算检验和时,要加上一个12字节的伪首部,伪首部是为了增加TCP校验和的检错能力;
  发送端计算方法:将首部的校验和字段置0,再将整个报文段分为16位(bit)的字,然后将所有字进行反码相加(进位也要进行相加),将结果存放在校验和字段中;
  接收端计算方法(同上):将整个报文段分为16位(bit)的字,然后将所有字进行反码相加(进位也要进行相加),如果计算结果的所有位是全1为则正确,否则存在错误。
  具体计算结方法可以参考 https://www.cnblogs.com/zxiner/p/7203192.html

确认应答和超时重传

  数据到达接收方,接收方会发出一个确认应答报文段(ACK=1,表示确认号ack有效),表示已经接受到了该数据段,确认号ack为接收方下一次接收数据的序号;若发送发迟迟未收到确认应答报文段,发送方会在一段时间后进行超时重传

序列号

  序列号-TCP为发送的数据的每个字节分配的编号。序号可以保证数据按序到达;接收方可以立刻知道缺少哪个序号的数据;

连接管理

  连接管理机制即TCP建立连接时的三次握手和断开连接时的四次挥手

流量控制(接收端出现了问题)

  流量控制:根据接收端的处理能力,来决定发送端的发送速度;是端对端的通信量控制
  接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区占满,此时,如果发送方继续发送的话,就会造成丢包,引起重传等一系列连锁反应;因此,需要进行流量控制,解决客户端和服务端因传送速率不同引起的丢包问题。
  在TCP报文段首部中有一个窗口长度,当接收端接收到发送方的数据后,在确认报文段中就将自身缓冲区的剩余大小,放入窗口中;
    当接收方的缓冲区快满了,就将窗口设置为更小的值通知发送方;
    如果缓冲区满了,就将窗口置为0,发送方收到后就不再发送数据,但是需要定期发送窗口探测报文段,接收端把窗口大小告诉发送端。
 

拥塞控制(网络出现了问题)

  拥塞控制:防止过多的数据注入到网络中,使网络过载;是全局性的通信量控制

  cwnd-拥塞窗口;ssthresh-慢开始门限;

  发送方让自己的发送窗口等于拥塞窗口。

  TCP进行拥塞控制的算法:

    慢开始-慢开始不是指拥塞窗口的增长速度慢(指数增长),而是在开始发送时设置拥塞窗口cwnd=1,先探测一下网络的拥塞程度,再逐渐增加拥塞窗口的大小(实时拥塞窗口的大小以字节为单位);

    为了防止拥塞窗口增长过大引起网络拥塞,设置一个慢开始门限(ssthresh状态变量):cwnd<ssthresh,使用慢开始算法;cwnd=ssthresh,慢开始算法和拥塞避免算法均可使用;cwnd>ssthresh,使用拥塞避免算法。

    拥塞避免-拥塞窗口的增长速度缓慢增大(线性增长);无论在慢开始阶段还是拥塞避免阶段,只要发送方认为网络出现拥塞(发送方没有收到确认报文段),就将慢开始门限设置为出现拥塞时发送窗口大小的一半,然后把拥塞窗口设置为1,执行慢开始算法;

    快重传-接收方收到一个失序的报文段后,就立刻发出重复确认,而不是等到自己发送数据时发出;发送方只要连续收到三个重复确认就立刻重传接收方未收到的报文段,而不用等待重传计时器,这样可以尽早重传未确认的报文段,提高网络的吞吐量;

    快恢复-当发送方连续收到三个重复确认时,将慢开始门限设置为出现拥塞时发送窗口的一半,将拥塞窗口设置为慢开始门限的大小,然后执行拥塞避免算法。

原文地址:https://www.cnblogs.com/yongjin-hou/p/14361571.html