传输层协议——TCP

TCP协议

TCP全称为“传输控制协议”,要对数据的传输进行一个详细的控制。

特点

  • 面向连接的
  • 可靠性
  • 字节流

TCP的协议段格式

在这里插入图片描述

  • 源/目的端口:表示数据从哪个进程来,到哪个进程
  • 4位首部长度:表示该TCP头部有多少字节(注意它的单位是4字节),因为TCP报头的范围为[20,60],所以4位首部长度范围就是[5,15]
  • 16位校验和:校验报文是否符合要求,不符合直接丢弃

6位标记位

  • URG:紧急指针是否有效
  • ACK:确认号是否有效
  • PSH:提示服务端立刻将TCP缓冲区的数据读走
  • RST:对方要求重新建立链接
  • SYN:请求建立连接,我们携带SYN标识的称为同步报文段
  • FIN:通知对方,本端将断开连接。

我将从下面的几个场景中来阐述一下TCP中协议段格式的每个含义。

ACK确认应答机制

在这里插入图片描述

当我们主机A发送数据的时候,主机B需要给主机A发送“已收到”(ACK),这时主机A开知道数据已经发送到了主机B。但如果主机B想要发数据给主机A,那么就又要需要一次write了,所以效率其实是不高的,所以有了后面的捎带应答。

捎带应答

我们发现,很多情况下,客户端服务器在应用层也是 "一发一收"的.意味着客户端给服务器说了 “How are you”,服务器也会给客户端回一个 “Fine,thank you”;那么这个时候 ACK就可以搭顺风车,和服务器回应的 "Fine, thank you"一起回给客户端

32位序号和32位确认序号

32位序号:在建立连接的时候,计算机会随机生成一个随机数作为初始值,当传送一次数据的时候,会累加上数据的大小。 用来解决网络中乱序的问题
32位确认序号:发送端接受到确认应答后,可以认为这个序号之前的序号全部被收到了。用来解决网络中丢包的问题

三次握手与四次挥手

TCP建立连接
在这里插入图片描述

  • 一开始的时候,客户端和服务端都是CLOSED状态,然后服务端去监听某个端口,然后处于LISTEN状态
  • 客户端就会去建立连接,然后会先初始化序号(clinet_isn),将SYN标记位置为1,然后将整个报头发送过去,之后客户端除以SYN_SENT状态
  • 服务端收到了来自客户端携带的SYN报头后,也会先初始化自己的序(server_isn)号,然后将确认应答设置为clinet_isn+1,,将TCP报头中ACK和SYN设置为1,然后将报文发送给客户端。之后状态为SYN_REVD
  • 最后客户端收到了来自服务端的数据,将TCP中ACK置为1,将确认序号设置为server_isn+1,然后将报文发送给服务端(这次可以携带数据),之后客户端状态为ESTABLISHED。

从上面的三次握手中可以看到,第二次服务端返回ACK和SYN的时候,其实就用到了捎带应答。 而且注意 前两次握手是不能发送数据的,而第三次是可以的。

四次挥手

在这里插入图片描述

  • 客户端首先会先发送携带FIN的报文给服务端,表示要断开连接。之后状态设置为FIN_WAIT_1
  • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSE_WAIT 状态。
  • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
  • 这时,服务端可能需要处理数据。之后会发送FIN报文,之后状态为LAST_ACK
  • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务端收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。

2MSL:刚好是客户端发送数据到服务端的时间 + 服务端发送数据回到客户端的时间(这样就确保再2MSL之后,再无数据处理了)

其实你看,三次握手因为捎带应答,合并成了一次,而四次挥手中,不合并是因为,服务端可能还会发送数据给客户端。
之所以被称为四次挥手,你看图中,是不是客户端和服务端都会发送FIN和ACK来表示自己要断开连接,一来一回刚好4次。

为什么是三次握手?1次可以吗?2次可以吗?4次可以吗?

先来回答一下为什么是三次握手

  • 需要确保通信是正常的。3次刚好可以验证TCP全双工
  • 确保双方OS是健康的,且愿意通信(各自发送ACK)

再聊一聊如果TCP1次和2次握手会发生什么事

  • 我们要知道建立连接是需要消耗资源的,所以如果有人恶意的发送大量SYN报文呢,并且不想接受数据,这样看,1次和2次握手是不是很不合理呢?

4次握手可以吗?

  • 当然可以,但是没必要,因为3次握手已经是最少可靠的连接建立了,并且保证了全双工。

超时重传机制

TCP要保证所有的数据包可以达到对方,就必须要有超时重传的机制。
在这里插入图片描述

  • 主机A发送数据给主机B,但由于网络的原因,数据没有到达主机B
  • 主机A在一个特定的时间间隔(这个时间间隔在不同的内核版本中是不同的)内没有收到主机B的数据,就会重新发送(注意重新传的SYN报文是一样的)。

但是,主机 A未收到 B发来的确认应答,也可能是因为 ACK丢失了

在这里插入图片描述

因此主机 B会收到很多重复数据.那么 TCP协议需要能够识别出那些包是重复的包,并且把重复的丢弃掉.
所以就有了序号,可以做到去重的效果。

那么最后一个问题来了??
超时的时间怎么确定呢??

  • 最理想的情况下,找到一个最小的时间,保证 “确认应答一定能在这个时间内返回”.
  • 但是这个时间的长短,随着网络环境的不同,是有差异的
  • 如果超时时间设的太长,会影响整体的重传效率
  • 如果超时时间设的太短,有可能会频繁发送重复的包

所以TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间.

  • Linux中(BSD Unix和 Windows也是如此),超时以 500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍.
  • 如果重发一次之后,仍然得不到应答,等待 2*500ms后再进行重传.
  • 如果仍然得不到应答,等待 4*500ms进行重传.依次类推,以指数形式递增.

重发的次数和操作系统有关。
在ubuntu20.04下是6次
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus监控ZooKeeper

1. 简介 ZooKeeper是一个分布式协调服务,在分布式系统中扮演着重要角色。为了确保ZooKeeper集群的健康运行,有效的监控至关重要。本文将详细介绍如何使用Prometheus监控ZooKeeper,包括安装配置、关键指标、告警设置以及最佳实践。 2. 安装和配置 2.1 安装ZooKeeper Exporter…

【手写数据库内核组件】0601数据库执行引擎常用的火山模型,与其它模型比较,实现原理以及解释器和迭代器的实现

0601 火山模型 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 0601 火山模型一、概述 二、火山模型介绍 三、实现机制 3.1 节点的定义 3.2 解释器实…

Windows 环境 Java 调用 batch 脚本实现 PG 数据库恢复功能

直接上代码 echo on rem set PG_ROOT_DIRD:\PostgreSQL\ rem 实例: recover_all_db.bat D:\PostgreSQL E:\ProjectCode\ums_vm_server-ums set PG_ROOT_DIR%1 set BASE_DIR%PG_ROOT_DIR%\pgsql REM SET PGHOST127.0.0.1 set PSQL"%BASE_DIR%\bin\psql.exe" set PG_D…

Protel DXP 面试题详解及参考答案(4万字长文)

解释Protel DXP的基本工作流程。 Protel DXP(现已更名为Altium Designer)是一款用于电子设计自动化(EDA)的软件,主要应用于印刷电路板(PCB)设计。其基本工作流程通常包括以下几个阶段: 项目创建与配置: 开始一个新的设计项目时,首先需要创建一个项目文件,在这个文件…

大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

SQL注入万字详解,基于sqli-labs(手注+sqlmap)

目录 一、什么是SQL 1.什么是SQL 2.SQL的作用 3.MySQL基础知识 4.SQL增、删、改语句 *5.SQL查询语句 二、什么是SQL注入 1.SQL注入原理: 2.SQL注入: 3.SQL注入危害: 4.SQL注入技术分类: 5.防御方法:使用参…

javaEE-01-tomcat

文章目录 javaWebTomcat启动 Tomcat 服务器测试服务器是否成功停止tomcat服务器修改服务器的端口号 Idea整合tomcat服务器 javaWeb 所有通过 Java 语言编写可以通过浏览器访问的程序的总称,是基于请求和响应来开发的。 请求: 客户端给服务器发送数据(Request)响应: 服务器给客…

萝卜快跑:自动驾驶的先锋与挑战

萝卜快跑:自动驾驶的先锋与挑战 近段时间,由萝卜快跑引发的自动驾驶事件如火如荼,成为科技领域的热门话题。萝卜快跑作为自动驾驶领域的重要参与者,其最新事件引发了广泛的关注和讨论。 萝卜快跑是百度推出的自动驾驶出行服务平台…

C语言 之 理解指针(5)

转移表 本章主要讲的是函数指针数组的用途&#xff1a;转移表 让我们来看看下面的代码&#xff1a; 计算器的一般实现&#xff1a; #include <stdio.h> int add(int a, int b) {return a b; //加法函数 } int sub(int a, int b) {return a - b; //减法函数 } int mul…

Pytorch使用教学2-Tensor的维度

在PyTorch使用的过程中&#xff0c;维度转换一定少不了。而PyTorch中有多种维度形变的方法&#xff0c;我们该在什么场景下使用什么方法呢&#xff1f; 本小节我们使用的张量如下&#xff1a; # 一维向量 t1 torch.tensor((1, 2)) # 二维向量 t2 torch.tensor([[1, 2, 3], …

common-intellisense:助力TinyVue 组件书写体验更丝滑

本文由体验技术团队Kagol原创~ 前两天&#xff0c;common-intellisense 开源项目的作者 Simon-He95 在 VueConf 2024 群里发了一个重磅消息&#xff1a; common-intellisense 支持 TinyVue 组件库啦&#xff01; common-intellisense 插件能够提供超级强大的智能提示功能&…

Ubuntu升级软件或系统

Ubuntu升级软件或系统 升级Ubuntu系统通常是一个相对简单的过程&#xff0c;但在进行操作之前&#xff0c;请务必备份重要数据以防万一。下面是升级Ubuntu系统的一般步骤&#xff1a; 使用软件更新工具升级系统 打开终端&#xff1a; 按下 Ctrl Alt T 组合键打开终端。 更…

Java设计模式—单例模式(Singleton Pattern)

目录 一、定义 二、应用场景 三、具体实现 示例一 示例二 四、懒汉与饿汉 饿汉模式 懒汉模式 五、总结 六、说明 一、定义 二、应用场景 ‌单例模式的应用场景主要包括以下几个方面&#xff1a; ‌日志系统&#xff1a;在应用程序中&#xff0c;通常只需要一个日…

【JS逆向课件:第十三课:异步爬虫】

回顾 并行和并发 表示程序/计算机具有处理多个任务的能力 并行表示可以同时处理多个任务&#xff08;几个多核CPU&#xff09;并发无法同时处理多个任务&#xff0c;但是可以基于时间片轮转法在多任务间快速切换的执行任务。 同步和异步 在基于并行或者并发处理任务的时候&am…

链式法则和自动求导

向量链式法则 说明&#xff1a; 1.第一个式子&#xff0c; y是标量&#xff0c;u是标量&#xff0c;x是n维向量 2.第二个式子&#xff0c;y是标量&#xff0c;u是k维向量&#xff0c;x是n维向量&#xff0c;所以y对u求导是k维的行向量&#xff0c;u对x求导是k行n列的矩阵&…

学术研讨 | 区块链治理与应用创新研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心组织&#xff0c;长安链开源社区支持的“区块链治理与应用创新研讨会”顺利召开&#xff0c;会议围绕区块链治理全球发展现状、研究基础、发展趋势以及区块链行业应用创新展开研讨。北京大学陈钟教授做了“区块链治理与应用创…

消息队列的面试题

目录 面试题消息队列的使用场景场景描述与数据数据流程与具体数据优势与数据支持流量控制的举例场景&#xff1a;在线视频平台的直播流传输场景描述流量控制策略数据与效果 面试题 为什么使用消息队列&#xff1f; 消息队列有什么优点和缺点&#xff1f; Kafka、ActiveMQ、Rab…

opencv:基于阈值的分割方法(固定阈值和自适应阈值)

1、基于阈值的分割 (1)固定阈值分割 将图像分为两个部分&#xff1a;黑和白两个区域 /*author 还下着雨ZG * brief 固定阈值图像分割 * param[in] imSrc, 待分割的图像 * param[out] imSegment, 分割后的图像 * param[in] threVal, 输入的阈值 * return, 返回正整数表示图像…

Ubuntu设置时区

Ubuntu设置时区 在 Ubuntu 中设置时区可以通过以下几个步骤来完成&#xff1a; 方法一&#xff1a;使用命令行 查看当前时区设置&#xff1a; 可以使用以下命令查看当前系统的时区设置&#xff1a; timedatectl如果你想要详细信息&#xff0c;可以运行&#xff1a; timedatec…

ESP32-S3-DevKitC-1开发记录帖——与MPU6050进行姿态检测

目录 MPU6050传感器——姿态检测 1.姿态检测 1.1 基本认识 1&#xff09;坐标系 2&#xff09;姿态角的关系 3&#xff09;陀螺仪检测的缺陷 4&#xff09;利用加速度计检测角度 5&#xff09;利用磁场检测角度 1.2 姿态融合与四元数 1.3传感器工作原理 1.4 MPU6050模…