网络协议(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。

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

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

相关文章

Flask 用 Redis 缓存键值对-实例

Flask 使用起 Redis 来简直就是手到擒来,比 MySQL 简单多了,不需要那么多配置,实际代码就这么多,直接复制就能用。除了提供简单实用的实例以外,本文后面还会简单介绍一下 Redis 的安装与使用,初学者也能一看…

Linux笔记之三

Linux笔记之三 一、用户组管理二、磁盘管理三、进程管理总结 一、用户组管理 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理(开发、测试、运维、root)。不同Linux系统对用户组的管理涉及用户组的添加、删除和修改。…

8. Python3 pandas数据分析处理库

11.1 pandas的数据结构 pandas的数据结构如下图所示: pandas的几种数据结构有内在联系,可以吧DataFrame看作Series的容器,把Panel看作DataFrame的容器。可以像操作字典那样在这些数据结构中插入或者移除数据对象。在介绍这些数据结构之前&am…

排序相关算法--1.插入排序+冒泡排序回顾

1.基本分类 2.插入排序 特点:有实践意义(例如后期快排的优化),适应性强,一般不会到时间复杂度最坏的情况。 将第一个元素视为已经排好序的序列。取出下一个元素,在已经排好序的序列中从后往前比较&#xf…

一天20MW!天途推出无人机全自主光伏巡检平台

01 光伏电站的运维挑战 光伏发电为人类提供了可持续的清洁能源供给。一般集中式电站建设在空旷的地区,如荒地、沙漠等地区;分布式电站建设在用户的屋顶和建筑物表面,如住宅、商业建筑、工业厂房等地区。 随着光伏电站的大规模的使用&#x…

FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流

SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。 相比之下,另一款APP直播框架RT…

第三期书生大模型实战营 第2关 Python 基础知识

第三期书生大模型实战营 第2关 Python 基础知识 第三期书生大模型实战营 第2关 Python 基础知识Python 基础函数定义常见的内置方法replace(old, new)lower()split() 字典dict 使用Python实现词频统计使用VSCode进行调试总结 第三期书生大模型实战营 第2关 Python 基础知识 Hel…

详细分析Java中的@EventListener事件监听器(附Demo)

目录 前言1. 基本知识2. Demo 前言 Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)Spring框架从入门到学精(全) 1. 基本知识 用于标注一个方法为事件监听器 事件监听器方…

ArduPilot开源飞控之AP_Mount_Siyi

ArduPilot开源飞控之AP_Mount_Siyi 1. 源由2. 框架设计2.1 类和继承2.2 公共方法2.3 保护方法2.4 私有成员和方法2.5 解析状态2.6 重要成员变量 3. 重要方法3.1 AP_Mount_Siyi::init3.2 AP_Mount_Siyi::update3.3 AP_Mount_Siyi::read_incoming_packets3.4 AP_Mount_Siyi::proc…

哈斯机床采集数据

哈斯自身也有一套设备采集监控系统,但是软件和架构功能都比较老,再加上不能兼容其他数控系统,所以即使免费送给客户,客户的使用意愿也十分有限。 哈斯系统市面上常见就串口和网口两种形式。关于市面上机床采集的问题:网…

Bash ——shell

Bash作为用户与操作系统之间的接口,让用户通过命令行输入各种指令来控制和操作计算机系统。 shell的两种解释: 1.linux命令解释器 Terminal 终端 ——》shell命令 ——》 Linux kernel (内核) Linux内核的作用: 1.…

15、电科院FTU检测标准学习笔记-基本性能

作者简介: 本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验 在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验 ———————————————————…

简单状压dp(以力扣464为例)

目录 1.状态压缩dp是啥? 2.题目分析 3.解题思路 4.算法分析 5.代码分析 6.代码一览 7.结语 1.状态压缩dp是啥? 顾名思义,状态压缩dp就是将原本会超出内存限制的存储改用更加有效的存储方式。简而言之,就是压缩dp的空间。 …

jdk中自带的并发类

1、seamplore 信号量 countDownLaunch:等待所有线程都完成,主线程在执行 CyclicBarrirer 内存屏障 exchanger 线程之间交换数据 phaser 阶段协同器 阻塞队列

AWS-WAF-Log S3存放,通过Athena查看

1.创建好waf-cdn 并且设置好规则和log存储方式为s3 2. Amazon Athena 服务 使用 (注意s3桶位置相同得区域) https://docs.aws.amazon.com/zh_cn/athena/latest/ug/waf-logs.html#waf-example-count-matched-ip-addresses 官方文档参考,建一个分区查询表…

C. Earning on Bets

题目 个人补充&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 #define ll long longconst int maxn 1e6 5, in…

C语言 | Leetcode C语言题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; char** summaryRanges(int* nums, int numsSize, int* returnSize) {char** ret malloc(sizeof(char*) * numsSize);*returnSize 0;int i 0;while (i < numsSize) {int low i;i;while (i < numsSize && nums[i] nums[i …

算法通关:004_1选择排序

代码一定要自己手敲理解 public class _004 {//选择排序&#xff0c;冒泡排序&#xff0c;插入排序//交换public static void swap(int[] arr,int i ,int j){int temp arr[i];arr[i] arr[j];arr[j] temp;}//选择排序public static void selectSort(int[] arr){if(arr null…

YOLOv10改进 | Conv篇 | 利用FasterBlock二次创新C2f提出一种全新的结构(全网独家首发,参数量下降70W)

一、本文介绍 本文给大家带来的改进机制是利用FasterNet的FasterBlock改进特征提取网络&#xff0c;将其用来改进ResNet网络&#xff0c;其旨在提高计算速度而不牺牲准确性&#xff0c;特别是在视觉任务中。它通过一种称为部分卷积&#xff08;PConv&#xff09;的新技术来减少…

NLP入门——词袋语言模型的搭建、训练与预测

卷积语言模型实际上是取了句子最后ctx_len个词作为上下文输入模型来预测之后的分词。但更好的选择是我们做一个词袋&#xff0c;将所有分词装在词袋中作为上下文&#xff0c;这样预测的分词不只根据最后ctx_len个分词&#xff0c;而是整个词袋中的所有分词。 例如我们的序列是&…