Tcp自连接

Tcp自连接

如果客户端和服务端都在同一个环境,并且客户端先于服务端启动,那么很有可能产生自连接的现象。

所谓自连接,就是tcp两端使用了同一个端口进行连接,即localhost:port->localhost:port。

实现自连接

下面提供一个例子来验证tcp自连接

代码:recipes-master\python\self-connect.py

python 复制代码
#!/usr/bin/python

import errno
import socket
import sys
import time

if 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

shell 复制代码
sudo sysctl net.ipv4.ip_local_port_range

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

shell 复制代码
[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端口是不是相同,相同的话就断开此连接
c 复制代码
#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范围在服务端端口以外,让客户端端口与服务端端口不冲突
相关推荐
九河云21 分钟前
华为云 GaussDB:金融级高可用数据库,为核心业务保驾护航
网络·数据库·科技·金融·华为云·gaussdb
独行soc24 分钟前
2025年渗透测试面试题总结-66(题目+回答)
java·网络·python·安全·web安全·adb·渗透测试
码农101号1 小时前
运维安全05 - iptables规则保存与恢复
运维·网络·安全
Empty_7771 小时前
SELinux安全上下文
linux·服务器·安全
sukalot3 小时前
window显示驱动开发—视频呈现网络的术语
网络
千鼎数字孪生-可视化4 小时前
WebSocket实时推送技术:PLC状态监控大屏的高效实现路径
网络·websocket·网络协议
李白你好4 小时前
这是一个用于扫描Zabbix系统中常见漏洞的工具,提供了图形界面(GUI)和命令行(CLI)两种使用方式。
网络·安全·zabbix
蒋星熠4 小时前
破壁者指南:内网穿透技术的深度解构与实战方法
网络·数据库·redis·python·websocket·网络协议·udp
恒创科技HK6 小时前
现在中国香港服务器速度怎么样?
运维·服务器