网络编程中的TCP——TCP的连接的建立、关闭、状态转移

TCP连接的建立和关闭

wireshark捕获数据:

在这里插入图片描述

TCP三次握手+四次挥手的时序图:

在这里插入图片描述

三次握手:

  1. 报文段1包含SYN标志,这是一个同步报文段,表示发起连接请求,包含自己起始的序号值0;
  2. 报文段2是服务端同意建立连接,发送了自己的起始序号并对第一个报文进行了确认;
  3. 报文3是对服务端第二个报文的确认;

四次挥手:

  1. 报文14:由客户端发起了关闭连接的请求,带有FIN标志位,以及此时的序号和对服务器上一个报文的确认;
  2. 报文15:服务器确认了客户端的关闭请求,此时进入半关闭状态;
  3. 报文16:服务器发出断开连接请求,开始等待客户端最后一个确认;
  4. 报文17:客户端进行最后的确认;

半关闭状态

TCP是全双工的,所以允许两个方向的数据传输单独关闭。也即是通信的一端可以发送结束报文给对方,告知对方本端已完成数据的发送,但是允许继续接收来自对方的数据,直到对方也发送报文段关闭连接

以上面那个例子来说,客户端主动发起了关闭请求,在服务器返回确认之后,就进入了半关闭状态,客户端不会继续向服务端发送新的数据,但是还可以接收服务端的数据

TCP状态转移

在这里插入图片描述

上图描述了完整的TCP状态转移,下面是状态转移时序图:

在这里插入图片描述

三次握手建立连接:

  1. 客户端和服务器初始都处于CLOSED状态;
  2. 例子中由客户端发起连接请求SYN,发送完后客户端变成SYN_SENT状态;
  3. 服务器开启之后首先变成LISTEN状态,在接收到客户端的SYN后变成SYN_RCVD状态;
  4. 服务器发送SYN+ACK,客户端接收到之后,变成ESTABLISHED状态,发送最后一个ACK
  5. 最后服务器收到ACK之后也变成ESTABLISHED状态,建立连接完成;

四次挥手:

  1. 例子中由客户端首先发起关闭连接请求,客户端发送完FIN后首先变成FIN_WAIT_1状态;
  2. 服务器收到关闭连接的请求之后变成CLOSE_WAIT状态,然后发送ACK表示同意关闭连接;
  3. 客户端收到服务器的ACK进入半关闭状态,FIN_WAIT_2
  4. 此时客户端不会继续发送数据,但如果服务器还有数据,服务器会继续发送数据;
  5. 服务器发起关闭请求,进入LASK_ACK状态,表示等待客户端发送最后一个ACK
  6. 客户端收到FIN请求,进入TIME_WAIT状态,发送最后一个ACK
  7. 服务器在收到最后一个ACK后首先进入完全关闭状态;

TIME_WAIT

  1. 处于TIME_WAIT状态要等待2 * msl才能完全关闭,原因如下:
    • 可靠的终止TCP连接;
    • MSL是报文段在网络中最大生存时间,2MSL保证网络上两个传输方向上尚未被接受到、迟到的TCP报文段都已经消失,保证新的连接在这个端口建立起来之后不会收到上一个连接的数据;
  2. TIME_WAIT是第一个主动发起关闭连接的一端才会有的状态,如果是服务器先发起关闭连接的请求,在收到对方的关闭请求后也会变成TIME_WAIT状态;
  3. 处于TIEM_WAIT的这个端口不能立即被用来建立新的连接,要等连接彻底关闭;
  • 对于客户端来说,处于TIME_WAIT状态的端口无法立即重新使用不是什么问题,因为客户端一般使用系统自动分配的临时端口号来建立连接,一般不会刚好分配到程序上一次用到的端口;
  • 但是对于服务器来说,他总是使用一个固定端口。如果服务器程序刚刚关闭后又希望立即重新启动,就要等待2MSL,避免的方式是可以在创建socket时升值SO_REUSEADDR来强制进程可以立即使用处于TIME_WAIT状态的端口;

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

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

相关文章

SQL 语句拼接在 C 语言中的实现与安全性分析

代码解析 // 构建SQL插入语句 char *sql_insert (char *)malloc(sizeof(char) * 200); // 分配200字节内存 strcpy(sql_insert, "INSERT INTO user(username, passwd) VALUES("); // 复制基础SQL语句 strcat(sql_insert, ""); // 添加单引号 strcat(sq…

`lock()` 和 `unlock()` 线程同步函数

1) 函数的概念与用途 lock() 和 unlock() 不是特定的标准库函数,而是线程同步原语的一般概念,用于在多线程环境中保护共享资源。在不同的编程环境和库中,这些函数有不同的具体实现(如 POSIX 线程的 pthread_mutex_lock() 或 C 的 …

升级openssh后ORACLE RAC EM 安装失败处理

升级过程中由于SCP传输时目标目录/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans 不存在导致的OC4J配置失败:WARNING: /usr/bin/scp: dest open "/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans": No such file or directory/usr/bin/scp…

ADB 调试工具的学习[特殊字符]

一、ADB 的工作原理 1.1 ADB 概念 ADB (Android Debug Bridge):Android 调试桥,是开发/测试 Android 应用必备的调试工具。作用:通过 电脑终端命令 操作 安卓手机/模拟器。 1.2 ADB 构成与原理 ADB 由三部分组成: Client 端&#…

用一根“数据中枢神经”串起业务从事件流到 Apache Kafka

1. 为什么是“事件流”? 在一个软件定义、自动化、永远在线的世界里,系统之间最需要的是:把发生了什么这件事,第一时间、按正确顺序、可靠地传到该知道的人/系统那里。 事件流就像企业的中枢神经:它把数据库更新、设备…

【RAGFlow代码详解-4】数据存储层

数据库基础设施 RAGFlow 使用关系数据库(MySQL 或 PostgreSQL)作为主要元数据存储,通过具有连接池和重试机制的 Peewee ORM 进行管理。 连接管理 数据库连接通过 service_conf.yaml 和环境变量进行配置。该系统支持具有可配置连接池的 MySQL …

ES_映射

一、 映射(Mapping)是什么? 简单来说,映射就像是关系型数据库中的表结构定义(Schema)。它定义了索引(Index)中的文档(Document)可以包含哪些字段(…

【Linux | 网络】多路转接IO之poll

一、poll函数二、poll的优缺点三、实现poll服务器(只关心读事件)3.1 Log.hpp(日志)3.2 Lockguard.hpp(自动管理锁)3.3 Socket.hpp(封装套接字)3.4 PollServer.hpp(服务端…

一站式资源共享平台模板,助力快速搭建专属资源站源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 这个资源分享网站模板是一个功能完整、设计现代的单页网站,非常适合快速搭建资源分享平台。以下是关于这个模板的详细介绍,帮助你更好地理解并发布到自己的网站&a…

ngnix的部分配置

1. 禁止特定IP地址访问你可以通过在Nginx配置文件中添加deny指令来阻止特定IP地址或IP地址段的访问。server {listen 80;server_name example.com;location / {deny 192.168.1.0/24;allow all;} }2. 允许特定IP地址访问如果你想允许只有特定IP地址或IP地址段的访问,…

Qwt7.0-打造更美观高效的Qt开源绘图控件库

概述 Qt 生态里能画图的库不多,主流的为QCustomPlot、Qwt、Qt Charts和KDChart,Qt6.8之后把原来的 Qt Charts(2D) 与 Qt DataVisualization(3D) 合并为统一的Qt Graphs模块(注意不是Qt Graphic…

NFC线圈设计计算

对工作于13.56MHz的电感耦合的NFC系统,针对小距离的传统天线通常是环形或者矩形的扁平线圈。 圆形扁平线圈计算评估 对于二阶估计,我们可以由匝数决定的电感等式为 考虑到线圈的物理参数,设置平均直径:D_averD0-N(gw) 线圈周长: ;d2*(w t)/π 初始设置中的这种电感…

mac设置鼠标滚轮方向

mac中滚轮的滑动方向和windows是相反的,如果需要设置和windows相同,设置如下:将自然滚动关闭即可。

QSpinBox的用法及其使用QSS对其美化

摘要 在现代应用程序开发中,提供一个直观且用户友好的界面至关重要。Qt框架提供了丰富的控件和工具,帮助开发者实现这一目标。本文将详细介绍如何使用Qt的QSpinBox控件让用户输入数值,并通过Qt Style Sheets (QSS) 美化界面,提升…

18 继续学习

要设计出一个好的系统,需要多年的知识积累。有一个捷径是研究真实世界的系统架构。本文将介绍一些有帮助的阅读材料。 务必留意那些真实系统之间共通的原理和相同的底层技术。研究每个技术并了解它解决了什么问题, 这是一个巩固基础知识和完善设计过程的…

深度学习篇---混淆矩阵

要理解混淆矩阵(Confusion Matrix),我们可以从它的名字入手:它本质是一张 “帮你理清模型预测结果到底‘混淆’在哪里” 的表格,核心作用是评估分类模型的表现 —— 比如判断一张图片是 “猫” 还是 “狗”、一封邮件是…

MySQL重大隐患!mysqlpump的--set-gtid-purged参数在5.7和8.0的雷区

MySQLPump是MySQL官方提供的一个用于备份和恢复MySQL数据库的工具。它于MySQL 5.7.8版本中首次引入,旨在提供一种快速、可靠且高效的备份和恢复解决方案。MySQL Pump首次支持了并行导出、压缩导出,可以利用多核CPU来提高备份能力,在效率上要比…

低质量视频变高清AI:告别模糊,重现清晰画质

在数字时代,视频内容的创作和消费日益普及,然而,许多早期拍摄或存储的视频,由于技术限制或压缩等原因,往往存在画质不佳的问题,如模糊、噪点多、分辨率低等。这不仅影响观看体验,也限制了这些珍…

Linux入门教程 第十二章 防火墙

文章目录前言一、 iptables 概述Netfilter二、iptables 的表、链结构2.1 ptables的四表五链结构介绍2.1.1 四表五链2.1.2 四表2.1.3 **五链**2.2 数据包过滤的匹配流程(数据包到防火墙)2.2.1 规则链之间的匹配顺序:主机型防火墙:2.2.2 规则链内的匹配顺序…

单词搜索+回溯法

题目&#xff1a;思考&#xff1a; 1.经典回溯 实现&#xff1a; class Solution { public:bool find_word(vector<vector<char>>&board,string word,int pos,int i,int j){bool retfalse;if (posword.size()-1) return board[i][j]word[pos];if (board[i][j…