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. 可能遇到的问…

【机器学习】回归

文章目录 1. 如何训练回归问题2. 泛化能力3. 误差来源4. 正则化5. 交叉验证 1. 如何训练回归问题 第一步:定义模型 线性模型: y ^ b ∑ j w j x j \hat{y} b \sum_{j} w_j x_j y^​b∑j​wj​xj​ 其中,( w ) 是权重,( b )…

C++ 设计模式:状态模式(State Pattern)

链接:C 设计模式 链接:C 设计模式 - 备忘录 状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为。状态模式将状态的行为封装在独立的状态类中,并将状态的切换逻辑委托给这些…

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客户端执行流…

leetcode hot 100 杨辉三角

118. 杨辉三角 已解答 简单 相关标签 相关企业 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 class Solution(object):def generate(self, numRows):""":ty…

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. 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。动图演示: 在微服务系统…

【Python运维】构建基于Python的自动化运维平台:用Flask和Celery

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代IT运维中,自动化运维平台扮演着至关重要的角色,它能够显著提高运维效率,减少人为错误,并且增强系统的可维护性。本文将引导读者如…

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…

PyTorch中的autocast:混合精度训练的实现原理

PyTorch中的autocast:混合精度训练的实现原理 在深度学习中,尤其是在训练大型模型时,计算资源和显存消耗往往是非常关键的因素。为了优化这些问题,混合精度训练(Mixed Precision Training)应运而生。autoc…

Word格式修改

经常修改格式,留下这篇汇总 Word的累加符号上下标变右标指定目录:word如何取消封面或者目录下方的页码,页码从正文开始加参考文献:【Word】怎样给论文添加引用参考文献删空白页: word中无法删除空白页怎么办&#xff…

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

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

随笔 | 写在2024的最后一天

. 前言 转眼又到了一年的末端。过去这一年,和前些年有些不同,变化巨大,感触良多。多到一时竟不知从何开始写。今天这篇随笔,因为时间有限,可能文法也会有些凌乱,就是想到哪里写到哪里,如果未来…

【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"…

Apache Hive常见问题

入门问题 什么是Apache Hive? 解释Hive的用途。Hive作为基于Hadoop的数据仓库工具是如何工作的?与传统关系型数据库相比,使用Hive有什么优势? Hive和关系型数据库管理系统(RDBMS)之间的区别是什么&#…

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;…

二十三种设计模式-单例模式

单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 单例模式两种实现方法&#xff1a;懒汉式和饿汉式。 懒汉式&#xff08;Lazy Initialization&#xff09; 懒汉式单例模式在第一次被使用时才创建实例&…