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范围在服务端端口以外,让客户端端口与服务端端口不冲突
相关推荐
_F_y2 分钟前
Socket编程UDP
网络·网络协议·udp
roman_日积跬步-终至千里3 分钟前
【源码分析】StarRocks EditLog 写入与 Replay 完整流程分析
java·网络·python
车载测试工程师3 分钟前
CAPL学习-AVB交互层-媒体函数1-回调&基本函数
网络·学习·tcp/ip·媒体·capl·canoe
Robot侠6 分钟前
ROS1从入门到精通 6: 参数服务器与动态参数(配置管理最佳实践)
服务器·机器人操作系统·rso
waves浪游15 分钟前
进程控制(下)
linux·运维·服务器·开发语言·c++
努力进修19 分钟前
【JavaEE初阶】UDP协议和TCP协议
tcp/ip·udp·java-ee
爱尔兰极光24 分钟前
计算机网络--TCP传输
网络·tcp/ip·计算机网络
周周记笔记27 分钟前
Ubuntu 中如何配置域名
运维·服务器
醉舞经阁半卷书128 分钟前
zookeeper服务端配置
网络·分布式·zookeeper
晚风(●•σ )1 小时前
【华为 ICT & HCIA & eNSP 习题汇总】——题目集27
网络·计算机网络·网络安全·华为