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

在这里插入图片描述
三次握手流程:
客户端给服务端发送数据时,数据包中带有一个头,这个头就是前几十个字节,就是下面这张图。从源端口号,目的端口号,一直到序列号,直到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.mzph.cn/news/55735.shtml

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

相关文章

12. 完整模型训练套路

12.1 CIFAR 10 model 网络模型 ① 下面用 CIFAR 10 model网络来完成分类问题,网络模型如下图所示。 12.2 DataLoader加载数据集 import torchvision from torch import nn from torch.utils.data import DataLoader# 准备数据集 train_data torchvision.dataset…

C#,《小白学程序》第二课:数组与排序

1 文本格式 /// <summary> /// 《小白学程序》第二课&#xff1a;数组与排序 /// </summary> /// <param name"sender"></param> /// <param name"e"></param> private void button2_Click(object sender, EventArgs …

RT-Thread内核学习

内核框架 内核是操作系统最基础也是最重要的部分&#xff0c;内核处于硬件层之上&#xff0c;内核部分包括内核库、实时内核实现。 内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。这部分根据编译器不同自带C库的情况也会不同。 当使用GNU GCC编译器时&…

Redis原理剖析

一、Redis简介 Redis是一个开源的&#xff0c;基于网络的&#xff0c;高性能的key-value数据库&#xff0c;弥补了memcached这类key-value存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用&#xff0c;满足实时的高并发需求。 Redis跟memcached类似&#…

C++数据结构学习——栈

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、栈二、C语言实现1.声明代码2.实现增删查改代码3.测试代码 总结 前言 栈&#xff08;Stack&#xff09;是计算机科学中一种常见的数据结构&#xff0c;它是…

前端需要理解的性能优化知识

优化的目的是展示更快、交互响应快、页面无卡顿情况。 1 性能指标 2 分析方法 使用 ChromeDevTool 作为性能分析工具来观察页面性能情况。其中Network观察网络资源加载耗时及顺序&#xff0c;Performace观察页面渲染表现及JS执行情况&#xff0c;Lighthouse对网站进行整体评分…

01、前端使用 thymeleaf 后,视图页面找不到---Cannot resolve MVC View ‘xxxxx前端页面‘

Cannot resolve MVC View ‘xxxxx前端页面’ 没有找到对应的mvc的前端页面。 代码&#xff1a;前端这里引入了 thymeleaf 模板 解决&#xff1a; 需要添加 thymeleaf 的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s…

QT通过ODBC连接GBase 8s数据库(Windows)示例

示例环境&#xff1a; 操作系统&#xff1a;Windows 10 64位数据库及CSDK版本&#xff1a;GBase 8s V8.8_3.0.0_1 64位QT&#xff1a;5.12.0 64位 1&#xff0c;CSDK安装及ODBC配置 1.1&#xff0c;免安装版CSDK 下载免安装版的CSDK驱动&#xff0c;地址&#xff1a;https:…

利用 IDEA IDE 的轻量编辑模式快速查看和编辑工程外的文本文件

作为程序员, 我们都知道 IDE 的很好用的, 它的文本编辑器功能也非常的强大, 用起来非常便捷. 在长年累月的使用中, 我们也变得对其非常熟悉, 以致于使用起其它简单地轻量级的文本编辑器来, 比如什么记事本, Notepad, UltraEdit 等等呀, 觉得既不方便又不熟悉. 关键是很多的操作…

Linux:基础指令

目录 Linux的基础指令 1.ls指令 2.pwd指令 3.cd指令 4.touch指令 5.mkdir指令 6.rmdir指令和rm指令 7.man指令&#xff08;重要&#xff09; 8.cp指令&#xff08;重要&#xff09; 9.mv指令&#xff08;重要&#xff09; 10.cat指令 11.nano指令 12.more指令 13.…

PHP8的匿名函数-PHP8知识详解

php 8引入了匿名函数&#xff08;Anonymous Functions&#xff09;&#xff0c;它是一种创建短生命周期的函数&#xff0c;不需要命名&#xff0c;并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点&#xff1a; 1、创建匿名函数&#xff0c;语法格式如下&…

Oracle-rolling upgrade升级19c

前言: 本文主要描述Oracle11g升19c rolling upgrade升级测试&#xff0c;通过逻辑DGautoupgrade方式实现rolling upgrade&#xff0c;从而达到在较少停机时间内完成Oracle11g升级到19c的目标 升级介绍&#xff1a; 升级技术: rolling upgrade轮询升级&#xff0c;通过采用跨版…

02.sqlite3学习——嵌入式数据库的基本要求和SQLite3的安装

目录 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模型 ubuntu 22.04下的SQLite安装 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模…

Eclipse(STS):pom.xml 报错:Multiple markers at this line

pom.xml 报错&#xff1a;Multiple markers at this line STS中&#xff0c;项目能够正常运行&#xff0c;但是 pom.xml 报错&#xff1a;Multiple markers at this line 项目本身没有任何修改&#xff0c;之前不报错的&#xff0c;突然报错了。 Multiple markers at this li…

LLM-Rec:基于提示大语言模型的个性化推荐

1. 基本信息 论文题目:LLM-Rec: Personalized Recommendation via Prompting Large Language Models 作者:Hanjia Lyu, Song Jiang, Hanqing Zeng, Yinglong Xia, Jiebo Luo 机构:University of Rochester, University of California Los Angeles, Meta AI, University of Ro…

手写RPC框架--1.介绍与网络传输

介绍与网络传输 0.介绍a.什么是rpcb.rpc的通信流程 1.网络传输a.零拷贝1) 零拷贝的概念2) Netty的零拷贝 b.IO多路复用c.Netty入门1) netty中的helloworld d.封装报文1) 协议结构2) 模拟封装报文 e.序列化f.压缩和解压缩 0.介绍 a.什么是rpc rpc 的全称是 Remote Procedure C…

计算机视觉 – Computer Vision | CV

计算机视觉为什么重要&#xff1f; 人的大脑皮层&#xff0c; 有差不多 70% 都是在处理视觉信息。 是人类获取信息最主要的渠道&#xff0c;没有之一。 在网络世界&#xff0c;照片和视频&#xff08;图像的集合&#xff09;也正在发生爆炸式的增长&#xff01; 下图是网络上…

数据结构】二叉树篇|超清晰图解和详解:后序篇

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 你不能要求一片海洋&#xff0c;没有风暴&#xff0c;那不是海洋&#xff0c;是泥塘——毕淑敏 目录 一、核心二、题目 一、核心 我们清楚…

wireshark过滤器的使用

目录 wiresharkwireshark的基本使用wireshark过滤器的区别 抓包案例 wireshark wireshark的基本使用 抓包采用 wireshark&#xff0c;提取特征时&#xff0c;要对 session 进行过滤&#xff0c;找到关键的stream&#xff0c;这里总结了 wireshark 过滤的基本语法&#xff0c;…

帝国CMS仿管理资源吧资料下载网站模板源码/下载会员+积分付费下载功能自动采集资源网站源码

帝国CMS仿管理资源吧资料下载网站模板源码&#xff0c;带下载会员积分付费下载功能自动采集资源网站源码&#xff0c;管理资源吧——为中小企业管理者提供全方位的管理资料下载服务&#xff1b;是一个所有资料免费下载&#xff0c;免注册、免登陆、免积分的公益性的管理知识共享…