TCP的连接管理机制(三次握手与四次挥手)

news2024/11/15 9:18:54

目录

  • 为啥要三次握手与四次挥手
  • 三次握手
    • syn 与 ack
    • 三次握手具体流程
  • 四次挥手
  • 注意

为啥要三次握手与四次挥手

相比于UDP, TCP是有连接的, 这个连接就体现在这了.

三次握手就是TCP建立连接, 四次挥手就是TCP断开连接.

三次握手

握手是指通信双方进行网络交互.
三次握手就相当于是 客户端与服务器间通过三次交互来建立连接关系.
(建立连接关系, 本质就是双方记录对方信息)

要了解三次握手, 首先我们还得来了解 syn报文 与 ack报文.

syn 与 ack

syn 称为同步报文段, 意思是一方要向另一方申请建立连接.
ack 是确认字符, 表示发来的数据已经接收无误.

报文具体结构是怎样的呢?
在这里插入图片描述
什么样的报文是 syn 报文呢?
观察TCP报头结构, 我们可以看到在 16为窗口大小 左边有六个特殊比特位, 这些比特位默认为0, 如果为 1, 则表示其特殊含义.
比如, 第二位是 ack, 如果这一位为 1, 则表示当前数据报是一个应答报文.
同样的, 第五位是 syn, 如果为 1, 则表示当前数据报是一个同步报文.
如果一个TCP数据报, 第二位和第五位都是1, 那么就是 ack + syn 报文.

三次握手具体流程

如下图 :
在这里插入图片描述

  1. 客户端请求同步, 也就是发送 syn.
  2. 服务器接收到 syn, 就需要进行应答, 就发送了 ack, 同时也要与客户端请求同步, 就发送了 syn, 因为是同时发生的, 所以就包含在了一个数据报中, 也就是一次握手了.
  3. 客户端接收到数据报后, 也要返回一个响应, 表示收到数据报, 就返回 ack.

其实三次握手就相当于投石问路, 测试客户端与服务器是否具有发送与接收数据的能力.
这是后续可靠传输的基础.
我们可以类比成两个人在网上进行语音通话 :

当甲乙双方连上麦后, 就得测试一下是否有问题.
首先甲说一句 : “听得到我说话吗?”
乙听到后就得响应甲, 说 : “听到了, 你听到我说话吗?” (这里乙就知道了, 甲的发送能力没问题, 乙的接收能力也没问题)
甲听到乙说话后, 就再回一句 : “听到了” (这里甲就知道了, 乙的接收发送能力没问题, 甲的接收发送也没问题)
最后就是乙收到甲的消息, 明白了甲的接收能力没问题, 乙的发送也没问题.
至此, 甲乙双方都测试出了两方的发送与接收没问题.

注意 :

上述过程是内核自动完成, 应用程序干预不了.
等到三次握手完成后, 就建立连接了, 服务器的 accept 把建立好的连接从内核拿到应用程序中.

四次挥手

就是双方断开连接, 来看下图 :在这里插入图片描述

  1. 客户端向服务器发送 fin(结束报文), 通知服务器 “我要与你断开连接了”.
  2. 服务器收到后, 就返回 ack, 就是响应服务器的通知, 相当于 “我知道了”.
  3. 服务器执行到了 clos 方法后也发送通知, 说 “我也要与你断开连接了”.
  4. 客户端收到后返回 ack 响应, 相当于说 “好的”.

我们这情况很类似与三次握手, 是否可以把四次挥手变为三次挥手呢? (将ack与fin和并)
其实, ack 与 fin 是有一定的概率和并的, 但通常情况下不能和并.
为什么三次握手的第二次握手能和并, 而这里就不行呢?

三次握手, ack 和 syn 都是在同一时机触发的 (都是内核来完成的)
四次挥手, ack 与 fin 的触发时机不同.

ack 是内核完成的, 在收到 fin 的第一时间会返回.
fin 则是应用程序代码控制的, 在调用 socket 的 close 的方法的时候才会返回 fin.

如果趁着 ack 还没发就 close, 则可以进行和并.

其实客户端之所以发送 fin, 也是因为客户端进程执行到了 close 方法(即使代码中没有调用 close 方法, 在进程结束时也会自动进行执行 close), 释放资源.
此时客户端进程虽然结束了, 但是 tcp 连接还在, 内核还是会把 tcp 连接继续维护, 直到四次挥手完成. 服务这边也是一样.

注意

建立连接, 一定是客户端先发起.
断开连接, 双方都有可能先发起.

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

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

相关文章

记录上传文件异常 /tmp/tomcat... (No space left on device)

一,问题描述 用postman调用上传接口,基本每两次调用会有一次报错,如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…

【活动】想对大学的自己说……

写在前面: 时间过得真的很快,眨眼间我们已经走过了这么多年的大学时光。回想起来,我们曾经有过无数的欢笑和泪水,有过无数的成功和挫败,但是这些经历都让我们变得更加坚强和成熟。如果现在有机会回到大学时光&#xff…

【LInux】进程间通信 -- 匿名管道

前言 我们在学习进程管理,进程替换时,都强调了进程的独立性,那进程间通信是什么?这好像和进程的独立性相矛盾吧? 那么今天,我们就来学习进程间通信,和第一种通信方式 – 管道 文章目录 前言一. …

高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

目录 前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申:在服务器上运行后台进程1-2-5、nohup和&的区别 二、进程查看2-1、jobs命令(基本不用)2-2、ps命…

Android进阶宝典—在Compose中跳转Fragment

使用场景 我们原有的项目中基本采用的是单Activity架构,页面之间的跳转都是通过Navigation进行的,举个简单的例子。 在这种单Activity架构模式下,有一天我们想把MainActivity或者BFragment使用Compose重构,这个时候我们就需要去…

PasteSpider软件优势介绍

PasteSpider采用.netcore编写,运行于linux服务器的docker/podman里面,涉及的技术或者工具有podman/docker,registry,nginx,top,ssh,git,svn等。 PasteSpider可以更好的为你执行服务的升级和维护工作。支持集群模式安装,也支持单例模式运行。…

如何为 Apple 官方 SwiftUI 示例中的图表元素加上首显动画?

0. 概览 在 Apple 官方教程示例 Animating Views and Transitions 中,苹果为我们展示了如何为 SwiftUI 中的各种视图添加动画和过渡效果。 在示例的最后,我们在完成 3 种不同数据类型(Elevation, Heart Rate, Pace)切换的同时,顺面收获了美美的图表元素动画效果: 不过,…

科研方向与个人思考

文章目录 关于科研选题与方法的若干思考如何选题选题tips确定研究问题之后如何读论文——与一篇优秀论文作者的博弈阅读论文的技巧代码实现过程中成果发表四步走:科技论文的书写顺序学会利用工具科研的正确姿势 研究生时间线个人思考入门一个领域的步骤(…

【有功-无功协调优化】基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化研究(Matlab代码实现)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

Windows 安装 GDAL C++库

Windows 安装 GDAL C库1. 方法1:下载配置网友编译的GDAL版本1.1 下载1.2 配置1.3 测试1.4 缺点2. 方法2:自己编译3. 参考1. 方法1:下载配置网友编译的GDAL版本 1.1 下载 CSDN: GDAL,geos联合编译的库,版本为1.8.0&am…

VMware虚拟机搭建

网络步骤 VMWARE虚拟机NAT模式上网设置 VM虚拟机设置 虚拟机全局设置 启动虚拟机选择【虚拟网络编辑器】 如果需要管理员权限点【更改设置】,没有提示这忽略这一步 选择NAT模式,更改下面的子网IP,改成你需要的任何一个子网网段(…

KDZD608屏蔽服效率测试仪

一、产品概述 KDZD608型屏蔽服效率试验装置(带电作业用屏蔽服屏蔽效率试验装置)是对屏蔽服进效率试验的专用设备,广泛用于电力系统、生产厂家和科研单位不可缺少的检测设备。KDZD608型屏蔽服效率试验装置根据最新国家标GB6568.2-86《带电作业…

9.含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度

说明书 MATLAB代码:含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度 关键词:冰蓄冷空调 CCHP-MG 多时间尺度优化 冷热电联供 参考文档:《含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度》完全复现 仿真平台:MATLAB yal…

算法学习day57

算法学习day57 1.力扣647. 回文子串1.1 题目描述1.2分析1.3 代码 2.力扣 516.最长回文子序列2.1 题目描述2.2 分析2.3 代码 3.参考资料 1.力扣647. 回文子串 1.1 题目描述 题目描述: 给定一个字符串,计算这个字符串中有多少个回文子串。 具有不同开始…

TenserRT(一)模型部署简介

第一章:模型部署简介 — mmdeploy 0.12.0 文档 pytorch.onnx.export方法参数详解,以及onnxruntime-gpu推理性能测试_胖胖大海的博客-CSDN博客 我们来谈谈ONNX的日常 - Oldpan的个人博客 初识模型部署 训练:网络结构(深度学习框…

【Windows】更换笔记本键盘操作

目录 一、拆旧 1、电脑保持关机状态 2、拆下电池 3、拧开中间这块区域的螺丝 4、拿键盘进行对照,找到对应的固定键盘的螺丝的位置,拧开 5、直接撬起原本的键盘,注意不要扯到下面的排线,小心点 二、换新 6、换新键盘&#…

公司新招了个腾讯拿38K的人,让我见识到了什么才是测试天花板···

5年测试,应该是能达到资深测试的水准,即不仅能熟练地开发业务,而且还能熟悉项目开发,测试,调试和发布的流程,而且还应该能全面掌握数据库等方面的技能,如果技能再高些的话,甚至熟悉分…

ubuntu_修改libc.so.6 或者 libm.so.6的软链接导致sudo ls 等命令失效的解决方法

1. 背景 运行一个binary 应用程序, 提示报错: /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.27 not found (required by 我的应用程序string 里一下符号标, 确实没有然后下载了一个 glibc-2.27, 安装到 usr/local/下, 并将 libm-2.27.so 和 libc-2.27.so 复制到 /lib/x8…

点云的处理

一、激光点云 激光点云指的是由三维激光雷达设备扫描得到的空间点的数据集,每一个点云都包含了三维坐标(XYZ)和激光反射强度(Intensity),其中强度信息会与目标物表面材质与粗糙度、激光入射角度、激光波长以…

基于imx8m plus开发板全体系开发教程3:Ubuntu 20.04 编译

前言: i.MX8M Plus 开发板是一款拥有 4 个 Cortex-A53 核心,运行频率 1.8GHz;1 个 Cortex-M7 核心,运行频率 800MHz;此外还集成了一个 2.3 TOPS 的 NPU,大大加速机器学习推理。 全文所使用的开发平台均为与NXP官方合作的FS-IMX8…