网络协议(TCP三次握手,四次断开详解)

TCP的详细过程:

TCP(传输控制协议)的三次握手和四次断开是其建立连接和终止连接的重要过程,以下是详细解释:
 
三次握手:
 
1. 第一次握手:客户端向服务器发送一个 SYN(同步)包,其中包含客户端选择的初始序列号(Sequence Number),此时客户端进入 SYN_SENT 状态
2. 第二次握手:服务器收到客户端的 SYN 包后,向客户端发送一个 SYN/ACK(同步确认)包,其中包含服务器选择的初始序列号,以及对客户端序列号的确认。此时服务器进入 SYN_RCVD 状态。
3. 第三次握手:客户端收到服务器的 SYN/ACK 包后,向服务器发送一个 ACK(确认)包,确认服务器的序列号。此时客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。


 
三次握手的目的是:
 
- 确认双方的接收和发送能力是否正常。
- 协商初始序列号,为后续的数据传输做准备。

三次握手的序列号详细介绍

在 TCP 三次握手过程中,序列号(Sequence Number)和确认号(Acknowledgement Number)起到了关键的作用,用于保证数据的可靠传输和连接的正确建立。
 
以下是三次握手过程中序列号的详细介绍:
 
第一次握手:客户端发送连接请求报文,将 SYN 标志位置为 1,表示这是一个连接请求报文,并设置一个初始序列号 seq=x(x 为随机生成的数值)。此时客户端处于 SYN_SENT 状态。
 
第二次握手:服务器收到客户端的请求后,如果同意建立连接,会向客户端发送确认报文。SYN 标志位置为 1,表示这也是一个连接请求或连接接受报文;ACK 标志位置为 1,表示确认客户端的序列号有效。确认号 ack 设置为 x + 1,表示期望收到客户端的下一个字节的序列号为 x + 1;同时服务器也会生成自己的初始序列号 seq=y。此时服务器处于 SYN_RECV 状态。
 
第三次握手:客户端收到服务器的 SYN + ACK 报文后,检查确认号 ack 是否正确(即是否为 x + 1),以确保服务器已确认自己的序列号。然后设置 ACK 标志位为 1,表示确认服务器的序列号有效,确认号 ack 设置为 y + 1,表示期望收到服务器的下一个字节的序列号为 y + 1,同时设置自己的序列号 seq 为 x + 1(因为第二次握手时客户端的序列号还是 x,现在要发送下一个数据包,所以序列号递增 1)。服务器收到客户端的确认报文后,检查 ACK 标志位和确认号 ack 是否正确(即确认号是否为 y + 1),以确保连接建立成功。至此,客户端和服务器都进入 ESTABLISHED 状态,连接建立完成,可以开始进行数据传输。
 
序列号的作用是为了让接收方能够正确地重组数据包,确保数据的顺序性。而确认号则是接收方用来告知发送方已经成功接收的数据范围,发送方根据确认号来确定下一次应该发送的数据序列号。通过这种序列号和确认号的交互机制,TCP 能够保证数据的可靠传输,避免数据丢失、重复或乱序的情况发生。
 
需要注意的是,这里的序列号和确认号并不是固定不变的,而是在每次发送数据包时根据一定的规则进行递增或设置的。并且,在实际的网络环境中,为了便于分析和显示,抓包工具(如 Wireshark)通常会显示相对序列号和确认号,而不是实际的原始序列号。如果想要查看原始序列号,可以在相应的设置中取消相对序列号的显示。另外,初始序列号是随机生成的,这样可以增加安全性,防止攻击者预测序列号进行恶意攻击。


 
四次断开:
 
1. 第一次断开:客户端向服务器发送一个 FIN(结束)包,表示客户端没有数据要发送了,此时客户端进入 FIN_WAIT_1 状态。
2. 第二次断开:服务器收到客户端的 FIN 包后,向客户端发送一个 ACK 包,表示已经收到客户端的关闭请求。此时服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
3. 第三次断开:服务器处理完剩余的数据后,向客户端发送一个 FIN 包,表示服务器也没有数据要发送了,此时服务器进入 LAST_ACK 状态
4. 第四次断开:客户端收到服务器的 FIN 包后,向服务器发送一个 ACK 包,表示已经收到服务器的关闭请求。此时客户端进入 TIME_WAIT 状态,等待 2 倍的最大段生存期(MSL)后进入 CLOSED 状态,服务器收到客户端的 ACK 包后直接进入 CLOSED 状态,连接关闭。


 
四次断开的原因是:
 
- 保证数据的完整传输,让双方都有机会处理未完成的数据。
- 避免最后一个 ACK 包丢失导致的错误。

对于上述的包进行详细介绍

三次握手:
 
1.  SYN 包 :SYN 是 Synchronize 的缩写。SYN 包只有一个标志位 SYN 被设置为 1,用于发起连接请求。它还包含一个初始的序列号,用于后续数据传输的序号同步。
2.  SYN/ACK 包 :这个包既有 SYN 标志位被设置为 1,表示服务器同意建立连接,又有 ACK 标志位被设置为 1,用于确认收到客户端的 SYN 包。同时包含服务器自己选择的初始序列号。
3.  ACK 包 :ACK 是 Acknowledgment 的缩写。ACK 包的 ACK 标志位为 1,用于确认收到对方发送的数据或请求。在第三次握手中,用于确认服务器的 SYN/ACK 包。
 
四次断开:
 
1.  FIN 包 :FIN 是 Finish 的缩写。FIN 包的 FIN 标志位被设置为 1,表示发送方没有更多数据要发送,希望关闭连接。
2.  ACK 包 :在四次断开中,ACK 包用于确认收到对方的 FIN 包。
 
这些包中的标志位和序列号等信息协同工作,确保了 TCP 连接的可靠建立和安全关闭,保证了数据传输的准确性和完整性。

对上述各种状态进行详细介绍

三次握手过程中的状态:
 
- CLOSED:初始状态,表示连接尚未建立。
- LISTEN:服务器创建套接字后开始监听,等待来自任何远端 TCP 和端口的连接请求。
- SYN_SENT:客户端发送完建立 TCP 连接的请求报文后进入此状态,等待一个匹配的连接请求。
- SYN_RCVD:服务器收到客户端的 SYN 报文后向客户端发送 ACK 和 SYN 报文,此时服务器进入该状态,表示发送连接请求并且接收到匹配的连接请求以后,等待连接请求确认。
- ESTABLISHED:客户端收到服务器的 ACK、SYN 报文后,向服务器发送 ACK 报文,客户端和服务器端收到对方的 ACK 后都进入此状态,表示一个打开的连接,接收到的数据可以被投递给用户,即连接的数据传输阶段的正常状态。
 
四次挥手过程中的状态:
 
- FIN_WAIT_1:客户端先向服务器发送 FIN 报文,请求断开连接后进入此状态,表示等待远端 TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
- CLOSE_WAIT:服务器收到 FIN 后向客户端发送 ACK,进入此状态,表示等待本地用户的连接终止请求。
- FIN_WAIT_2:客户端收到服务器的 ACK 后进入此状态,表示等待远端 TCP 的连接终止请求。如果服务器还有数据要发送给客户端,就会继续发送,直到发完数据,才会发送 FIN 报文。
- LAST_ACK:服务器发送完数据后,发送 FIN 报文,进入此状态,表示等待先前发送给远端 TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)。
- TIME_WAIT:客户端收到服务器的 FIN 后,马上发送 ACK 给服务器,进入此状态。它需要等待足够的时间过去(2 倍的报文最大生存时间,即 2MSL)以确保远端 TCP 接收到它的连接终止请求的确认。这样做的两个理由是:可靠地实现 TCP 全双工连接的终止;允许老的重复分节在网络中消逝。
- CLOSED:表示不在连接状态(这是为方便描述假想的状态,实际不存在)。当服务器收到客户端的 ACK 后,也进入此状态,连接完全关闭。
 
另外,还有一个CLOSING 状态,它表示客户端发送了 FIN,但是没有收到服务器的 ACK,却收到了服务器的 FIN。这种情况发生在服务器发送的 ACK 丢包的时候,因为网络传输有时会有意外。

最大段生存期MSL详解以及为什么要等待两倍的MSL的原因

最大段生存期(Maximum Segment Lifetime,MSL)是指一个 TCP 分段(segment)可以存在于互联网系统中的最大时间。
 
MSL 的具体取值通常由操作系统决定,常见的取值为 30 秒、60 秒或 2 分钟等。例如,在一些 Unix 系统中,MSL 可能被定义为 30 秒;而在 RFC 793 中规定 MSL 为 2 分钟,但在实际应用中,对于现在的网络环境,2 分钟的 MSL 可能过长,因此 TCP 允许不同的实现根据具体情况使用更小的值。
 
在 TCP 连接关闭过程中,TIME_WAIT 状态持续的时间是 2MSL(即两倍的 MSL)。这样设计主要有以下两个原因:
 
1. 保证客户端(记为 A 端)发送的最后一个 ACK 报文段能够到达服务器端(记为 B 端):ACK 报文段有可能丢失,导致处在 LAST_ACK 状态的 B 端收不到对已发送的 FIN+ACK 报文段的确认。B 会超时重传这个 FIN+ACK 报文段,而 A 就能在 2MSL 时间内收到这个重传的 FIN+ACK 报文段,接着 A 重传一次确认,重新启动 2MSL 计时器。最后,A 和 B 都正常进入到 CLOSED 状态。如果 A 在 TIME_WAIT 状态不等待一段时间,而是在发送完 ACK 确认后立即释放连接,那么就无法收到 B 重传的 FIN+ACK 报文段,B 也就无法正常进入 CLOSED 状态。


2. 避免旧连接的数据包干扰新连接:如果 A 发送的第一个连接请求报文段因为某些原因在网络中长时间滞留,延误到连接释放后的某个时间才到达 B,这是一个已失效的报文段,但 B 并不知道,就可能会又建立一次连接。而等待 2MSL 可以使在本次连接持续时间内产生的所有报文段都从网络中消失,这样下一个新的连接中就不会出现这种旧的连接请求报文段。
 
在 2MSL 时间内,该地址上的连接(客户端地址、端口和服务器的端口地址)不能被使用。例如,在建立一个 TCP 连接后关闭连接,然后迅速重启连接,可能会出现端口不可用的情况。如果要在 2MSL 时间内复用端口,可以设置 SO_REUSEADDR 选项(但这种操作可能会带来一些风险,需要谨慎使用)。
 
TTL(Time to Live)是 IP 头部中的一个字段,表示 IP 数据报可以经过的最大路由数,每经过一个路由器,TTL 值减 1,当 TTL 值为 0 时数据报被丢弃,同时会发送 ICMP 报文通知源主机。TTL 与 MSL 是有关系的,但不是简单的相等关系,MSL 要大于 TTL。

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

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

相关文章

【python】QWidget父子关系,控件显示优先级原理剖析与应用实战演练

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

51单片机嵌入式开发:8、 STC89C52RC 操作LCD1602原理

STC89C52RC 操作LCD1602原理 1 LCD1602概述1.1 LCD1602介绍1.2 LCD1602引脚说明1.3 LCD1602指令介绍 2 LCD1602外围电路2.1 LCD1602接线方法2.2 LCD1602电路原理 3 LCD1602软件操作3.1 LCD1602显示3.2 LCD1602 protues仿真 4 总结 1 LCD1602概述 1.1 LCD1602介绍 LCD1602是一种…

室内精准定位哪个产品抗干扰能力强?可以用于哪些方面?

室内精准定位产品其实有很多,其实它是安装在室内接收型号的一个基站,并且范围有一定的限制,而被定位的人员需要携带定位产品,那么通过室内基站收集到的信息,将会通过专业的系统处理后呈现在相应的设备上,比…

elementui实现复杂表单的实践

简介 文章主要讲述在vue3项目中使用elementui框架实现复杂表单的方式。表单中涉及动态组件的生成、文件上传和富文本编辑器的使用,只会将在实现过程中较复杂的部分进行分享,然后提供一份完整的前端代码。 表单效果演示 基础信息 spu属性 sku详情 关键…

【机器学习】初学者经典案例(随记)

🎈边走、边悟🎈迟早会好 一、概念 机器学习是一种利用数据来改进模型性能的计算方法,属于人工智能的一个分支。它旨在让计算机系统通过经验自动改进,而不需要明确编程。 类型 监督学习:使用带标签的数据进行训练&…

【游戏客户端】大话slg玩法架构(二)背景地图

【游戏客户端】大话slg玩法架构(二)背景地图 大家好,我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构,关于SLG玩法的介绍可以参考这篇上一篇文章:【游戏客户端】制作率土之滨Like玩法 PS:和之前…

仕考网:公务员如何备考申论

在备战公务员考试的申论部分时,掌握一定的技巧,遵循特定的步骤是至关重要的。以下是一些备考策略,希望能帮助到大家: 1. 掌握考试大纲和命题趋势 在考试大纲中明确了题目的类型和可能涉及的主题范围,考生可以聚焦到关…

批量提取Word文档中表格内容

1 背景 有一个word文件,其中包含多个格式一致的表格(如下图),需要将其内容进行提取,填写到excel中 2 实现代码 ## 导入工具包 from docx import Document import pandas as pd## 读取 Word 文件 document Document(…

MySQL实现数据备份的方式可以基于哪几种?

MySQL 数据库实现数据备份的方式主要有以下几种: 物理备份 (Physical Backup): 冷备份 (Cold Backup):在数据库关闭的情况下,直接复制数据库文件(数据文件、日志文件等)。这种方式操作简单,但是…

UML类图的建立过程

1. 概念层类图 概念层的类图描述的是现实世界中对问题领域的概念理解,类图中表达的类与现实世界的问题领域中的实际事物有着明显的对应关系,类之间的关系也与问题领域中实际事物之间的关系有着明显的对应关系。在概念层类图阶段很少考虑或者几乎不需要考…

应急响应-ELK日志分析系统

🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…

3、视图和模板

续上一篇,这一篇 着重于创建公共接口——“视图” 第三部分——3、视图和模板 1、概述2、编写更多视图原理——django依次访问了什么文件 3、写一个真正有用的视图一个快捷函数 render() render——渲染 4、抛出404错误一个快捷函数 get_object_or_404() 5、使用模…

kvm图形化管理工具virt-manager安装

1、Virt-manager简介 Virt-manager是一个桌面用户界面,用于通过libvirt管理虚拟机。它主要针对KVM虚拟机,但也管理Xen和LXC(linux容器)。它提供了运行域、它们的实时性能和资源利用率统计信息的摘要视图。向导可以创建新域&#…

MFC扩展库BCGControlBar Pro v35.0 - 可视化管理主题等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了,这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

camera-qsc-crosstalk校准数据XTALK回写

问题背景 手机越做越紧凑,需要模组和芯片尺寸越做越小,在尺寸一定的基础上,高像素和大像素,对于手机摄像头来说,一直是一对矛盾的存在。 高像素:带来高分辨率画质大像素:带来暗态下高感光度和…

【MyBatis】——入门基础知识必会内容

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

Covalent Network(CXT)通过社区投票将代币迁移并更名为 CXT,以推动人工智能更深层次的创新

专注于人工智能和 Web3 的模块化数据基础设施 Covalent Network(CXT)宣布,其治理提案已通过社区投票并顺利实施,即将原生代币 CQT 迁移为新的 CXT 代币,并部署至新的合约。这一关键性转变标志着 Covalent Network&…

Android焦点之InputWindows的更新(一)

找到焦点窗口后,回到DisplayContent的updateFocusedWindowLocked方法中继续往下走 执行到此处会进行InputWindows的更新 InputMonitor#setInputFocusLw:以上过程伴随日志:WindowManager: Input focus has changed to Window{a44139a u0 Noti…

linux系统中SPI驱动框架以及代码的详解

大家好,今天给大家分享一下,如何使用SPI子系统,详细实现以及具体的操作方法。 第一:SPI驱动框架模板 参考内核头文件:include\linux\spi\spi.h。 1、SPI平台总线设备驱动模型 Linux驱动程序开始基于“平台总线设备驱动模型”,将驱动程序分为两块: * 左边注册一个platfo…

算法力扣刷题记录 四十一【N叉树遍历】

前言 依然是遍历问题。由二叉树扩展到N叉树遍历。 记录 四十一【N叉树遍历】 一、【589. N叉树的前序遍历】 题目 给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔…