引言

在之前的讲解中,我们已经介绍了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. Spring-Bean的依赖注入的数据类型

    Spring-Bean的依赖注入的数据类型 除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入 数据的三种数据类型 普通数据类型 引用数据类型 集合数据类型 普通数据类型 public ...

  2. debezium同步postgresql数据至kafka笔记

    实验环境 全部部署于本地虚拟机 debezium docker部署 postgresql.kafka本机部署 1 postgresql 1.1 配置 设置postgres密码为123 仿照exampl ...

  3. 如何在CMD窗口运行python文件

    进入文件所在的路径输入: python  文件名

  4. 大二暑期实习记录(一):处理组件绑定数据错误(数组解构,map()方法)

    好家伙,搬砖   今天在做组件迁移(从一个旧平台迁移到一个新平台)的时候,发现了一些小小的问题: 1.错误描述: 在穿梭框组件中,使用"节点配置"方法添加数据的时候,左测数据选择框 ...

  5. 不想引入mq?试试debezium

    有句话叫做"如无必要,勿增实体". 在一些小型项目当中,没有引入消息中间件,也不想引入,但有一些业务逻辑想要解耦异步,那怎么办呢? 我们的web项目,单独内网部署,由于大数据背景, ...

  6. CodeForces CF1846G 题解

    CodeForces CF1846G 题解 CodeForces题目链接 洛谷题目链接 标准答案是状压之后,转化成Dijkstra算法跑最短路.我这里提供一个不一样的思路. 题意简述 主人公得了病,有 ...

  7. springboot jar thin

    springboot jar thin springboot 应用 jar 瘦身.springboot jar 太大.jar与依赖包分离. 两种方法,第一种,spring-boot-thin-laun ...

  8. Electron-builder打包和自动更新

    Electron-builder打包和自动更新 前言 文本主要讲述如何为 electron 打包出来软件配置安装引导和结合 github 的 release 配置自动更新. electron-buil ...

  9. 如何通过API接口获取京东的商品评论

    如果您想要获取京东的商品评论,可以通过API接口来实现.这篇文章会介绍如何使用京东API接口获取商品的评论数据. 首先,您需要到京东开放平台注册成为开发者,然后创建一个应用程序.通过这个应用程序,您可 ...

  10. Hadoop环境安装与配置

    1.基础操作系统环境安装(略) 2.JDK的安装与配置 当前各大数据软件如Hadoop等,仍然停留在Java 8上,在本实验选用的是Java 8.在自己的Linux系统中,jdk可以使用如下命令进行一 ...