相对于UDP,TCP具有三个主要特点:连接性、可靠性和面向数据流。所谓“连接”是指TCP中的连接管理机制,也就是著名的三次握手和四次挥手,就像打电话一样。要想正常通信,首先要与对方建立连接。这就是所谓的TCP的“连接”,面向数据流的机制,我们后面会讲到。今天我们要讨论的话题是:TCP是如何保证可靠性的?TCP之所以能够保证可靠性,主要是通过以下六种方式:校验和确认响应超时重传流量控制拥塞控制丢弃重复数据接下来我们详细看一下这几种方式的具体实现。1.ChecksumTCP协议的数据格式如下图所示:(来源:许旭如生xxrs)从上图可以看出“checksum”是存放在TCP头部的一段数据,而TCP的发送端和接收端会根据发送的数据使用相同的算法计算出一个16位的校验和,校验和随数据一起发送给接收端。接收端接收到数据后,会根据接收到的数据生成一个新的校验和,然后用新的校验和与传递过来的校验和进行比较。如果校验和相同,则表示正在传输数据。如果没有变化,则为有效数据,否则为无效数据,丢弃即可。Checksum基本算法TCP/UDP/IP等协议的checksum算法都是一样的,都是把数据流看成一个16位的整数流进行反复叠加计算。为了计算校验和,首先将校验和字段设置为0,然后对有效数据范围内的每16位进行二进制补码求和,并将结果存入校验和字段,如果数据长度为奇数,使向上一个字节0。接收数据时,还要对有效数据范围内的每个16位数字进行补码求和。由于接收方在计算过程中包含了发送方头部的校验和,如果在传输过程中头部没有错误,则接收方的计算结果应该是全0或者全1(详见实现,本质上是相同的)。如果结果不是全0或全1,则数据错误。2、确认响应确认响应机制是保证消息传递可靠性的关键手段,也是几乎所有消息中间件(MQ)中最常用的技术之一,如主流消息中间件RabbitMQ、Kafka、火箭MQ。响应机制就是我们常说的ACK(ACKnowledgeCharacter,确认符)。确认响应机制是TCP中保证消息可靠性的核心机制。你如何确保你发送的消息被对方接收到?最有效的方法无疑是对方告诉你收到了,这就是确认回复。确认响应的过程如下图所示:3.确认响应的过程中可能会出现两个问题:一是消息在发送过程中丢失;二是消息丢失。其次,消息在确认响应期间丢失。如下图所示:很明显,即使有确认响应机制,也不能保证消息不丢失,那怎么办呢?消息丢失也没关系。发送方确认消息丢失后,通过补偿同一条消息给接收方来解决?这就是超时重传机制。巧妙的超时重传机制TCP的超时重传机制在设计上也非常巧妙。为了保证消息在任何环境下的高效通信,TCP采用了“动态时间”超时重传机制。例如,如果消息是第一次丢失,发送方会在500ms后发送另一条消息。如果发送的第二条消息也丢失了,发送方会在1000ms后发送另一条消息。如果第三条消息也丢失了,它会在2000ms后发送另一条消息。如果报文经过一定次数还没有发送成功,那么TCP就会认为对方主机异常,会强行关闭连接。这就是TCP超时重传的主要原因实现过程。4.流量控制接收端处理数据的速度是有限的。如果发送端发送速度太快,接收端的缓冲区就会被填满。这时候如果发送端继续发送,就会造成丢包,进而造成丢包重传等一系列连锁反应。因此,TCP会根据接收端的处理情况动态调整发送数据的大小。这种机制称为流量控制(FlowControl)。5、拥塞控制拥塞控制是指TCP会根据当前网络情况动态控制发送数据量,以合适的速度传输数据。试想一下,如果TCP在不了解网络情况的情况下贸然向接收端发送大量数据,会导致更多的丢包和超时重传,进而引发一系列连锁反应,导致数据传输发生变化。慢的。TCP采用“慢启动”机制,先发送少量数据,探索路径,找出当前网络拥塞状态,然后决定以多快的速度传输数据。这就是拥塞控制机制。如果传输的数据很多,出现大量丢包,那么TCP会减少发送的数据量,然后慢慢尝试增加发送的数据量。以当前网速传输数据,这就是TCP拥塞控制的具体实现。6.丢弃重复数据由前面的知识我们知道,在确认响应时,由于确认响应报文的丢失,接收方可能会收到来自发送方的重复数据,如下图所示:而此时对于业务端,只需要一份数据,所以TCP也有丢弃重复数据的机制,保证业务端收到的数据是正确的。TCP会为每个发送的数据包添加一个数字。如果收到相同编号的数据包,则表示接收端得到了重复的数据包,可以丢弃。总结起来,TCP保证可靠性的手段主要有六种:校验和、确认响应、超时重传、流量控制、拥塞控制和丢弃重复数据。其中流量控制和拥塞控制很容易混淆。我们要清楚的知道,流量控制是对接收端接收能力的一种控制机制,而拥塞控制是对当前网络的一种控制机制,不要把它们搞混了。Reference&Acknowledgmentsblog.csdn.net/namelcx/article/details/6866720判断是非在自己,听别人说,得失看数字。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
