LINUX网络编程:TCP(1)
目录
1.认识Tcp的报头
2.确认应答机制(ACK)
序号与确认序号
捎带应答
3.超时重传机制
4.Tcp连接管理
三次握手
为什是三次握手
四次挥手
理解TIMEWAIT
1.认识Tcp的报头

源端口和目的端口号没什么说的
32位的序号和确认序号,之后会介绍。
4位首部长度表示的是Tcp报头的长度,但是4位长度最多也就能表示15个字节,即使不算选项,也有20个字节,这是因为首部长度的单位是4字节,所以四位首部长度可以表示的长度是 4 * 15 = 60字节。
URG ACK PSH 都是tcp协议的选项,代表着不同的Tcp协议类型。
剩下的字段后面介绍。
2.确认应答机制(ACK)
Tcp是保证可靠性的,确认应答机制就是保证可靠性的一种机制。
其实这就是在日常生活中很常见的方法。
例:小明:小红我喜欢你,你愿意做我女朋友吗?
小红:就你这样长的太丑了,还是算了吧。
这个例子就是确认应答机制,怎么理解呢,

小红对小明的请求进行了回复(ACK),就说明小明的请求小红收到了。
到此故事结束。
序号与确认序号
Tcp是传输控制协议,发送数据需要先将数据交给tcp的发送缓冲区,可能会将数据拆分一个一个包。交给操作系统,系统在发送,在到达对端的时候要保证包的顺序要和发送前一致,所以必须要有序号来标识每个包。
Tcp是面向字节流的,他会对每个字节进行编号,ACK返回时,确认序号 = 序号 + 1,为了告诉发送者,下次该从哪个字节开始发。

这里可能就有一个问题了,可能有人觉得确认序号就是一个摆设,明明一个序号就能搞定的事,还整一个确认序号。
但是在捎带应答的场景下一个序号就不够用。
捎带应答
捎带应答就是,在ACK向发送者返回时,碰巧接受者也想向发送者发送信息,那么这两条报文就会合二为一,因为ACK就是一个报头,他没有数据,碰巧我正想发送数据,在ACK加上数据不就是两全其美了吗。

在这种情况下,序号表示发server送包的顺序,确认序号表示clint下次发送开始的位置。
3.超时重传机制
这也是tcp保证可靠性的一种方式,在一段时间内,如果没收到ACK就会,重新发送一次数据。
没有收到应答是有两种可能1.真的丢包了 2.包收到但ACK丢了,这种情况就需要tcp把收到序号相同的包直接丢弃。

这个特殊的时间间隔是根据网络状况动态计算的。
4.Tcp连接管理
三次握手

服务端状态转化:[CLOSED -> LISTEN] 服务器端调用listen后进入LISTEN状态, 等待客户端连接;[LISTEN -> SYN_RCVD] 一旦监听到连接请求(同步报文段), 就将该连接放入内核等待队列中, 并向客户端发送SYN确认报文.[SYN_RCVD -> ESTABLISHED] 服务端一旦收到客户端的确认报文, 就进入ESTABLISHED状态, 可以进行 读写数据了
客户端状态转化:[CLOSED -> SYN_SENT] 客户端调用connect, 发送同步报文段;[SYN_SENT -> ESTABLISHED] connect调用成功, 则进入ESTABLISHED状态, 开始读写数据;
三次握手是保证可靠性的不是三次握手连接100%能建立成功
前两次握手报文丢失,客户端和服务端的服务器状态都不是ESTABUSHED,超时重传即可。
但是最后一次握手ACK发出去的时候客户端就认为自己连接已经建立成功了,如果这个ACK丢失,服务器连接没建立成功,客户端认为自己连接建立成功,客户端直接向服务器发送数据了,这时候服务器会向客户端发送RST报文(reset)重新进行三次握手。
为什是三次握手
。
1.三次握手双方都有一次完整的收发,保证了网络是健康的 而且 双方都是全双工的。
2.保证了双方的Tcp都是愿意通信的,SYN就相当于客户端对服务器说你愿意和我通信吗? ACK就是我愿意
四次挥手

在这里补充一下,三次握手和四次挥手都是通讯细节,这些都是操作系统的工作。
服务端状态转化:[ESTABLISHED -> CLOSE_WAIT] 当客户端主动关闭连接(调用close), 服务器会收到结束报文段, 服务器 返回确认报文段并进入CLOSE_WAIT;[CLOSE_WAIT -> LAST_ACK] 进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据); 当服务器真正调用close关闭连接时, 会向客户端发送FIN, 此时服务器进入LAST_ACK状态, 等待最后一个 ACK到来(这个ACK是客户端确认收到了FIN)[LAST_ACK -> CLOSED] 服务器收到了对FIN的ACK, 彻底关闭连接.
客户端状态转化:[ESTABLISHED -> FIN_WAIT_1] 客户端主动调用close时, 向服务器发送结束报文段, 同时进入FIN_WAIT_1;[FIN_WAIT_1 -> FIN_WAIT_2] 客户端收到服务器对结束报文段的确认, 则进入FIN_WAIT_2, 开始等待服务器的结束报文段;[FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出LAST_ACK;[TIME_WAIT -> CLOSED] 客户端要等待一个2MSL(Max Segment Life, 报文最大生存时间)的时间, 才会 进入CLOSED状态
问题:客户端关闭连接,服务器还能给客户端发消息吗?
答案是可以的 ,tcp是有接受和发送两个缓冲区的,一般情况下关闭连接直接close(fd)两个缓冲区会直接关闭,但shutdown接口是可以只关闭一个缓冲区的。
参数how,设置为SHUT_RD关闭接受缓冲区,SHUT_WR关闭发送缓冲区,SHUT_RDWR关闭接受和发送两个缓冲区。

理解TIMEWAIT
先启动一个服务,然后ctrl + c将服务终止,在将服务启动,我们会发现,bind竟然失败了。
这是因为Tcp规定,主动关闭连接的一方要等待两个MSL(maximum segment lifetime)时间在从TIMEWAIT状态变为closed。
可以使用cat /proc/sys/net/ipv4/tcp_fin_timeout 查看MSL时间,默认60秒。

这么做的目的是为了防止,服务器关闭了,却还有报文在网络中传输。
如果服务器立马重启,收到了这种报文不就出问题了吗,这种报文已经过期了,丢掉都一点都不可惜。
在server的TCP连接没有完全断开之前不允许重新监听, 某些情况下可能是不合理的。
使用setsocketopt接口可以解决这种问题。
int opt = 1;
::setsockopt(_listenfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));
理解CLOSE_WAIT状态
服务器启动,客户端与服务器建立连接,客户端退出。
查看服务器连接的状态,发现有很多的CLOSE_WAIT连接,出现这种情况就是服务器忘记关闭文件描述符了,导致四次挥手不能完成,连接的状态就卡在CLOSE_WAIT这里了。
相关文章:
LINUX网络编程:TCP(1)
目录 1.认识Tcp的报头 2.确认应答机制(ACK) 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号,之后会介…...
基于PHP的新闻管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的新闻管理系统。…...
6.C++程序中的基本数据类型
数据类型是指在C中用于声明不同类型变量或函数的一个系统或抽象或者是一个分类,它决定了变量存储占用的内存空间以及解析存储的位模式。其实数据类型可以理解为固定内存大小的别名,是创建变量的模具,具体使用哪种模具(包括自定义&…...
oracle 11g写一个判断是否是身份证的函数,函数名称为:FUN_IS_IDENNO
下面是一个用于判断是否是身份证号码的Oracle 11g函数(FUN_IS_IDENNO)。身份证号码通常为18位(或者旧的15位),前17位为数字,第18位为数字或字母X,并且需要符合一定的规则,例如出生日…...
如何使用Spring Cloud Gateway搭建网关系统
使用Spring Cloud Gateway搭建网关系统是一个涉及多个步骤的过程,主要包括创建Spring Boot项目、添加 Spring Cloud Gateway依赖、配置路由规则以及运行和测试网关。以下是详细的步骤:一、创建Spring Boot项目 选择工具: 可以使用Spring Ini…...
油烟机制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
油烟机制造5G智能工厂物联数字孪生平台,是智能制造与信息技术的深度融合产物。数字孪生工业互联平台通过部署在工厂各个环节的传感器和设备,实时采集、分析和处理生产过程中的海量数据,构建出高度逼真的数字孪生模型。这一模型不仅能够真实反…...
《拿下奇怪的前端报错》序章:报错输出个数值数组Buffer(475) [Uint8Array],我来教它说人话!
作为前端开发者,你可能会遇到过一些奇奇怪怪的报错(相信我你早晚会遇到),关键是它未给出具体错误的位置,或者是一些很奇怪的信息。 我以前都是还原代码,然后找到错误的位置。或者是瞎弄一通,测试…...
Docker 里面按照ifconfig
1. 进入Docker 容器内部 docker exec -it xxx bash2. 安装 net-tools iputils-ping apt-get update && apt-get install -y net-tools apt-get update && apt-get install -y iputils-ping 3. 执行ifconfig 执行ping...
DOS(Disk Operating System,磁盘操作系统)常用指令
目录 背景: 早期探索: DOS之父: 发展历程: 常用指令: 进入命令: 操作1.进入和回退: 操作2.增、删: 操作3.其它: 总结: 背景: 早期探索: DOS(Disk Operating System,磁盘操作系统)在…...
VSCode集成Python环境搭建配置详细步骤
1. 安装VSCode 在开始我们的Python编程之旅前,首先需要准备好我们的开发工具——Visual Studio Code,简称VSCode。VSCode是一款由微软开发的轻量级但功能强大的源代码编辑器,支持多种编程语言,并且拥有丰富的扩展生态系统。接下来,我们将一步步教你如何下载、安装以及汉化…...
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…...
Windows【环境 01】服务器系统重装后的服务恢复(ES\Redis\Jafka\Tomcat)环境变量和服务注册
服务器系统重装后的服务恢复 1.原因2.问题处理2.1 JDK2.2 Elasticsearch2.3 Redis2.4 Jafka2.5 Tomcat 3.总结 1.原因 Windows 服务器系统盘损坏,换了硬盘并重做了系统,其他磁盘未损坏但安装的服务无法正常运行了,包括: Elastic…...
发现编程的全新境界——明基RD280U显示器使用体验
前言 在大学的四年里,我几乎每天都泡在实验室,盯着电脑屏幕,一行行地码代码。那时,学校提供的显示器是非常基础的款式,功能简单,几乎没有任何特别之处,甚至配置也比较低。那个时候,…...
使用阿里OCR身份证识别
1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…...
8. 详细描述一条 SQL 语句在 MySQL 中的执行过程。
一条SQL语句在MySQL中的执行过程包括多个步骤,从接收到SQL命令到返回结果,这些步骤涉及SQL解析、优化、执行以及最终的结果返回。以下是详细描述一条SQL语句在MySQL中的执行过程。 1. 客户端发送SQL请求 客户端应用程序:首先,客户…...
C++--类的实例化
一、实例化的概念 用类类型在屋里内存中创建对象的过程,称为类实例化出对象 类是对对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出…...
Vue vs React vs Angular 的对比和选择
前端框架对比与选择指南 在前端开发的世界里,框架可谓是开发者手中的利器。无论是新手还是老手,面对 Vue、React、Angular 等主流前端框架的选择时,都会有一瞬间的犹豫:“我到底该选哪个框架?”选择一个合适的前端框架…...
Yolov8-pose关键点检测:一种新的自适应算法轻量级通道分割和变换(ALSS)模块,解决红外检测场景存在严重遮挡和重叠目标时的局限性
💡💡💡本文解决什么问题:红外检测场景存在严重遮挡和重叠目标时的局限性的问题点。 💡💡💡提出了一种新的自适应算法轻量级通道分割和变换(ALSS)模块。该模块采用自适应信道分裂策略优化特征提取,并集成信道变换机制增强信道间的信息交换。这改善了模糊特征的提…...
无人机飞手培训机构六旋翼训练无人机技术详解
六旋翼无人机作为多旋翼无人机的一种,以其独特的稳定性、灵活性和载重能力,在航拍、农业、救援、物流等多个领域展现出广泛的应用前景。它采用六个旋翼产生升力,通过复杂的飞行控制系统实现悬停、前后左右飞行、翻滚等复杂动作,为…...
CX8903:电动车手机充电器降压芯片,搭配协议实现快充
CX8903:一款专用于电动车手机充电器的降压芯片,搭配协议实现快充。 在城市的车水马龙中,电动自行车如灵动的精灵,便捷着我们的出行生活。在骑行的路上,随时保持连接,电动自行车手机充电器让手机电量满满。…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
