tcp自连接问题

现象重现

在linux主机下运行下面的python脚本,等待一会即可出现。

import socketimport timeconnected=Falsewhile (not connected):
        try:
                sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                sock.setsockopt(socket.IPPROTO_TCP,socket.TCP_NODELAY,1)
                sock.connect(('127.0.0.1',55555))
                connected=True
        except socket.error,(value,message):                print message        if not connected:                print "reconnect"print "tcp self connection occurs!"print "try to run follow command : "print "netstat -an|grep 55555"time.sleep(1800)

截图如下:

tcp自连接出现了!

原因分析

从上面的python脚本中,可以看到它只是在不断地尝试连接55555这个端口,并且是没有socket监听这个端口,那么为何最后却建立连接了呢?原因在于客户端在连接服务端时,如果没有指定端口号,系统会随机分配一个。随机就意味着可能分配一个和目的端口一样的数字,此时就会出现自连接情况了。因为对于tcp协议来讲,连接的流程是走的通,三次握手整个阶段都合法,连接自然可以建立。

自连接的坏处显而易见,当程序去connect一个不处于监听的端口时,必然期待其连接失败,如果自连接出现,就意味着该端口被占用了,那么:

  1. 真正需要监听该端口的服务会启动失败,抛出端口已被占用的异常。
  2. 客户端无法正常完成数据通信,因为这是个自连接,并不是一个正常的服务。

解决思路

解决办法也很简单,只要保证客户端随机的端口不会和服务监听的端口相同就可以了。那么我们得先了解随机的范围,这个范围对应linux的/etc/sysctl.confnet.ipv4.ip_local_port_range参数,其默认值是32768 61000。也就是说随机端口会在这个范围内出现,试验中我们选定了55555这个端口,所以出现了自连接现象。此时只要限定服务监听在32768端口以下,就不会出现自连接现象了。当然,你可以修改这个配置,只要注意保证监听端口不再配置范围内就可以避免自连接问题了。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

怎样学Python 第二十二课 Python网络编程基础

欢迎大家回来! 在上一篇文章中,我们介绍了如何导入模块以及如何使用它们。 在本文中,我们将接触对Python黑客来说至关重要的模块:socket。 实质上,套接...

37070
来自专栏IT可乐

Nginx(一)------简介与安装

  说到 Nginx ,可能大家最先想到的就是其负载均衡以及反向代理的功能。没错,这也是当前使用 Nginx 最频繁的两个功能,但是 Nginx 可不仅仅只有这...

20430
来自专栏北京马哥教育

Python之包管理工具快速入门

学Python最简单的方法是什么?推荐阅读:30万年薪Python开发工程师成长魔法 在Python环境中已经有很多成熟的包,可以通过安装这些包来扩展我们的程序...

30250
来自专栏施炯的IoT开发专栏

Windows 10 IoT Serials 6 - 如何修改IoTStartupOnBoot.cmd文件

    使用Windows 10 IoT Core系统的朋友应该会比较熟悉IoTStartupOnBoot.cmd文件,该文件是系统启动以后加载的批处理文件,一...

27180
来自专栏静默虚空的博客

DNS 协议入门

域名系统 (DNS) 的作用是将人类可读的域名 (如,www.example.com) 转换为机器可读的 IP 地址 (如,192.0.2.44)。

55020
来自专栏hbbliyong

将Python脚本打包成可执行文件

本文主要就是介绍最后一种方式,.py和.pyc都比较简单,Python本身就可以搞定。将Python脚本打包成可执行文件有多种方式,本文重点介绍PyInstal...

27610
来自专栏MoeLove

Composer 使用技巧简述

上述代码执行完成后, 只是下载到了 composer.phar 文件, 可以通过 php composer.phar 在任意位置执行.

14650
来自专栏晨星先生的自留地

linux软件包管理工具

30630
来自专栏Java技术分享圈

本地安装谷歌的插件之 CRX格式插件离线安装

方法一 :开发模式安装 [亲测] 1.把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar (如何查看Chrome插件的扩展名...

10320
来自专栏猛牛哥的博客

Centos安装简单易用的端口转发工具:rinetd

1.2K50

扫码关注云+社区

领取腾讯云代金券