TCP协议:超时重传、流量控制、keep-alive和端口号,你真的了解吗?

发布时间 2023-11-06 09:12:03作者: 努力的小雨

引言

在之前的讲解中,我们已经介绍了TCP协议的一些面试内容,相信大家对于TCP也有了一些新的了解。今天,我们将继续深入探讨TCP的超时重传、流量控制、TCP的keepalive机制以及端口号等相关信息。这些内容对于理解TCP协议的工作原理和实际应用非常重要,希望可以加深大家对TCP协议的理解。

TCP 的超时重传时间是如何计算的

TCP具有超时重传机制,即当一个数据包没有收到确认回复时,会在一定的时间间隔后进行重传。这个时间间隔被称为超时重传时间(Retransmission TimeOut,简称RTO)。

image

经典方法(适用 RTT 波动较小的情况)

往返时延(RTT)是指数据从发送端到接收端并返回发送端所需的时间。

一种简单的方法是取RTT的平均值,例如:第一次RTT为500ms,第二次RTT为800ms,那么第三次发送时,可以将两次RTT取平均得到RTO为650ms。

为了确定超时重传时间和更准确地估计RTT,经典算法引入了「平滑往返时间」(Smoothed round trip time,SRTT):每次测量RTT后,都对SRTT进行更新计算,使其更加平滑和准确。

image

平滑因子α是用于计算平滑往返时间(SRTT)的一个参数,建议取值范围为0.8至0.9。具体而言,当α为0.8时,SRTT的计算公式为80%的原始值加上20%的新采样RTT值。

当α趋近于1时,SRTT会更接近上一次的SRTT值,对新的RTT值的影响较小。这意味着对于短暂的时延变化,SRTT会表现出较低的敏感性。

相反,当α趋近于0时,1-α趋近于1,SRTT会更接近新采样的RTT值,与旧的SRTT值的关系较小。这意味着对于时延的变化,SRTT会表现出更高的敏感性,能够更快速地跟随时延的变化而调整。

通过调整平滑因子α的取值,TCP可以根据网络环境的不同情况来灵活地调整SRTT的计算方式,以适应不同的时延变化。这样可以提高TCP的适应性和性能,使其能够更好地应对网络条件的变化。

能不能说一说 TCP 的流量控制

当发送方发送数据时,TCP使用流量控制机制来确保接收方能够处理所发送的数据量。流量控制的目的是防止接收方因为数据过载而无法处理,从而导致数据丢失或者网络拥塞。

TCP的流量控制基于滑动窗口机制。滑动窗口是一个动态的窗口大小,它表示了发送方可以连续发送给接收方的数据量。接收方通过发送ACK(确认)消息来通知发送方当前可接收的数据量,发送方根据接收方的窗口大小来调整发送的数据量。

具体来说,当建立TCP连接时,发送方和接收方会协商一个初始的窗口大小,称为初始窗口。初始窗口大小取决于接收方的接收能力和网络条件。发送方会根据初始窗口大小发送数据,接收方接收到数据后会发送ACK消息来确认接收。

在数据传输过程中,接收方会不断更新窗口大小,通常通过TCP报文段中的窗口字段来告知发送方当前可接收的数据量。发送方根据接收方的窗口大小来调整发送的数据量,以确保发送的数据不会超过接收方的处理能力。

如果接收方的窗口变小,发送方会减少发送的数据量以避免数据丢失或拥塞。当接收方的窗口变大时,发送方可以增加发送的数据量,从而提高数据传输的效率。

image

接收窗口(接收缓冲区中空闲的部分)

image

发送端的数据包的状态

在网络通信中,存在以下几种状态:

  1. 已发送且已确认:表示数据已经成功发送到接收端,并且接收端已经发送确认信息回来。
  2. 已发送但未确认:表示数据已经发送到接收端,但接收端尚未发送确认信息回来。
  3. 未发送但接收端可以接收:表示接收端已经准备好接收数据,但发送端尚未发送数据。
  4. 未发送且不可发送:表示接收端暂时没有足够的空间来接收数据,因此发送端暂时无法发送数据。

image

发送端速度比较慢的情况

image

发送端速度比较快的情况

image

如何理解 TCP 的keep-alive的原理

TCP的Keep-Alive机制是为了确保在长时间没有数据传输的情况下,能够检测和保持TCP连接的活跃状态。它通过定期发送Keep-Alive报文来确认连接是否仍然有效。在一个TCP连接上,如果通信双方都不向对方发送数据,那么TCP连接就不会有任何数据交换。假设应用程序是一个web服务器,如果客户端在三次握手之后发生故障宕机或者断开网络连接,对于web服务器而言,下一个数据包将永远无法到来,但是它对此一无所知。因此,通过使用Keep-Alive机制,TCP可以定期发送探测报文来检测连接是否仍然有效,如果连接超过一定时间没有收到对方的应答,就可以主动关闭连接,从而避免资源的浪费。

image

TCP协议的设计者考虑到了检测长时间死连接的需求,因此设计了Keep-Alive机制。它的作用是通过定时发送探测报文来检测连接的对端是否存活,从而探测对端的连接是否失效。然而,默认情况下,TCP需要经过7200秒(2小时)没有数据包交互才会发送Keep-Alive探测报文。这个时间对于一些应用来说可能太长了,所以很多组件并没有开启Keep-Alive特性,而是选择在应用层实现心跳机制来保持连接的活跃状态。通过在应用层定时发送心跳包,可以更及时地检测连接的状态,并且可以根据实际需求进行灵活的设置。这样可以更好地满足应用程序对连接可靠性的要求。

聊⼀聊TCP中的端口号

在TCP中,端口号是用于标识不同应用程序或服务的。它是一个16位的无符号整数,范围从0到65535。TCP连接是通过源IP地址、源端口号、目标IP地址和目标端口号来唯一标识的。端口号分为两种类型:系统端口和动态端口。

端口号与网络分层

image

TCP使用两字节的整数来表示端口号。每台主机最大允许65536个端口号。

其中前1024个端口号是系统端口(也称为众所周知的端口),用于预留给一些特定的服务或应用程序使用。例如,HTTP通信一般使用端口号80,HTTPS通信一般使用端口号443,FTP使用端口号21等。系统端口号在操作系统中已经预定义好了。

已登记的端口号范围是1024~49151,其中包括一些常见的服务和应用程序的端口号,例如MySQL使用端口号3306,Redis使用端口号6379,MongoDB使用端口号27017等。

而临时端口号的范围是49152~65535,用于临时分配给客户端应用程序使用。通过使用端口号,TCP可以实现多对多的通信。

总结

本文深入探讨了TCP协议的超时重传、流量控制、keep-alive机制及端口号等相关内容。超时重传是根据RTT计算的,通过平滑往返时间(SRTT)来灵活调整超时重传时间。流量控制使用滑动窗口机制,根据接收方窗口大小调整发送数据量。Keep-alive机制通过定期发送探测报文保持TCP连接活跃。端口号用于标识应用程序或服务,分为系统端口和动态端口。这些内容对于理解TCP协议的工作原理和应用非常重要。

以上只是一篇关于TCP协议的面试文章的一小部分内容。后续将会提供更多有针对性的面试题,以深入探讨TCP协议的相关细节。