TIME_WAIT状态套接字重新使用

《TIME_WAIT相关知识》里边有相关理论知识。
《TIME_WAIT状态TCP连接导致套接字无法重用实验》有相关实验。

现代Linux的TCP协议栈已经做了许多升级,所以可以让我们直接重用TIME_WAIT状态套接字而不会引起问题。下边是优化的内容:

1.新连接的SYN告知序列号比原来TIME_WAIT老连接末序列号要大,所以就可以通过序列号分辨出来新老连接。
2.开启tcp_timestamps,这样就让新连接时间戳比旧连接时间戳大,这样可以通过检查时间戳来判断新老连接。

在这样两重优化下,重用TIME_WAIT状态连接就不会产生任何问题了。

int on = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

SO_REUSEADDR用来告诉操作系统内核,如果端口已被占用,但是 TCP 连接状态位于 TIME_WAIT ,可以重用端口。这段代码需要放到socket函数和bind函数之间。
下边是timeWaitSetsockopt.c完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<errno.h>
#include<syslog.h>
#include<signal.h>void error_handling(char *buf);#define  MAXLINE     1024
static int count;
static void sig_int(int signo) {printf("\nreceived %d datagrams\n", count);exit(0);
}
int main(int argc, char **argv) {if (argc != 2) {error_handling("usage: select01 <IPaddress> or <Port>");}int serv_sock = socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_port=htons(atoi(argv[1]));// SO_REUSEADDR用来告诉操作系统内核,如果端口已被占用,但是 TCP 连接状态位于 TIME_WAIT ,可以重用端口int on = 1;setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));if(bind(serv_sock, (struct sockaddr*) &server_addr, sizeof(server_addr))==-1){fprintf(stderr, "error in bind: %s (%d)\n", strerror(errno), errno);exit(errno);}if(listen(serv_sock, 5)==-1){fprintf(stderr, "error in listen: %s (%d)\n", strerror(errno), errno);exit(errno);}signal(SIGPIPE, sig_int);int connfd;struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr);if ((connfd = accept(serv_sock, (struct sockaddr *) &client_addr, &client_len)) < 0) {printf("accept failed");exit(0);}char message[MAXLINE];count = 0;int n;for (;;) {int n = read(connfd, message, MAXLINE);if (n < 0) {fprintf(stderr, "error in read: %s (%d)\n", strerror(errno), errno);exit(0);} else if (n == 0) {fprintf(stderr, "client closed: %s (%d)\n", strerror(0), 0);exit(0);}message[n] = 0;printf("received %d bytes: %s\n", n, message);count++;}
}
void error_handling(char *buf)
{fputs(buf, stderr);fputc('\n', stderr);exit(1);
}

在服务器端sudo gcc timeWaitSetsockopt.c -o timeWaitSetsockopt进行编译,sudo ./timeWaitSetsockopt 8080启动程序。
在这里插入图片描述

在客户端使用sudo telnet 127.0.0.1 8080进行连接,然后输入good之后按下回车键。
在这里插入图片描述

然后在服务器端同时按住ctrl+c关闭程序,之后快速再使用sudo ./timeWaitSetsockopt 8080启动程序,然后快速在客户端使用sudo telnet 127.0.0.1 8080进行连接,输入network之后按下回车键,还是需要在服务器端快速按下sudo netstat -altnp | grep 8080看一下连接状态,这些动作只要够快就可以出现两条记录。
在这里插入图片描述

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

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

相关文章

post请求乱码

如果在处理 POST 请求时出现乱码&#xff0c;你可以配置一个过滤器&#xff08;Filter&#xff09;来处理请求体的字符编码。以下是一个简单的 Java Servlet 过滤器的例子&#xff0c;用于设置请求和响应的字符编码&#xff1a; 在 web.xml 中配置过滤器&#xff1a; <filt…

MyBatis-Plus简介和入门操作

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例

动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用&#xff0c;测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式&#xff0c;来演示动态创建 …

AI数字人与虚拟人:区别与应用场景

随着人工智能和虚拟技术的不断发展&#xff0c;AI数字人和虚拟人成为了数字世界中的两个重要概念。本文将介绍AI数字人和虚拟人的区别&#xff0c;并探讨它们在不同领域的应用场景。 一、AI数字人与虚拟人的区别 定义和概念&#xff1a; AI数字人&#xff1a;是利用人工智能技术…

MFC—CTabCtrl 、CListCtrl

为了方便自己查找 1、官方文档 CTabCtrl CListCtrl 2、create&#xff08;窗口样式&#xff09; 基本上安流程来都能出出来。看一下视图的窗口样式。主要是report的。 CTabCtrl选项卡控件样式 CListCtrl列表视图窗口样式&#xff08;这里的名字又变了&#xff0c;List-Vi…

单例模式-支持并发的C语言实现

代码实现&#xff1a; c #include <stdio.h> #include <stdlib.h> #include <pthread.h>// 定义单例对象结构体 typedef struct {// 单例对象的数据成员int value; } Singleton;// 静态变量&#xff0c;用于保存唯一实例的指针 static Singleton* instance …

wireshark 抓包提示

[TCP Previous segment not captured] 在TCP的传输阶段&#xff0c;同一台主机发出的数据段应该是连续的&#xff0c;即后一个包的Seq等于前一个包的SeqLen&#xff08;三次握手和四次挥手是个例外&#xff09;。如果wireshark发现后一个包的Seq号大于前一个包的SeqLen&#xf…

28. Spring源码篇依赖注入之Optional

简介 我们知道&#xff0c;java中的Optional是解决臭名昭著的空指针异常&#xff0c;在spring的依赖注入中&#xff0c;如果没有找到Bean也会抛异常&#xff0c;就算将required写为false&#xff0c;后面也会需要判空 在spring中也支持Optional的依赖注入 创建Optional jav…

【TinyALSA全解析(一)】TinyALSA简介

TinyALSA简介 一、TinyALSA概述1.1 TinyALSA背景和用途1.2 TinyALSA主要内容1.3 TinyALSA与ALSA的关系 二、TinyALSA具体有哪些内容2.1 libtinyalsa.so 库2.2 一组工具 三、tinyalsa完整目录分析四、tinyalsa的编译方法和使用方法4.1 tinyalsa编译方法4.1.1 TinyALSA全编译方法…

【JVM系列】- 穿插·对象的实例化与直接内存

对象的实例化与直接内存 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; 文章目录…

SpringCloud系列文章目录(总纲篇)

文章目录 前言正文一、原理性文章1.1 OpenFeign篇 二、实战性文章1.1 注册中心、配置中心篇1.2 网关篇1.3 OpenFeign篇 前言 SpringCloud系列文章&#xff0c;有些文章上下文存在联系。 并且&#xff0c;它们数量巨多&#xff0c;有涉及原理的&#xff0c;有涉及实战的。 本文…

域名邮箱与企业邮箱的区别:功能、应用与优势

根据使用者的不同需求&#xff0c;电子邮件分为域名邮箱和企业邮箱两种类型。那么这两种邮箱之间究竟存在哪些区别呢&#xff1f;本文将从定义、优势和劣势三个方面进行详细解析。 什么是域名邮箱&#xff1f; 域名邮箱&#xff0c;顾名思义是以域名作为后缀的电子邮箱。域名邮…

【UGUI】制作用户注册UI界面

这里面主要的操作思想就是 1.打组 同一个事情里面包含两个UI元素都应该打组便于管理和查找 2.设置锚点位置 每次创建一个UI都应该设置他的锚点以便于跟随画布控制自己的&#xff1a;相对位置 3. 设置尺寸&#xff08;像素大小&#xff09; 每一次UI元素哪怕是作为父物体的…

我叫:归并排序【JAVA】

1.认识我一下 1.归并排序(MERGE-SORT)利用归并的思想实现的排序方法,该算法采用经典的分治策略2.分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起&#xff0c;即分而治之。 2.分合思想 3 分久必合 /*** 合并** param arr …

tp6框架 万级数据入库

用框架自带的saveall方法 当数据超过一千就会出现遗漏的情况 下面是原生sql方法&#xff1a; function saveCourse($newArr, $count) {$sql "replace into edu_wx_school_self_course (study_hour,code,cn_name,en_name,study_score,school_qy) values";for ($a…

(数据结构)顺序表的定义

#include<stdio.h> //顺序表的实现——静态分配 #define MAX 10 //定义最大长度 typedef struct List {int data[MAX]; //用静态的数组存放数据int lenth; //顺序表现在的长度 }List; //顺序表的初始化 void ChuShiHua(List L) {L.lenth 0; //将顺序表的长度初始化…

Tensorflow检测不到GPU解决办法(针对本人4060有效)

目录 前置条件硬件条件当前日期 检查方法解决方法版本列表tensorflow2.10.0CUDA12.1cudnn8.8 结果 前置条件 硬件条件 R5-5600G RTX4060 当前日期 当前时间是2023年11月27日&#xff0c;请注意本文的时效性&#xff0c;保不齐后续出现某个组件的更新能够直接解决这个问题。…

YOLOv8优化策略:自适应改变核大小卷积AKConv,效果优于标准卷积核和DSConv |2023.11月最新成果

🚀🚀🚀本文改进: AKConv 中,通过新的坐标生成算法定义任意大小的卷积核的初始位置。 为了适应目标的变化,引入了偏移量来调整每个位置的样本形状。 此外,我们通过使用具有相同大小和不同初始采样形状的 AKConv 来探索神经网络的效果。 AKConv 通过不规则卷积运算完成…

STM32项目经验分享:常用软件

文章目录 硬件设计软件软件设计软件英文文档阅读 硬件设计软件 Altium Designer&#xff08;在公司用会被维权&#xff09; 3D模型&#xff08;3D contentcentral&#xff09; 嘉立创 先用立创EDA画原理图然后再用AD画PCB,3D模型可以用3D contentcentral下载 软件设计软件 …

【备忘录】软件记录

Anaconda 虚拟环境 创建Python环境 Spyder Python程序编辑 Jupyter Notebook 交互式开发环境