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

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

时间:2023-11-06 09:26:02浏览次数:43  
标签:重传 TCP keep 发送 RTT 接收 端口号

引言

在之前的讲解中,我们已经介绍了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协议的相关细节。

标签:重传,TCP,keep,发送,RTT,接收,端口号
From: https://www.cnblogs.com/guoxiaoyu/p/17788194.html

相关文章

  • haproxy+keepalived部署高可用k8s集群
    四台机器节点名称节点ip节点角色基础配置1、升级机器内核2、将机器ip名称写入到/etc/hosts中3、基础环境准备#关闭防火墙,selinuxsystemctlstopfirewalldsystemctldisablefirewalldsed-i's/enforcing/disabled/'/etc/selinux/configsetenforce0##关闭swaps......
  • Windows根据端口号查询pid并杀死进程
    1、例如现在要查杀8080端口netstat-aon|findstr"8080"可以看到pid是141242、查看该pid进程tasklist|findstr"14124"3、杀死进程taskkill-pid14124-f4、其它方式杀死进程上面找到pid则可以直接通过任务管理器看到进程,在这里更直观吧,然后右键结束就行了。......
  • zookeeper源码(03)启动流程
    本文将从启动类开始详细分析zookeeper的启动流程:加载配置的过程集群启动过程单机版启动过程启动类org.apache.zookeeper.server.quorum.QuorumPeerMain类。用于启动zookeeper服务,第一个参数用来指定配置文件,配置文件properties格式,例如以下配置参数:dataDir-数据存储目......
  • 在CentOS7上更改端口号时报错:Job for sshd.service failed because the control proce
    1、问题描述在在CentOS7×上更改端口号时报错:“Jobforsshd.servicefailedbecausethecontrolprocessexitedwitherrorcode.See‘systemclstatus&sshdservice"andfournalctixe'fordetails.”2、修改ssh端口号的方法sudovim/etclssh/sshd_config将“#Port......
  • nginx+keepalived实现nginx服务的高可用
    本章教程,简单介绍如何利用keepalived实现nginx服务高可用。keepalived是一个开源的高可用性解决方案,它可以在Linux系统上实现负载均衡和故障转移。它主要用于确保在服务器集群中的主服务器出现故障时,能够快速切换到备用服务器,从而保证系统的可用性。keepalived通过VRRP(VirtualRout......
  • 1、Keepalived原理使用
    keepalived是一个类似于layer3,4&5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web......
  • K8s - 安装部署Kafka、Zookeeper集群教程(支持从K8s外部访问)
    本文演示如何在K8s集群下部署Kafka集群,并且搭建后除了可以K8s内部访问Kafka服务,也支持从K8s集群外部访问Kafka服务。服务的集群部署通常有两种方式:一种是 StatefulSet,另一种是 Service&Deployment。本次我们使用 StatefulSet 方式搭建 ZooKeeper 集群,使用 Service&Deployme......
  • zookeeper 的安装和配置
    一、下载zookeeper以zookeeper-3.4.10为例:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/二、上传到Linux服务器我使用的是WinSCP进行上传,下载地址:https://dl.pconline.com.cn/html_2/1/86/id=7244&pn=0&linkPage=1.html三、安装解压tar包(我是解压到家目录......
  • 利用 zookeeper 的分布式锁实现秒杀
    常见的业务场景:x年x月x日x点x分x秒,限时抢购10件商品。前提:分布式的环境,多用户高并发访问。依赖的jar包<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0htt......
  • Zookeeper 创建6种的节点实例(转)
    原文:https://blog.csdn.net/pengweismile/article/details/115444734作者:伟娃娃Zookeeper是ApacheHadoop的一个子项目,它主要用来解决分布式系统中经常遇到的一些数据管理问题,例如,统一命名,状态同步,集群管理,分布式应用配置管理。Zookeeper的定位,这个动物园的管理者,如下图ooke......