3.TCP的三次握手和四次挥手

 一、前置知识

  TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在传输数据前通信双方必须建立连接(所谓连接,是指客户端和服务端各自保存一份关于对方的信息,比如ip地址,端口号等)。TCP通过三次握手建立一个连接,通过四次挥手释放一个连接。

  在了解TCP连接前,先了解TCP报文的头部结构:

  TCP报文段的头部结构主要包含以下几个部分:
1.源端口和目的端口(Source port,Destination port):这两个字段用来标识发送端和接收端的端口号,占16位。
2.序列号(Sequence number):占32位,用来标识从TCP源端向目的端发送的字节流。当发起方发送数据时,会对这些数据进行标记,确保数据的有序性和完整性。(seq)
3.确认序号(Acknowledgement number):占32位,只有在ACK标志位为1时,这个字段才有效。它表示接收方已经成功接收到的数据的序列号(ack=seq+1)
4.标志位:占6位,包含URG、ACK、PSH、RST、SYN、FIN等标志。其中ACK表示确认序号有效,FIN表示释放一个连接,SYN表示发起一个新连接。


二、TCP的三次握手

  三次握手就是通过三次数据包的交换,来确认通信双方收发数据的能力。

  1. 一开始,客户端和服务端都处于CLOSE状态,服务端监听客户端的请求,进入LISTEN状态。
  2. 第一次握手(客户端发送连接请求):客户端会向服务端发送一个SYN包,里面包含了客户端的初始序列号。然后客户端进入SYN_SENT状态。
  3. 第二次握手(服务端确认收到了客户端的连接请求):回复客户端一个SYN+ACK包,里面包含确认信息(表示收到了客户端的SYN包)和服务端的初始序列号。然后服务端进入SYN_RCVD(received的缩写)状态。
  4. 第三次握手(客户端收到服务端的确认后,再次向服务端确认):再回复一个ACK包给服务端。然后客户端进入ESTABLISHED状态,当服务端接收到这个ACK包后,也进入ESTABLISHED状态。
  5. 这样客户端和服务端之间就建立了一个可靠的连接,可以开始传输数据。

三、TCP的四次挥手

  1. 数据传输结束后,通信双方都可以主动发起释放连接请求,假设由客户端发起。
  2. 第一次挥手(客户端发送释放连接请求):客户端向服务端发送一个FIN包,并附带一个序列号。然后,客户端进入FIN_WAIT1状态。
  3. 第二次挥手(服务端确认收到了客户端释放连接的请求):回复一个ACK包,同时包含一个确认号。然后,服务端进入CLOSE_WAIT状态(此时服务端还没准备好释放连接,可能还有数据要处理),当客户端收到服务端的这个ACK包后,进入FIN_WAIT2状态。
  4. 第三次挥手(服务端也已经准备好释放连接):向客户端发送一个FIN包,并附带一个序列号。然后,服务端进入LAST_ACK状态,表示等待来自客户端的最后一个ACK包。
  5. 第四次挥手(客户端确认服务端也已经准备好释放连接):就回复一个ACK包,但是此时客户端不会马上关闭连接,而是进入TIME_WAIT状态,等待某个固定时间(2MSL,2 Maximum Segment LifeTime,两倍的最长报文段生命周期),目的是防止这个ACK包丢失,导致服务端没有收到客户端关闭连接的确认,没有关闭连接,就会超时重传FIN包。那么等待这个固定时间后(即是确保服务端已经正常关闭连接后),客户端才关闭连接,进入CLOSED状态。当服务端收到这个ACK包后,就关闭连接,进入CLOSED状态。
  6. 这样就成功释放连接了。

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

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

相关文章

从零开始:C++ String类的模拟实现

文章目录 引言1.类的基本结构2.构造函数和析构函数3.基本成员函数总结 引言 在C编程中,字符串操作是非常常见且重要的任务。标准库中的std::string类提供了丰富且强大的功能,使得字符串处理变得相对简单。然而,对于学习C的开发者来说&#x…

C语言----斐波那契数列(附源代码)

各位看官们好,当我写了上一篇博客杨辉三角后,有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和,然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…

位图(c++)

文章目录 1.位图概念2.位图的实现3.应用(解决整形存在或次数问题)3.1存在问题3.2次数问题 5.搜索的方法对比: 1.位图概念 和哈希一样,都是一个表来记录某个元素的个数或者存在与否;不同的是哈希使用的计算机定义的完整…

群辉部署小雅alist实现视听盛会

最近群辉搭建起来了,开始整蛊影视库,之前搞过nastool。这次折腾下小雅alist。 1.下载并安装 直接在群辉的docker里面下载映像 主要映射下端口和文件夹 #token mytoken.txt 获取地址:https://alist.nn.ci/zh/guide/drivers/aliyundriv…

Git使用(2):远程仓库

一、创建远程仓库 登录码云Gitee - 基于 Git 的代码托管和研发协作平台。 点击右上角,新建仓库。 创建完成,复制仓库地址接下来要使用。 二、将idea项目推送到码云 首先创建本地仓库VCS -> Create Git Repository。然后选择Manage Remotes&#xff0…

用友hr软件统一认证与致远OA单点登录身份周期管理怎么做

一、引言 随着企业信息化建设的深入,各类管理软件如用友HR、致远OA等已经成为事业单位日常运营不可或缺的工具。用友HR软件以其强大的人力资源管理功能,帮助企事业单位实现员工信息的集中管理;而致远OA则以其便捷的办公流程管理,…

springcloud简单了解及上手

springcloud微服务框架简单上手 文章目录 springcloud微服务框架简单上手一、SpringCloud简单介绍1.1 单体架构1.2 分布式架构1.3 微服务 二、SpringCloud与SpringBoot的版本对应关系2022.x 分支2021.x 分支2.2.x 分支 三、Nacos注册中心3.1 认识和安装Nacos3.2 配置Nacos3.3 n…

C++ 并发编程指南(11)原子操作 | 11.6、计算机内存结构

文章目录 一、计算机内存结构1、内存的基本组成2、内存的类型3、内存的结构层次4、CPU架构5、局部性原理6、总结 前言 在探讨计算机的运行效率和数据处理能力时,内存结构无疑是一个至关重要的部分。内存,作为计算机系统中的关键组件,承担着存…

【保姆级介绍自动化的讲解】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

【C语言】4.C语言数组(2)

文章目录 6. 二维数组的创建6.1 ⼆维数组的概念6.2 ⼆维数组的创建 7. 二维数组的初始化7.1 不完全初始化7.2 完全初始化7.3 按照⾏初始化7.4 初始化时省略⾏,但是不能省略列 8. 二维数组的使用8.1 ⼆维数组的下标8.2 ⼆维数组的输⼊和输出 9. 二维数组在内存中的存…

利用一段代码轻松绕过PHP授权系统

利用一段代码轻松绕过PHP授权系统 第一步:首先你需要改名全局文件 比如说全局文件 common.php,那么 你将他改为core.php 第二步:创建文件 创建一个文件,和改名前的全局文件名称一样,然后把以下代码复制进去就OK了 …

【MySQL01】【 Explain 命令详解】

文章目录 一、前言二、Explain 概览三、Explain 详解1. id2. select_type3. table4. type5. possible_keys6. key7. key_len8. ref9. rows10. filtered11. extra 列 四、补充1. EXPLAIN 扩展1.1 Extend EXPLAIN1.2 JSON 格式的执行计划 2. Intersection、Union、Sort-Union 索引…

使用C++实时读取串口数据(window使用已编译LibModbus库并用QT实现一个实时读取串口数据)

先看这篇文章,写得很详细: QT应用篇 四、window编译LibModbus库并用QT编写一个Modbus主机 手把手教学 编译好的LibModbus库可以在上面文章里下载,也可以在我的链接里下载: 为了在Qt Creator中创建新项目并嵌入上述C代码,请执行以…

C++进阶:红黑树介绍及模拟实现(图示详解过程)

C进阶:红黑树介绍及模拟实现 上次介绍了AVL树:C进阶:AVL树详解及模拟实现(图示讲解旋转过程) 今天就来紧接着来红黑树啦!!! 文章目录 1.红黑树介绍约束规则 2.项目文件规划3.整体框架(节点和Tree&#xf…

whisper报错:hp, ht, pid, tid = _winapi.CreateProcess [WinError 2] 系统找不到指定的文件。

in _execute_child hp, ht, pid, tid _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] 系统找不到指定的文件。 原因: 没装ffmpeg 或者 ffmpeg没添加到…

k8s pod就绪探针

Pod 可能需要时间来加载配置或数据,或者可能需要执行预热过程以防止第一个用户请求时间太长影响了用户体验。在这种情况下,不希望该 pod 立即开始接收请求,尤其是在运行的实例可以正确快速地处理请求的情况下。不要将请求转发到正在启动的 po…

YOLOv5独家改进:backbone改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024

💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,这就是StarNet的核心创新,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 💡💡💡如何跟YOLOv5结合:替代YOLOv5的backbone 收录 YOL…

电容笔记汇总

电容 一、电容理论基础 1、电容的本质 两个相互靠近的导体,中间夹一层不导电的绝缘介质,这就构成了电容器。当电容器的两个极板之间加上电压时,电容器就会储存电荷。 两个相互靠近的金属板中间夹一层绝缘介质组成的器件,当两端…

豆浆机缺水检测功能如何实现的

豆浆机缺水检测功能的实现是通过光学液位传感器来完成的。这种传感器具有多种优势,如内部所有元器件经过树脂胶封处理,没有任何机械活动部件,免调试、免检验、免维护等特点。它采用了光电液位传感器内置的光学电子元件,体积小、功…

Docker常用镜像安装

1. mysql 1.1 安装 获取镜像 docker pull mysql:8.0.30创建文件挂载目录 创建容器并运行 docker run -p 3306:3306 --name mysql8 \ -v /home/docker/mysql8/log:/var/log/mysql \ -v /home/docker/mysql8/data:/var/lib/mysql \ -v /home/docker/mysql8/mysql-files:/va…