【Linux | 计网】TCP协议详解:从定义到连接管理机制

目录

1.TCP协议的定义:

2.TCP 协议段格式

3.TCP两种通信方式

4.确认应答(ACK)机制

解决“后发先至”问题

5.超时重传机制

那么, 超时的时间如何确定?

6.连接管理机制:

6.1.三次握手:

为什么需要3次握手,一次两次不行吗?

小结:

三次握手有以下优点:

6.2.四次挥手

为什么连接的时候是三次握手,关闭的时候却是四次握手?挥手的时候可以将ACK和FIN一起发送吗

1.TCP协议的定义:

TCP 全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制;

2.TCP 协议段格式

2.1.各个部分的含义:

  • 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;
  • 32 位序号/32 位确认序号 = 序号 + 1
  • 4 位 TCP 报头长度: 表示该 TCP 头部有多少个 32 位 bit(有多少个 4 字节); 所以TCP 头部最大长度是 15 * 4 = 60
  • 6 位标志位:
  1. URG: 紧急指针是否有效
  2. ACK: 确认号是否有效
  3. PSH: 提示接收端应用程序立刻从 TCP 缓冲区把数据读走
  4. RST: 对方要求重新建立连接; 我们把携带 RST 标识的称为复位报文段
  5. SYN: 请求建立连接; 我们把携带 SYN 标识的称为同步报文段
  6. FIN: 通知对方, 本端要关闭了, 我们称携带 FIN 标识的为结束报文段
  • 16 位窗口大小: 后面再说
  • 16 位校验和: 发送端填充, CRC 校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含 TCP 首部, 也包含 TCP 数据部分.
  • 16 位紧急指针: 标识哪部分数据是紧急数据;
  • 40 字节头部选项: 暂时忽略;

3.TCP两种通信方式

  1. 客户端每次发送数据,都会立刻接收到应答
  2. 客户端发送多个数据时,一次性返回多个应答

很明显方案二更加高效,但是方案二有一个缺陷,那就是如果多个应答中有一个应答丢失,如何知道是哪一个应答丢失呢?所以这就需要确认应答机制中的序列号和确认序号出马了!

4.确认应答(ACK)机制

什么是确认应答机制?
我们平时交流的时候,怎么确认对方接受到了我们传送的消息呢?就需要对方给我们传递一个应答消息表示对方已经接受到了我们的消息

基本原理:
TCP确认应答机制的核心思想是,发送方在发送数据后,接收方需要向发送方返回一个确认应答报文(ACK报文),以告知发送方数据已成功接收。这一机制确保了发送方能够知道其发送的数据是否已被接收方正确接收。

确认应答机制的特性:

  • 收到了应答就知道历史数据100%被对方收到了!这就是可靠性!
  • 如果应答没有成功传给对方呢?客户端就会认为数报文丢失了,就会重新再发送一次报文(超时重传机制)。

解决“后发先至”问题

在网络传输过程中,由于路径延迟和节点繁忙程度的不同,可能会出现“后发先至”的问题,即后发送的数据包先到达接收方。为了解决这个问题,TCP引入了序号和确认序号的概念,通过对数据进行编号,接收方可以准确地识别出每个数据包的顺序,并生成正确的确认序号。

TCP 将每个字节的数据都进行了编号. 即为序列号。

  • 发送序号(seq):用于标识发送方发送的每个数据包的起始字节序号。这样,接收方可以根据序号来重组乱序到达的数据包,确保数据的正确顺序和完整性。
  • 确认序号(ack):用于标识接收方期望从发送方接收到的下一个数据包的起始字节序号。它实质上是接收方告诉发送方:“我已经成功接收到了哪个序号之前的所有数据,请从这个序号开始发送后续的数据。”通过这一机制,发送方可以确认其发送的数据是否已被接收方正确接收,并据此决定是否需要重传某些数据包。

确认序号 = 收到的序号 + 1,表示该确认序号之前的数据,我们已经全部收到,下次发送请从确认序号开始!

比如1000,2000 , 4000 的数据到了,但是3000的没到,那么就先将1000, 2000的传给上层,等待3000再将4000一切交给上层。

这就保证了确认序号前的全部数据,我们都已经全部收到!

5.超时重传机制

  • 主机 A 发送数据给 B 之后, 可能因为网络拥堵等原因, 数据无法到达主机 B;
  • 如果主机 A 在一个特定时间间隔内没有收到 B 发来的确认应答, 就会进行重发;

超时重传会对发送的报文,并且没有收到应答的报文进行保存(在滑动窗口当中),方便我们进行重传!

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

因此主机 B 会收到很多重复数据. 那么 TCP 协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉.
这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果.

那么, 超时的时间如何确定?

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

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

  • Linux 中(BSD Unix 和 Windows 也是如此), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍.
  • 如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.
  • 如果仍然得不到应答, 等待 4*500ms 进行重传. 依次类推, 以指数形式递增.
  • 累计到一定的重传次数, TCP 认为网络或者对端主机出现异常, 强制关闭连接

6.连接管理机制:

6.1.三次握手:

  1. 第一次握手:客户端向服务器发送一个带有SYN(Synchronize Sequence Numbers,同步序列号)标志位的TCP数据包,请求建立连接。这个数据包中包含了客户端的初始序列号(ISN,Initial Sequence Number)。
  2. 第二次握手:服务器收到客户端的SYN请求后,会回复一个带有SYN和ACK(Acknowledgment,确认)标志位的数据包,称为SYN-ACK响应。这个响应中,服务器确认了客户端的SYN请求,并指定了服务器的初始序列号(ISN)。同时,服务器还会对客户端的初始序列号进行确认,即发送一个确认号(ACK号),表示已经收到客户端发送的序列号加1的数据。
  3. 第三次握手:客户端收到服务器的SYN-ACK响应后,会发送一个带有ACK标志位的数据包,表示确认了服务器的响应。这个ACK数据包中,客户端会确认收到了服务器的SYN响应,并指定了下一个要发送的序列号(即服务器的初始序列号加1)。至此,三次握手完成,TCP连接建立成功,双方可以开始进行数据传输

举个生活中的例子:

小帅想跟小美谈恋爱,小帅先对小美说:我喜欢你,我们在一起谈恋爱吧!这就是第一次握手。

小美接受到小帅的表白后,也相中了小帅,回应道:我也喜欢你,那我们什么时候开始呢?小美的应答就是第二次握手。

小帅说:就现在!这就是第三次握手,成功搭建通信流程!

为什么需要3次握手,一次两次不行吗?

一次握手就能成功的话,也就代表着不需要进行确认,那么万一有恶意的服务器一直发送SYN,而服务器需要维护大量的连接,维护连接又需要成本,那么就很容易引发SYN洪水,导致服务器崩溃二次握手也是一样的道理。

SYN洪水攻击对目标服务器的影响是巨大的。由于服务器资源被大量无效的SYN请求占用,合法的用户请求会被拒绝或延迟处理。这可能导致服务器无法提供正常的服务,甚至造成整个网络的瘫痪。

小结:

三次握手的关键是要确认对方收到了自己的数据报。这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,Ack = Seq + 1成立,就代表对方正确收到了自己的数据包。

3次握手完成的主要功能就是要确保双方做好发送数据的准备工作(双方都知道彼此已准备好)

三次握手有以下优点:

  1. 验证全双工:三次握手可以验证网络的连通性,因为三次回收中客户端和服务端都进行了收发数据!
  2. 确认双方意愿:三次握手可以保证双方都想要建立连接!可以达成一个共识!
  3. 成本低:四次握手和五次握手等不过也是为了完成前两个目的!而三次握手是成本最低的!

6.2.四次挥手

当数据传输完成后,TCP连接需要释放。连接释放的过程需要客户端和服务器之间通过四次交互来确认连接已经关闭,这四次交互被称为四次挥手。

  • 第一次挥手:Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。
  • 第三次挥手: Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。

为什么连接的时候是三次握手,关闭的时候却是四次握手?挥手的时候可以将ACK和FIN一起发送吗

在三次握手的时候,可以直接将SYN和ACK进行合并发送,

但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。

只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

客户端想要断开连接发送FIN,服务器收到之后发送ACK应答,但是服务器在大多数情况下是不会立刻断开连接,因为可能还有业务没有处理完所以ACK和FIN之间一定有一个时间差,这就导致了ACK不能和FIN一起发送。

TCP的三次握手一定能保证传输可靠吗?

不能!

三次握手比两次更可靠,但也不是完全可靠,而追加更多次握手也不能使连接更可靠了。因此选择了三次握手。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot系列之:创建Springboot项目,Springboot整合MyBatis-plus

Springboot系列之:创建Springboot项目,Springboot整合MyBatis-plus 一、快速创建Spring boot项目二、项目完整目录三、pom.xml四、application.yaml五、实体类六、mapper七、IService接口八、Service实现类九、配置类十、枚举十一、增删改查测试类十二、…

java基础面试题笔记(基础篇)

网上始终找不到令自己满意的面试题,所以我打算自己整理面试题,从简单的到难的,尽量简单准确描述回答降低大家理解和背的难度,有错误或者有更好的回答请在评论回复我,感谢大家。 什么是java? 回答&#xff…

编译 LLVM 源码,使用 Clion 调试 clang

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 1. LLVM 简介 LLVM 是一个开源的编译器基础架构,最初由 Chris Lattner 于 2000 年在伊利诺伊大学开发,后来成为一个广泛应用于编译器和…

[代码随想录打卡Day22] 理论基础 77. 组合 216.组合总和III 17.电话号码的字母组合

理论基础 有递归就有回溯。回溯搜索是一种纯暴力搜索算法。我们一层一层递归到最底层收获结果,比如下面我们最后一层1操作之后,我们只有撤销这个操作回退到上一个节点才能遍历该层的其他节点,这个回退撤销操作就是回溯。 回溯法&#xff0…

大模型工程化部署:使用FastChat部署基于OpenAI API兼容大模型服务

FastChat是加州大学伯克利分校LM-SYS发布的一个用于训练、服务和评估基于大型语言模型的聊天机器人的开放平台。 项目地址:https://github.com/lm-sys/FastChat.git 其核心功能包括: 最先进 LLM 模型的权重、训练代码和评估代码。 带有 WebUI 和与 Op…

102.【C语言】数据结构之用堆对数组排序

0.前置知识 向上调整: 向下调整: 1.对一个无序的数组排升序和降序 排升序问题 建大根堆还是小根堆? 错误想法 由小根堆的定义:树中所有的父节点的值都小于或等于孩子节点的值,这样排出来的数组时升序的,建小根堆调用向上调整函数即可(把画圈的地方改成<即可) arr未…

彻底理解微服务的作用和解决方案

一.微服务有什么好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东西好肯定会跟另一个东西比较&#xff0c;通常说微服务好会和单体项目进行比较&#xff0c;通常情况下微服务都是从单体项目拆分而来的&#xff0c;但是对于有些大型公司&#xff0c;不差钱&…

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问&#xff1f; 大家好&#xff0c;我是秋意零。今天分享Harbor相关内容&#xff0c;安装部分可完全参考官方文档&#xff0c;写的也比较详细。 安装Harbor 官方文档&#xff1a;https://goharbor.io/docs/2.12.0/install-config/ …

表单校验规则

这里简单记录下vue使用表单时候&#xff0c;给表单添加校验规则&#xff0c;直接上代码 <script setup>import { ref } from vue// 定义表单对象const form ref({account: ,password: ,agree: true})// 定义表单验证规则const rules {account: [{required: true, mess…

spf算法、三类LSA、区间防环路机制/规则、虚连接

1.构建spf树&#xff1a; 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…

电子电气架构 -- ASIL D安全实现策略

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

【Unity ShaderGraph实现流体效果之Function入门】

Unity ShaderGraph实现流体效果之Node入门&#xff08;一&#xff09; 前言Shader Graph NodePosition NodeSplit NodeSubtract NodeBranch Node 总结 前言 Unity 提供的Shader Graph在很大程度上简化了开发者对于编写Shader的工作&#xff0c;只需要拖拽即可完成一个视觉效果…

uniop触摸屏维修eTOP40系列ETOP40-0050

在现代化的工业与商业环境中&#xff0c;触摸屏设备已成为不可或缺的人机交互界面。UNIOP&#xff0c;作为一个知名的触摸屏品牌&#xff0c;以其高性能、稳定性和用户友好性&#xff0c;广泛应用于各种自动化控制系统、自助服务终端以及高端展示系统中。然而&#xff0c;即便如…

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字&#xff0c;我们会发现其中包含Spring&#xff0c;那么SpringMVC和Spring之间有怎样的关系呢&#xff1f; SpringMVC隶属于Spring&#xff0c;是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢&#xff1f; 回想web阶段&#x…

小白学多线程(持续更新中)

1.线程池技术 1.JDK中的线程池 JDK中创建线程池有一个最全的构造方法&#xff0c;里面七个参数如上所示。 执行流程分析&#xff1a; 模拟条件&#xff1a;10个核心线程数&#xff0c;200个最大线程数&#xff0c;阻塞队列大小为100。 当有小于十个任务要处理时&#xff0c…

UNity将脚本中的文本提示显示在编辑器中

正常情况下我们创建了一个脚本然后挂载到一个对象上只能看到这样的一个面板 如果我们想在编辑器里面添加一段提示就可以这样做 [Header("玩家的基本信息")] 然后就能在编辑器窗口中看到添加的提示了 注意&#xff1a;当参数少的时候确实没必要这样做&#xff0c;但…

数据结构 (8)线性表的应用——一元多项式的表示及应用

一、一元多项式的定义 一元多项式是代数学研究的基本对象之一&#xff0c;可以表示为&#xff1a; P_n(x) p_0 p_1x p_2xn 其中&#xff0c;p_0, p_1, ..., p_n 是数域 F 中的数&#xff0c;n 是非负整数&#xff0c;x 是变量。 二、一元多项式的线性表表示 在计算机中&…

【山大9009算法题】2015-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 线性表使用公式化描述方式存储。编写一个函数&#xff0c;从一给定的线性表A中删除值在x ~ y&#xff08;x到y&#xff0c;x<y&#xff09;之间的所有元素&#xff0c;要求以较高的效率来实现。提示&#…

【Mac】VMware Fusion Pro 安装 CentOS 7

1、下载镜像 CentOS 官网阿里云镜像网易镜像搜狐镜像 Mac M1芯片无法直接使用上述地址下载的最新镜像&#xff08;7.9、9&#xff09;&#xff0c;会一直卡在安装界面&#xff08;在 install 界面按 enter 回车无效&#xff09;&#xff0c;想要使用需要经过一系列操作&#…

机器学习周志华学习笔记-第5章<神经网络>

机器学习周志华学习笔记-第5章<神经网络> 卷王&#xff0c;请看目录 5模型的评估与选择5.1 神经元模型5.2 感知机与多层网络5.3 BP(误逆差)神经网络算法 5.4常见的神经网络5.4.1 RBF网络&#xff08;Radial Basis Function Network&#xff0c;径向基函数网络&#xff0…