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

news2024/11/13 16:03:27

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。

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

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

相关文章

深度探讨:无法恢复主文件表的困境与解救之道

在数据存储与管理的复杂世界中,主文件表(Master File Table, MFT)作为文件系统的核心组件,承载着至关重要的角色。一旦遭遇无法恢复主文件表的困境,用户将面临数据访问受限、文件丢失等严重后果。这通常是由于硬件故障…

火柴棒图python绘画

使用Python绘制二项分布的概率质量函数(PMF) 在这篇博客中,我们将探讨如何使用Python中的scipy库和matplotlib库来绘制二项分布的概率质量函数(PMF)。二项分布是统计学中常见的离散概率分布,描述了在固定次…

力扣 hot100 -- 动态规划(下)

目录 💻最长递增子序列 AC 动态规划 AC 动态规划(贪心) 二分 🏠乘积最大子数组 AC 动规 AC 用 0 分割 🐬分割等和子集 AC 二维DP AC 一维DP ⚾最长有效括号 AC 栈 哨兵 💻最长递增子序列 300. 最长递增子序列…

GPT-4o不香了, Claude3.5 Sonnet来了,直接免费可用

大家好!我是YUAN。 刚刚! AI领域又迎来了一场新的风暴——Anthropic公司发布了全新的Claude 3.5 Sonnet模型,这一消息如同一颗重磅炸弹,震撼了整个科技界。 Claude 3.5 Sonnet与GPT-4o对比 性能飞跃:超越GPT-4o Cl…

如何修改node_modules里的代码

为什么要改node_modules? 在平常的开发中,其实是很少需要改 node_modules 里的代码的。但是如果npm包有点小问题或者不符合我们的场景。 应该怎么改才能是最好的呢? 方法一:直接改 这种很好懂,就是直接进 node_modu…

SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis

前言 RedisTemplate 是 Spring Boot 访问 Redis 的核心组件,底层通过 RedisConnectionFactory 对多种 Redis 驱动进行集成,上层通过 XXXOperations 提供丰富的 API ,并结合 Spring4 基于泛型的 bean 注入,极大的提供了便利&#x…

D-DPCC: Deep Dynamic Point Cloud Compression via 3D Motion Prediction

1. 论文基本信息 发布于: 2022 2. 创新点 首先提出了一种端到端深度动态点云压缩框架(D-DPCC),用于运动估计、运动补偿、运动压缩和残差压缩的联合优化。提出了一种新的多尺度运动融合(MMF)模块用于点云帧间预测,该模块提取和融合不同运动流…

网络安全----防御----防火墙安全策略组网

防火墙组网 要求: 1,DMz区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问。 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.…

3d模型选不中任何东西是什么原因?---模大狮模型网

在进行3D模型设计过程中,有时会遇到无法选择模型中的任何元素的问题。这种情况可能会影响设计师的工作效率和体验,因此了解问题的原因以及如何解决是至关重要的。本文将探讨在3D建模中遇到无法选中模型元素的原因及解决方法。 一、问题原因分析 无法选中…

1.9-改进的CBOW模型的实现

文章目录 0引言1 CBOW模型的重构1.1模型初始化1.2模型的前向计算1.3模型的反向传播 2总结 0引言 前面讲述了对word2vec高速化的改进: 改进输入侧的计算,变成Embedding,即从权重矩阵中选取特定的行;改进输出侧的计算,包…

最新的数据防泄密方案来袭!

沙箱技术作为一种先进的数据安全解决方案,在数据防泄密领域发挥着日益重要的作用。它通过构建一个隔离的虚拟环境,使得应用程序在该环境中运行,从而隔离了应用程序对系统资源的直接访问,有效防止了数据泄露的风险。 一、沙箱技术在…

[C++] 轻熟类和对象

类的定义 格式规范 class为定义类的关键字,后有类名,类的主体存于{}中;类定义结束时后面的分号不能省略;类体的内容成为类的成员,类中的变量成为成员变量,函数成为方法或成员函数;C兼容C语言的…

[spring] Spring MVC - security(上)

[spring] Spring MVC - security(上) 这部分的内容基本上和 [spring] rest api security 是重合的,主要就是添加 验证(authentication)和授权(authorization)这两个功能 即: 用户…

SpringBoot的老年慢性病药物管理系统-计算机毕业设计源码70568

目录 摘要 Abstract 第一章 绪论 1.1 选题背景及意义 1.2 国内外研究现状 1.3 研究方法 第二章 相关技术介绍 2.1 MySQL简介 2.2 Java编程语言 2.3 B/S模式 2.4 springboot框架 第三章 老年慢性病药物管理系统 系统分析 3.1 系统目标 3.2 系统可行性分析 3.2.1 技…

STM32中断学习记录

文章目录 NVICNVIC是什么NVIC寄存器NVIC 结构体NVIC 相关固件库函数 如何定义优先级中断编程外部中断 EXTIEXIT 外部中断/事件控制器EXIT的使用EXTI内部寄存器分析GPIO触发中断例程为什么中断后要清除中断标志位 SysTick的使用SysTick分析 NVIC NVIC是什么 待补充.........NVI…

ChatTTS的爆火是必然,它正在重新定义我们与机器对话的方式

当AI技术与语音合成相遇,开源技术众多,为什么 ChatTTS 能够一夜爆火?你有听说过能说情感真切文字的 AI 吗? 前言 想象一下,你只需输入一句话,AI就能念得声情并茂,不仅支持中英文混读&#xff0…

自注意力简介

在注意力机制中,每个查询都会关注所有的键值对并生成一个注意力输出。如果查询q,键k和值v都来自于同一组输入,那么这个注意力就被称为是自注意力(self-attention)。自注意力这部分理论,我觉得台大李宏毅老师…

一位互联网公司项目经理繁忙的一天

早晨:准备与计划 7:00 AM - 起床与准备 项目经理起床后,快速洗漱并享用早餐。之后花几分钟查看手机上的邮件和消息,确保没有紧急事务需要立即处理。 7:30 AM - 通勤时间 前往公司。在通勤途中,通过手机或平板电脑查看当天的会议…

硅谷甄选运营平台-vue3组件通信方式

vue3组件通信方式 vue2组件通信方式: props:可以实现父子组件、子父组件、甚至兄弟组件通信自定义事件:可以实现子父组件通信全局事件总线$bus:可以实现任意组件通信pubsub:发布订阅模式实现任意组件通信vuex:集中式状态管理容器,实现任意组件通信ref:父…

简单了解下安全测试!

一、基本概念 安全测试是在软件产品开发基本完成时,验证产品是否符合安全需求定义和产品质量标准的过程。它主要检查系统对非法侵入渗透的防范能力,旨在通过全面的脆弱性安全测试,发现系统未知的安全隐患并提出相关建议,确保系统…