Tcp自连接

devtools/2024/11/14 12:53:20/

Tcp自连接

如果客户端和服务端都在同一个环境,并且客户端先于服务端启动,那么很有可能产生自连接的现象。
所谓自连接,就是tcp两端使用了同一个端口进行连接,即localhost:port->localhost:port。

实现自连接

下面提供一个例子来验证tcp自连接
代码:recipes-master\python\self-connect.py

#!/usr/bin/pythonimport errno
import socket
import sys
import timeif len(sys.argv) < 2:print "Usage: %s port" % sys.argv[0]print "port should in net.ipv4.ip_local_port_range"
else:port = int(sys.argv[1])for i in range(65536):try:# 循环对端口port创建一个连接sock = socket.create_connection(('localhost', port))print "connected", sock.getsockname(), sock.getpeername()time.sleep(60*60)except socket.error, e:if e.errno != errno.ECONNREFUSED:break

我们选取一个没有正在监听的端口,可以通过netstat -ntlp查看正在监听的tcp端口,然后我们再从ip_local_port_range,可以通过以下命令查看ip_local_port_range

sudo sysctl net.ipv4.ip_local_port_range

我们这里选取33000,执行文件

[root@localhost python]# python self-connect.py 33000
connected ('::1', 33000, 0, 0) ('::1', 33000, 0, 0)
...

前面一个就是我们的源端口,而后面一个就是我们的目的端口,而地址都是我们的本地地址,我们可以看见已经出现了自连接的情况

原因详解
  • 客户端从ip_local_port_range中选取了一个临时端口 x 后,客户端发送syn报文到33000端口,但因为 33000 没有打开,因此连接失败 。
  • 再次尝试连接,重新选取临时端口号 x + 1 ,再次尝试连接,还是失败。
  • 进行到n次尝试时,选取的临时端口号刚好是 33000 端口,然后向 33000 端口发起syn报文,此时因为33000是被选取的端口,已经被打开,所以此时会连接上。

解决方案

  1. 在连接成功后,判断一下是不是自连接,也就是源ip端口与目的ip端口是不是相同,相同的话就断开此连接
#include<sys/socket.h>// 获取本地连接信息
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);// 获取服务端连接信息
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
  1. 选取一个ip_local_port_range以外的端口作为服务端端口,或者设置ip_local_port_range范围在服务端端口以外,让客户端端口与服务端端口不冲突

http://www.ppmy.cn/devtools/24445.html

相关文章

校园安全升级:AR实景监测场景方案

在教育领域&#xff0c;随着校园的逐步对外开放&#xff0c;学校正面临着前所未有的管理挑战。社会人员的大量涌入不仅带来了文化的交流和知识的分享&#xff0c;也给校园安全带来了诸多隐患。新闻报道中不断出现的校园安全事件&#xff0c;如入室伤人、盗窃和非法传销等&#…

北斗、网络时钟服务器(NTP授时服务器)几种设置方法

北斗、网络时钟服务器&#xff08;NTP授时服务器&#xff09;几种设置方法 计算机网络必须设立属于主机的NTP服务器&#xff0c;向网内用户提供网络校时服务&#xff0c;使得各种网络设备、服务器、个人计算机等可以通过NTP服务器校正它们自己的时间&#xff0c;用户可使用任何…

webpack 区分环境

区分环境 {ignore} 文章目录 区分环境 {ignore} 有些时候&#xff0c;我们需要针对生产环境和开发环境分别书写webpack配置 为了更好的适应这种要求&#xff0c;webpack允许配置不仅可以是一个对象&#xff0c;还可以是一个函数 module.exports env > {return {//配置内容…

新媒体运营-----短视频运营-----PR视频剪辑----PR特效

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1. 混合和对比度1. 滤色2. 对比度 2. 3d和属性粘贴3. 参考线和锚点 1. 混合和对比度 1. 滤色 混合是PS&#xff…

CTFHub-Web-SSRF

CTFHub-Web-SSRF-WP 一、内网访问 1.题目提示说访问127.0.0.1的flag.php&#xff0c;在URL后面添加路径没想到直接访问成功 二、伪协议读取文件 1.题目提示说访问Web目录下的flag.php&#xff0c;联想到Web目录一般存放于/var/www/html/里&#xff0c;去修改URL尝试进行访问…

elementUI之el-select选择器赋值为空后无法选中回显

elementUI之el-select选择器赋值为空后无法选中回显 问题原因&#xff1a; 焦点问题 解决办法&#xff1a; this.$set(this.form, monthlyRent, );

数据可视化在不同行业中有哪些应用?

数据可视化即通过图表的形式将数据的内在信息有逻辑性地呈现给用户&#xff0c;使用户更容易发现数据中蕴藏的规律&#xff0c;找出问题&#xff0c;进而做出决策&#xff1b;另一方面&#xff0c;数据可视化项目也是一张重要的名片&#xff0c;是企业数字化建设效果的呈现。本…

微信小程序for循环示例(JavaScript)

微信小程序for循环示例&#xff08;JavaScript&#xff09; 在微信小程序开发中&#xff0c;我们最常用的循环方式就是for和foreach&#xff0c;接下来我就浅浅的将自己的写的一小段示例代码分享给大家。 首先是for循环&#xff0c;也是咱们最常用的方式&#xff0c;具体示例…