TCP的三次握手 四次挥手以及TCP的11种状态

news2025/1/11 21:00:36

在这里插入图片描述
三次握手流程:
客户端给服务端发送数据时,数据包中带有一个头,这个头就是前几十个字节,就是下面这张图。从源端口号,目的端口号,一直到序列号,直到Options。第一个包会将这前十几个字节中的SYN置1然后在Sequence Number中填充了一个值。而服务器回ACK的时候则是把ACK置1,把SYN置1,然后把32bits的Sequence Number填充,再将32bits的Acknowledgment Number填充,再发回给客户端。最后再回一个ACK,其实就是将ACK位置1,填充32bits的ACK,再发回给服务端,至此三次握手结束。

客户端连接服务器后,服务器处于一个listen的状态,此时服务端允许三次握手。

在这里插入图片描述

三次握手
1、客户端是在哪个函数?
connect
2、服务端是在哪个函数?

在这里插入图片描述
int clientfd = accept(fd,);
accept的流程
1、从accept的队列里面取出一个节点
2、为这个节点分配一个fd

所以我们再次思考 三次握手在服务端的哪个函数,你必须排除调accept,因为在accept时,三次握手早已结束,同时你又要排除掉listen,因为在三次握手的时候,listen早就返回了。因此三次握手,在哪个函数都没有发生,他是一个被动完成的过程。

注意这个过程:
在这里插入图片描述
服务器在接收到一个客户端的连接请求的时候,为他专门分配了一个节点。这个节点与socket一点关系都没有,他只是一个半连接。

再往后,客户端接收到服务端的ack之后,再给服务端回一个ack的时候,服务端需要将半连接的节点,放到accept中全链接的队列,那么这里就有一个问题?:
服务端怎么知道要从半连接队列中选择哪个节点(这个所谓的节点,其实就是一个连接,TCP的每一个连接都有一个这样的节点,叫做TCP的控制块TCB,伴随这个整个TCP的连接生命周期,TCP的11个状态,就保存在这个控制块中),放到全链接队列中。

如何在半连接队列里面,找到对应节点?
端口65535个,为什么大台服务器能够做到几百万的并发连接?

其实就是通过最后ACK的数据包中的五元组,通过这五个元素。

五元组(srcip源ip,srcport源端口,dstip目的ip,dstport目的端口,proto协议) 前面两个问题都可以用五元组回答,只要连接里,有任何一个不一样,就可以建立一个连接。

proto的作用:
tcp可以监听8080的端口,同时udp也可以在8080的端口进行receive。
说白了就是 tcpfd–>tcp:8080
udpfd–>udp:8080 可以同时工作

所以上面说的:
accept的流程
1、从accept的队列里面取出一个节点
2、为这个节点分配一个fd
从一开始创建这个fd开始 就生成了一个tcb
fd–>tcb

我们思考两个函数
send(fd,buffer,length,0)
rec(fd,buffer,length,0)
send是怎么发出去的,而rec又是如何接收到数据的?
其实原因就在于,这个fd映射了tcb.

send返回正数,是不是表示发送成功了?答案是不是。
尽管tcp是一个可靠协议,但send其实就是写入发送缓冲区而已,真正发还是要内核空间发,都是协议栈决定的,两个步骤是异步的。
在这里插入图片描述
接着讲一下四次挥手
四次挥手 不分客户端服务器 只分主动或者是被动

主动放发送fin(调用close函数) 被动方发送ack
接着被动方发送fin 主动方发送ack

那么有一个问题,主动方调用了close,被动方是如何知道的?其实就是recv返回0

返回0之后 我们再调用close函数 再回fin 对方收到返回ack后 四次挥手才结束。
在这里插入图片描述

最后讲一下 TCP的状态迁移
在这里插入图片描述

以上图为例,讲述四次挥手的过程
主动方,主动调用close函数,发送fin。主动方在收到ACK之前,TCP状态均从原本的establised,变更为FIN_WAIT_1(从close到fin_wait_1)
主动方收到被动方的ACK后,TCP状态变为FIN_WAIT_2,直到收到被动方发送的fin之前。
在主动方收到被动方的fin之后,立即返回ack后,主动方Tcp的状态为time_wait

我们再看被动方,在接收了FIN之后,立即返回ACK,被动方的TCP状态从原本的established变为close_wait.
接着被动方再发送完fin之后,进入last_ack状态。

那么现在有一个问题,双方同时调用close,会出现什么状态。
其实是会出现一个closing的状态。closing的状态还会在主动方发送fin后,被动方的ack包丢失的情况。

在这里插入图片描述

如果出现大量的time_wait是什么原因?
比如服务器出现大量的time_wait是什么原因,有什么解决方案?
前提你要明白,服务器之所以出现大量time_wait的前提是主动方主动调用close,才会出现。服务器主动关闭了大量的socket,其实现象是并不多的,作为服务器,一般是由客户端主动去处理的。
如果服务器出现大量time_wait?
1、代码逻辑上面出现了问题

如果客户端出现大量fin_wait_2?
发送这个问题说明:
在receive返回0,一直到调用close的中间这段时间,太长了!很有可能服务端的代码,根本没有调用close_wait,需要由服务端去查,很有可能没有调用close。
在这里插入图片描述
fin_wait_2如何终止?
答案是终止不了,通过看图就可以发现fin_wait_2,没有进入closing的路径。但凡没有的,你只能Kill进程结束
备注:(正常情况下,主动关闭连接的一端(客户端)在 FIN_WAIT_2 状态等待一段时间后,会收到对端(服务器)的FIN报文,从而进入TIME_WAIT状态等待连接的真正关闭。(服务器何时发送FIN取决于服务器应用程序的处理,一般会在read返回0发现客户端已经关闭连接后,也调用close关闭连接)

然而有在某些异常情况下,可能处于 FIN_WAIT_2 状态的一端一直等不到对端的FIN。如果没有外力的作用,连接两端会一直分别处于 FIN_WAIT_2 和 CLOSE_WAIT 状态。这会造成系统资源的浪费,需要对其进行处理。(注意内核协议栈就有参数提供了对这种异常情况的处理,无需应用程序操作)

目前的做法是:如果应用程序调用的是完全关闭(而不是半关闭),那么内核将会起一个定时器,设置最晚收到对端FIN报文的时间。如果定时器超时后仍未收到FIN,且此时TCP连接处于空闲状态,则TCP连接就会从 FIN_WAIT_2 状态直接转入 CLOSED 状态,关闭连接。

在Linux系统中可以通过参数 net.ipv4.tcp_fin_timeout 设置定时器的超时时间,默认为 60 s。)

滑动窗口 逐步递增的输送数据包
慢启动
拥塞控制

netstat -anop | grep 9096查看端口状态 以及是否被占用

会出现可以传输数据,但在用netstat无法查看到,说明走的不是操作系统的协议栈。用户态的协议栈。

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

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

相关文章

【从零学习python 】72. 深入理解Socket通信及创建套接字的方法

文章目录 1. 不同电脑上的进程之间如何通信2. 什么是socket3. 创建socket进阶案例 1. 不同电脑上的进程之间如何通信 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起! 在1台电脑上可以通过进程号(PID)来唯一标识一个进程…

取模运算符在数组下标的应用

什么是取模运算符%&#xff1f; 定义&#xff1a; a mod b&#xff0c;设a、b属于正整数且b>0&#xff0c;如果q、r属于正整数满足aq*br&#xff0c;且0≤r<b&#xff0c;则定义&#xff1a; a mod b r 注意&#xff1a;取模运算符两侧的除数和被除数都是整数&#xff…

中秋节思维导图怎么绘制?教你使用这种绘制方法

中秋节思维导图怎么绘制&#xff1f;中秋节是中国传统的一个重要节日&#xff0c;许多人会在这一天与家人、朋友聚在一起庆祝&#xff0c;品尝月饼、猜灯谜、赏月等。中秋节作为一个具有浓厚文化底蕴的节日&#xff0c;其历史文化知识十分丰富&#xff0c;而通过绘制思维导图&a…

Three.js 实现模型材质局部辉光(发光,光晕)效果和解决辉光影响场景背景图显示的问题

1.Three.js 实现模型材质局部辉光&#xff08;发光&#xff0c;光晕&#xff09;效果 2.解决辉光效果影响场景背景图显示的问题 相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组…

iPhone 14 Pro 动态岛的功能和使用方法详解

当iPhone 14 Pro机型发布时,苹果公司将软件功能与屏幕顶部的药丸状切口创新集成,称之为“灵动岛”,这让许多人感到惊讶。这篇文章解释了它的功能、工作原理,以及你如何与它互动以执行动作。 一、什么是灵动岛?它是如何工作的 在谣言周期的早期‌iPhone 14 Pro‌ 在宣布时…

只考一门数据结构,计算机学硕复录比1:1的山东双非学校考情分析

青岛理工大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1420字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 青岛理工…

Linux下的系统编程——基础操作(一)

前言&#xff1a; linux系统编程是基于Linux系统进行程序开发的一个过程&#xff0c;主要涉及到的是linux系统中的函数使用如下图所示&#xff1a; 最外层的是咱们的应用程序&#xff0c;这部分程序大多调用的是咱们标准库&#xff0c;或者说是C库&#xff0c;这部分库函数能…

PDF中的表格怎么转换为Excel?这两个工具一定得收藏!

PDF是一种常见的文件格式&#xff0c;它可以保持文件的原始样式和内容&#xff0c;但是也有一些缺点&#xff0c;比如不易编辑和处理数据。如果你想要将PDF中的表格或数据导出到Excel中&#xff0c;以便进行分析、计算或制作图表&#xff0c;那么你可能需要一个专业的PDF转Exce…

Window异常提示:“为了对电脑进行保护,已经阻止此应用”

目录 1.Window异常提示图片&#xff1a; 2.家庭版额外需要执行的解决方式&#xff1a; 3.本地组策略编辑器(后续家庭版和专业版一致) 4.禁用后重新启动电脑就可以正常运行程序了 1.Window异常提示图片&#xff1a; 2.家庭版额外需要执行的解决方式&#xff1a; 代码&#xff…

超纯水中硼离子去除,特种除硼树脂CH-99

超纯水是指水中杂质含量极低的一种水质&#xff0c;其中矢量硼是一种常见的杂质。矢量硼的存在会影响超纯水的质量&#xff0c;因此需要采取一定的方法去除。 常用的去除矢量硼的方法有离子交换法、反渗透法和电化学法等。 电化学法&#xff1a; 是一种利用电化学反应对水中…

Java JDBC学习教程

Java JDBC JDBC 独立于数据库JDBC 不独立于SQLJDBC 不适用于非关系数据库流行的关系数据库JDBC 教程范围JDBC 核心概念JDBC 示例加载JDBC驱动程序打开数据库连接创建语句更新数据库查询数据库关闭数据库连接 Java JDBC API&#xff08;Java Database Connectivity&#xff09…

无涯教程-PHP - preg_grep()函数

preg_grep() - 语法 array preg_grep ( string $pattern, array $input [, int $flags] ); 返回由与给定模式匹配的输入数组元素组成的数组。 如果将flag设置为PREG_GREP_INVERT&#xff0c;则此函数返回输入数组中与给定模式不匹配的元素。 preg_grep() - 返回值 返回使用…

8路光栅尺磁栅尺编码器或16路高速DI脉冲信号转Modbus TCP网络模块 YL99-RJ45

特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 高速光栅尺磁栅尺4倍频计数&#xff0c;频率可达5MHz ● 模块可以输出5V的电源给光栅尺或传感器供电 ● 支持8个光栅尺同时计数&#xff0c;可识别正反转 ● 可以设置作为16路独立DI高速计数器 ● 可网…

vue 简单实验 v-bind 变量与html属性绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"bind-attribute"><span v-bind:title"message">鼠标悬停几秒钟查看此处动态绑定的提示信息&#xff01;</sp…

“产业应用创新奖2023”启动征集

当前&#xff0c;人工智能已经成为新一轮科技革命和产业变革的重要驱动力量&#xff0c;基于强算法、大算力和大数据的大模型成为主流方向。文心大模型和飞桨一直致力于发挥算法模型技术优势&#xff0c;助力AI 大生产加速升级。 文心飞桨赋能千行百业 产业创新不断涌现 数字医…

你做的可视化大屏老被老板嫌弃丑?那是你没掌握这7个动态效果!

数据可视化大屏成为了最近的爆火需求&#xff0c;自从老李我在朋友圈发了一条关于可视化大屏的朋友圈&#xff0c;客户、亲戚、朋友、同学都过来问我这种可视化大屏是怎么做出来的&#xff0c;要花多少钱&#xff1f; 老李也很实诚&#xff0c;直接跟他们说&#xff0c;免费&a…

概率论与数理统计:第七章:参数估计 第八章:假设检验

文章目录 Ch7. 参数估计7.1 点估计1.矩估计2.最大似然估计(1)离散型(2)连续型 7.2 评价估计量优良性的标准(1)无偏性 (无偏估计)(2)有效性(3)一致性 7.3 区间估计1.置信区间、置信度2.求μ的置信区间 Ch8. 假设检验1.拒绝域α、接受域1-α、H₀原假设、H₁备择假设2.双边检验、…

初识 JVM 01

JVM JRE JDK的关系 JVM 的内存机构 程序计数器 java指令的执行流程&#xff1a; 1 右侧的java源代码编译为左侧的java字节码&#xff08;右侧第一个方块对应左侧第一个方块&#xff09; 2 字节码 经过解释器 变为机器码 3 机器码就可以被cpu来执行 程序计数器的作用就…

Linux学习之samba服务

yum install -y samba安装samba。 安装完成如下&#xff1a; /etc/samba/smb.conf是samba配置文件&#xff0c;内容如下&#xff1a; # See smb.conf.example for a more detailed config file or # read the smb.conf manpage. # Run testparm to verify the config is cor…

亿发智能定制系统规范食品饮料行业质量管理,ERP解决方案助力业务增长

随着食品生产业态的不断复杂化和食品风险的逐渐凸显&#xff0c;食品饮料生产商面临着更大的挑战和机遇,需要与时俱进&#xff0c;借助数字化手段建立完整的质量管理体系&#xff0c;有效降低食品事故的风险。同时&#xff0c;面对数字化时代&#xff0c;食品饮料生产商需要一套…