引言

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

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

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

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

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

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

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

平滑因子α是用于计算平滑往返时间(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报文段中的窗口字段来告知发送方当前可接收的数据量。发送方根据接收方的窗口大小来调整发送的数据量,以确保发送的数据不会超过接收方的处理能力。

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

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

发送端的数据包的状态

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

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

发送端速度比较慢的情况

发送端速度比较快的情况

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

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

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

聊⼀聊TCP中的端口号

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

端口号与网络分层

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-alive和端口号,你真的了解吗?的更多相关文章

  1. tcp设置超时重传

    TCP超时和重传的基础是怎样根据给定连接RTT设置RTO,若TCP先于RTT开始重传,可能会在网络中引入不必要的重复数据,反之,若延迟至远大于RTT的间隔发送重传数据,整体网络利用率会随之下降.由于R ...

  2. TCP/IP协议--TCP的超时和重传

    TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...

  3. TCP系列12—重传—2、Linux超时重传引入示例

    在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例.首先简单的描述一下测试过程 1.设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功 ...

  4. TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

  5. 计算机网络 学习笔记-传输层:TCP协议简介

    概述: TCP传输前先要建立连接 TCP在传输层 点对点,一条TCP只能连接两个端点 可靠传输.无差错.不丢失.不重复.按顺序 全双工 字节流 TCP报文段 TCP报文段的报头前20字节是固定的,后面 ...

  6. 【转载】TCP协议疑难杂症全景解析

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...

  7. 服务器编程入门(3)TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  8. Linux 高性能服务器编程——TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  9. 【转载】TCP协议要点和难点全解

    说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象:对TCP已经有了全面了解的 ...

  10. 第3章 TCP协议详解

    第3章 TCP协议详解 3.1 TCP服务的特点 传输协议主要有两个:TCP协议和UDP协议,TCP协议相对于UDP协议的特点是 面向连接使用TCP协议通信的双方必须先建立连接,完成数据交换后,通信双 ...

随机推荐

  1. linux 字符集与编码格式相关

    字符集:​多个字符的集合. # 书写系统字母与符号的集合. 字符编码:​把 字符集 中的字符 编码为(映射)指定集合中的某一对象. # 以便文本在计算机中存储和通过通信网络的传递 查看文件的的编码格式 ...

  2. 理解TCP四次挥手

    以AB通电话举例: A的视角 A突然说,"现在几点了",进入FIN_WAIT_1 B回,"啊,10点了",A听到后不说话,进入FIN_WAIT_2 然后B说,& ...

  3. SpringBoot3之Web编程

    标签:Rest.拦截器.swagger.测试; 一.简介 基于web包的依赖,SpringBoot可以快速启动一个web容器,简化项目的开发: 在web开发中又涉及如下几个功能点: 拦截器:可以让接口 ...

  4. [超详细] GraalVM打包含有JNI的本地镜像

    GraalVM 是一种高性能.多语言通用虚拟机和编译器技术.它由 Oracle 开发并开源,旨在为不同的编程语言和应用场景提供统一的运行时环境和编译器平台.以下是 GraalVM 的一些主要特点和功能 ...

  5. 机器学习-评价指标-AUCROC

    The Area Under the Receiver Operating Characteristic (AUC-ROC) curve is a performance metric commonl ...

  6. 魔术方法__getitem__

    Python中的魔术方法_getitem_ python中有许多的魔术方法,下文主要对_getitem_()进行介绍.__ 在python中_getitem_(self, key):方法被称为魔法方法 ...

  7. FastDFS入门

    一.系统架构 二.构成部分 1.Tracker Server:跟踪服务器,记录文件信息,可单台或集群部署. 2.Storage Server:存储服务器,文件存储位置,分卷或分组部署. 3.Clien ...

  8. 《Hadoop3.X大数据开发实战(视频教学版)》新书来啦!

  9. [Python] #!/usr/bin/python 与 #!/usr/bin/env python 的区别

    区别是什么呢? #!/usr/bin/python 系统在执行这个脚本的时候, 调用固定路径的python解释器 #!/usr/bin/env python 防止用户没有吧py安装到usr/bin目录 ...

  10. numpy中矩阵的逆,求解,特征值,特征向量

    逆:numpy.linalg.inv() # 求矩阵的逆import numpy as npa=np.mat('1 0;0 1')#生成一个矩阵print(type(a))b=np.linalg.in ...