在这篇博客中介绍了连接管理机制,它是TCP协议保证可靠性的重要机制,除了该机制,还有许多实现可靠性得机制,本文中将一一进行介绍。
1. 确认应答(ACK)机制
在TCP的协议报头中有两个字段:序列号和确认序列号。这两个字段就是来保证确认应答机制的。
发送方A将要发送的多个数据段排好序发送给接收端B。比如说A要发送序列号为1~1000的数据段。B如果将这些数据全部正确接收了,就会给A发送一个1001的确认序列号,用于告诉A,它之前发送的1~1000已经被正确接收,下次从1001开始发送。如果B只接受到了1~500,此时就会给B发送501的确认序列号,A收到后会知道500~1000的报文丢失,就会重新发送500~1000的报文段给B。此时就保证了数据的可靠传输。
因为TCP协议是全双工通信,双方都可以作为发送方和接收方,因此每一方都需要一个序列号和确认序列号来保证数据的可靠传输。
设置序列号同时也可以保证发送的数据按序到达,如果多个数据段在发送过程中可能到达的先后顺序可能不同,因此可能会导致接受到的数据与发送时的顺序不一致,通过序列号可以保证数据按序到达,也能够保证数据的可靠性传输。
如果接收端接收到重复的数据段后,也可以通过序列号来进行去重,保证可靠性。
综上,序列号和确认序列号的作用有以下几点:
(1)保证确认应答机制;
(2)保证数据按序到达;
(3)保证去重机制。
2. 超时重传机制
当主机A向主机B发送数据报后,一段时间内A没有收到B的确认信号,就会进行重传。造成重传的原因有两个:
(1)A向B发送的数据在传输过程中丢失,那么A再次重传数据时,就可以保证数据可靠送达;
(2)如果B接收到A的数据了,但B发给A的ACK确认信号在传输过程中丢包了,此时,A再次重传时,B就会接收到重复的数据,此时B就可以根据报文中的序列号进行去重,保证数据的可靠性传输。
超时重传的时间如何设定呢?
如果时间设置的太长,当数据报丢失时,就会影响重传的效率;如果时间设置的太短,当ACK包延迟时,就会重传大量的数据包。所以这个时间最好是能保证ACK一定能到达的最短时间。
TCP协议通过动态计算这个超时重传的时间。
在Linux中,超时重传的时间间隔是500ms的2^n倍(n = 0,1,...)。如果第一次发送数据报之后,500ms内没有收到ACK确认,则进行重传;然后在2*500ms内没有收到ACK确认,再次进行重传;再等4*500ms,还没收到确认,再次进行重传;...当重传的次数超过一定的上限后,TCP会认为此时的网络或对方的连接出现异常,会强制关闭连接。
因此,在进行数据传输时,主机A在发送完数据报之后,会先设置一个闹钟,如果在闹钟没响之前ACK报达到,此时取消闹钟,进行后续的数据传输;如果闹钟超时了,ACK报还未到达,此时A就会重传数据,并重新设定闹钟为新的值。
3. 流量控制
如果发送端发送数据的速度过快,导致接收端的接受缓冲区被占满了。此