TCP 连接:三次握手与四次挥手

TCP 协议,全称为“传输控制协议”。

1. TCP 协议段格式

给出几个定义 :

  • 16位源端口号 :用于标识发送端的应用程序。

  • 16位目的端口号 :用于标识接收端的目标应用程序。

  • 32位序号 :用于标识发送的每一个字节流中的第一个字节位置;确保接收端能够按照正确的顺序重组数据,即使数据包在传输中乱序到达。

  • 32位确认序号 :用于告知发送端,“我已经成功接收 这个序号之前的所有数据 ,现在请从这个序号开始给我发新的数据” 。

  • 4位首部长度 :指示 TCP 头部的长度,以 4字节 为单位;首部长度 的范围是 5~15,标识 TCP 头部的长度为 20~60 字节。

  • 标志位 :用于控制 TCP 连接的状态。SYNACKFINRSTPSHURG

2. 三次握手
2.1 传统的三次握手过程

在这里插入图片描述

三次握手过程,确保了两个主机都可以互相发送和接收数据。

服务端状态变化:

  • CLOSED —> LISTEN :服务端调用 listen() 后进入 LISTEN 状态,等待客户端连接。
  • LISTEN —> SYN_RCVD :监听到连接请求(即收到 SYN 包),将该连接放入内核等待队列,并向客户端发送 SYN-ACK 包。
  • SYN_RCVD —> ESTABLISHED :服务端收到客户端的 ACK 包后进入 ESTABLISHED 状态,可以读写数据。

客户端状态变化:

  • CLOSED —> SYN_SENT :客户端调用 connect(),发送 SYN 报文。
  • SYN_SENT —> ESTABLISHED :调用 connect() 成功,收到来自服务器的 SYN-ACK 包后,进入 ESTABLISHED 状态。
2.2 三次握手过程触发 RST

在 TCP 三次握手过程中,被请求建立连接的那一端尚未完成握手(未收到最终的 ACK 包),就意外收到了数据包,则触发 RST(连接重置)

RST 包的作用:

  • 立即中断连接,告知对方当前连接不可用。
  • 释放相关资源,避免内存泄露。

客户端收到 RST 包后,需要重新进行三次握手,建立连接。

3. 四次挥手
3.1 四次挥手过程

客户端状态变化:

  • ESTABLISTED —> FIN_WAIT_1 :客户端调用 close() ,向服务端发送 FIN 报文,并进入 FIN_WAIT_1 状态。

​ 通知服务器,客户端没有数据要发送了,但仍然可以接收数据

  • FIN_WAIT_1 —> FIN_WAIT_2 :客户端收到来自服务器的 ACK 报文,进入 FIN_WAIT_2 状态。

  • FIN_WAIT_2 —> TIME_WAIT :客户端收到来自服务器的 FIN 报文,进入 TIME_WAIT 状态,发出最后一个 ACK 包。

服务器状态变化:

  • ESTABLISHED —> CLOSE_WAIT :客户端主动关闭连接,服务器收到 FIN 报文后回应 ACK ,并进入 CLOSE_WAIT 状态。

  • CLOSE_WAIT —> LAST_ACK :进入 CLOSE_WAIT 状态后,服务器准备关闭连接,处理所有剩余数据;

    服务器真正调用 close() 关闭连接,向客户端发送 FIN 报文并进入 LAST_ACK 状态,等待最后一个 ACK(确认)。

  • LAST_ACK —> CLOSED :服务器收到了客户端对 FIN 的 ACK,关闭连接。

3.2 CLOSE_WAIT 状态

创建一个简易的 TCP 服务器和 TCP 客户端,并建立连接。

直接关闭客户端。

此时服务端进入 CLOSE_WAIT 状态,四次挥手没有完成。

如果服务器上大量出现 CLOSE_WAIT 状态,意味着服务器没有正确地关闭 socket ,导致四次挥手没有正常完成。

需要加上对应的 close ,解决此问题。

3.3 TIME_WAIT 状态

3.2 相同,创建一个简易的 TCP 服务器和客户端,并建立连接。

直接关闭服务器,再重新运行。

服务器进入 TIME_WAIT 状态。

TCP 协议规定,主动关闭连接的一方要处于 TIME_WAIT 状态,等待两个 MSL(maximum segment lifetime)的时间后,才能回到 CLOSED 状态。

  • MSL 是 TCP 报文的最大生存时间。

  • 保证在传输方向上的尚未被接收、或迟到的报文段都已消失;否则服务器立即重启,会收到来自上个进程的迟到数据。

  • 保证最后一个 ACK 报文可靠到达;如果最后一个 ACK 丢失,服务器会重发一个 FIN 数据报(客户端进程虽然不在,但 TCP 连接还在,可以重发 ACK)。

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

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

相关文章

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…

redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线

文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…

Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined

Syntax Error: Error: vitejs/plugin-vue requires vue (>3.2.13) or vue/compiler-sfc to be present in the dependency tree. 第一步 npm install vue/compiler-sfc npm run dev 运行成功,本地打开页面是空白,控制台报错 重新下载了vue-loa…

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。动图演示: 在微服务系统…

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器,递增的不太行,控制的不够准确,其次在大于10微秒的延时是非常准确的,小于的话,就没有那没准,但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

connect to host github.com port 22: Connection timed out 的解决方法

原因是 Github 被 GFW 屏蔽了。 Windows 系统,打开 C:\Windows\System32\drivers\etc,复制其中的 hosts 文件至桌面,用文本编辑器或者其他工具打开。 复制以下内容进去: 140.82.114.4 github.com 151.101.1.6 github.global.ss…

常见的排序算法过程和比较分析

比较分析 排序类别排序算法时间复杂度(最好)时间复杂度(最坏)时间复杂度(平均)辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…

【QGIS入门实战精品教程】7.3:QGIS制作千层饼(DEM+等高线+影像+TIN)

文章目录 一、效果展示二、数据准备三、制作过程1. 打开软件2. 添加图层3. 制作千层饼一、效果展示 二、数据准备 订阅专栏后,从专栏配套案例数据包中的7.3.rar中获取。 1. dem 2. 影像 3. 等高线 4. tin 三、制作过程 1. 打开软件 打开QGIS软件。 QGIS软件主界面。

如何将CSDN文章 导出为 PDF文件

一、首先,打开我们想要导出为 PDF格式的 CSDN文章,以下图为例。 二、按 F12 调出浏览器调式模式后,选择 控制台 三、在控制台处粘贴代码 代码: (function(){ use strict;var articleBox $("div.article_content"…

HTML——54. form元素属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>form元素属性</title></head><body><!--form标签用于创建一个表单&#xff0c;会将里面的内容一起发送服务器&#xff0c;结构类似于表格--><!-…

告别 $arr[0]: PHP 和 Laravel 中更优雅的数组处理方式

你是否曾经历过这样的惊魂时刻&#xff1a;线上代码突然崩溃&#xff0c;只因访问了一个不存在的数组元素&#xff1f;或者更糟的是&#xff0c;应用开始疯狂抛出错误&#xff0c;而你却毫无头绪&#xff1f;这一切的罪魁祸首可能就是看似人畜无害的硬编码数组索引&#xff0c;…

【Linux报告】实训六 重置超级用户密码

实训六 重置超级用户密码 2018编写-今日公布 【练习一】忘记root密码 步骤一&#xff1a;开启或重启系统&#xff0c;并且要在五秒之内按任何键&#xff1b; 步骤二&#xff1a;按任意键&#xff0c;停止进入系统&#xff0c;按【e】键&#xff0c;跳转新页面&#xff0c;再…

一种pod容器动态挂卷方案

一、背景 1.1 个人调试kvm 我们这边基于云平台的k8skubevirt&#xff0c;给安卓手机领域的开发工程师们提供了独占式虚拟机资源。这些资源主要用于工程师的个人级开发与调试&#xff0c;因此有如下特点&#xff1a; 使用时间与工作时间强相关&#xff0c;即工程师工作时间使…

Docker Compose 构建 EMQX 集群 实现mqqt 和websocket

EMQX 集群化管理mqqt真香 目录 #目录 /usr/emqx 容器构建 vim docker-compose.yml version: 3services:emqx1:image: emqx:5.8.3container_name: emqx1environment:- "EMQX_NODE_NAMEemqxnode1.emqx.io"- "EMQX_CLUSTER__DISCOVERY_STRATEGYstatic"- …

如何在没有 iCloud 的情况下将数据从 iPhone 传输到 iPhone

概括 您可能会遇到将数据从 iPhone 转移到 iPhone 的情况&#xff0c;尤其是当您获得新的 iPhone 15/14 时&#xff0c;您会很兴奋并希望将数据转移到它。 使用iCloud最终可以做到这一点&#xff0c;但它的缺点也不容忽视&#xff0c;阻碍了你选择它。例如&#xff0c;您需要…

CUDA与Microsoft Visual Studio不兼容问题

简介&#xff1a;在安装一些 python库时&#xff0c;涉及到第三方库&#xff08;特别是需要引用 C 代码&#xff09;时&#xff0c;通常的安装方式会涉及到编译过程&#xff0c;通常称为"源代码安装"&#xff08;source installation&#xff09;&#xff0c;或是 “…

Unity2D无限地图的实现(简单好抄)

说明&#xff1a;本教程实现的是在2D游戏中玩家在游戏中上下左右移动的时候自动进行地图拼接的功能&#xff0c;如果你只想实现左右移动的无限地图&#xff0c;那么这篇博客也能起到一定参考作用。 思路 第一步&#xff1a; 创建一个10*10的2D游戏对象当做地图 第二步创建一个…

C13.【C++ Cont】初识string类字符串的迭代器

目录 1.迭代器的定义 2.迭代器的作用 3.string类字符串的常用迭代器 4.第3点的两个迭代器的使用 示例代码1:解引用 运行结果 示例代码2 运行结果 示例代码3:用迭代器正序遍历字符串 运行结果 示例代码4:用迭代器逆序遍历字符串 运行结果 示例代码5:用迭代器修改字…

HTML——13.超链接

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>超链接</title></head><body><!--超链接:从一个网页链接到另一个网页--><!--语法&#xff1a;<a href"淘宝网链接的地址"> 淘宝…

《代码随想录》Day22打卡!

回溯算法 《代码随想录》回溯算法&#xff1a;组合 本题完整题目如下&#xff1a; 本题的完整思路如下&#xff1a; 1.本题使用回溯算法&#xff0c;其实回溯和递归是一样的道理&#xff0c;也是分为三步曲进行&#xff1a; 2.第一步&#xff1a;确定递归函数的返回值和参数&…