java tcp 监听端口_【TCP/IP】端口未监听,还能访问成功?

68bfdf3476ef0c6acd06a67b23f67ce1.gif

作者:Mr林_月生链接:https://www.jianshu.com/p/3ab10c8685b5

现象

直接上图

68bfdf3476ef0c6acd06a67b23f67ce1.gif

可以发现,本地没监听50000端口的服务,但是尝试连接本地50000端口时,却能成功建立连接,这种现象叫做「自连接」。

我们再通过netstat命令查看创建的连接是怎样的。

68bfdf3476ef0c6acd06a67b23f67ce1.gif

我们可以注意到,创建的连接的源端口和目的端口都是一样的。

原因分析

我们都知道,一条TCP连接主要是由源端口、源IP、目的端口、目的IP四部分组成的,我们称为「TCP socket四元组」。

当我们尝试对本机的一个端口创建连接时,四元组中的源IP、目的端口和目的IP已经确定了(源IP和目的IP都是本地IP,目的端口即是我们尝试请求的端口),至于源端口,是由系统为该连接分配的一个临时端口。

此时,如果目的端口未被监听,连接会有两种结果:

系统分配的源端口与目的端口不一样,则会报「Connection refused」的错误。

系统分配的源端口与目的端口一样,此时连接能创建成功,这种情况我们称为自连接。

发生自连接时,创建连接时包的交互过程如下。

68bfdf3476ef0c6acd06a67b23f67ce1.gif

系统分配给连接的源端口为50000,所以,tcp将通过50000端口发送一个SYN包给对端,并将连接状态置为「SYN_SENT」

由于50000端口同时也是目的端口,所以它会收到SYN报文,这时它会以为是对端同时也想创建连接,所以会回复SYN+ACK报文,并将连接状态置为「SYN_RCVD」

SYN+ACK报文也是会被50000端口自己接收的,它会以为这是对端给它的回复报文,所以认为握手成功,连接状态置为「ESTABLISHED」

自连接发生的条件

目的端口处于临时端口范围(linux临时端口范围由net.ipv4.ip_local_port_range决定)

目的端口未被监听

目的IP是本地IP

自连接的危害

假设有这样一个场景,一个机器上有A和B两个服务,服务A会请求服务B,服务B监听的端口属于临时端口。

有一天,服务B挂了,然后服务A一直在重连服务B,很不幸的发生了自连接。

这时候,服务B想重启时,就会发生端口占用的报错了。

避免自连接的手段

服务监听端口不要使用临时端口

68bfdf3476ef0c6acd06a67b23f67ce1.gif

如果感觉推送内容不错,不妨右下角点个在看,感谢支持!

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

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

相关文章

python随机生成定长字符串(转)

原文:http://www.oschina.net/code/snippet_153443_4752 运行结果: 转载于:https://www.cnblogs.com/Jollyxi/p/7992007.html

HDU 2204 Eddy's爱好(容斥原理)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2204 解题报告&#xff1a;输入一个n让你求出[1&#xff0c;n]范围内有多少个数可以表示成形如m^k的样子。 不详细说了&#xff0c;自己一开始也忽略了三个素数的乘积的乘方的情况。 1 #include<cstdio>2…

python 物理引擎 摩擦力_参赛作品2-phenom的2D物理引擎

全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者&#xff0c;东汉书院在致力于使得更多人群具备内核级竞争力的道路上&#xff0c;将带给小伙伴们更多的公开技术教学和视频&#xff0c;感谢一路以来有你的支持。我们正在用实际行动来帮助小伙伴们…

vue-cli的webpack模版,相关配置文件dev-server.js与webpack.config.js配置解析

1.下载vue-cli [html] view plaincopy npm install vue-cli -g vue-cli的使用与详细介绍&#xff0c;可以到github上获取https://github.com/vuejs/vue-cli 2.安装webpack项目模版 [html] view plaincopy vue init <template-name> <project-name> 比如&#xff…

zookeeper windows 下安装

2019独角兽企业重金招聘Python工程师标准>>> 前沿&#xff1a;最近公司做的项目用到了dubbo 和 zookeeper 由于 每次测试的时候 我本地的服务就会注册到测试机上&#xff0c;还得每次把测试机的服务停止掉&#xff0c;所以准备在本地搭建一个zookeeper。 安装过程 2…

小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载四(场景切换)...

作为一款真正有使用价值的应用&#xff0c;首先应该至少有两个页面&#xff0c;通过页面的切换来实现更多的交互。比如手机人人网&#xff0c;打开以后先是进入登录页面&#xff0c;登录后会有新鲜事&#xff0c;然后拉开左边的面板&#xff0c;能看到相册、悄悄话、应用之类的…

Mysql学习总结(12)——21分钟Mysql入门教程

21分钟 MySQL 入门教程 目录 一、MySQL的相关概念介绍二、Windows下MySQL的配置 配置步骤MySQL服务的启动、停止与卸载三、MySQL脚本的基本组成四、MySQL中的数据类型五、使用MySQL数据库 登录到MySQL创建一个数据库选择所要操作的数据库创建数据库表六、操作MySQL数据库 向表中…

java 队列实例_Java 实例 - 队列(Queue)用法

全屏Java 实例 - 队列(Queue)用法队列是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作。LinkedList类实现了Queue接口&#xff0c;因此我们可以把LinkedList当成Queue来用。以下实例演示了队列(Queue)的用法&#xff1a;Ma…

@Html辅助方法

Html.LabelFor(m > m.UserName, new { class "col-md-2 control-label" })LabelFor使用了模型类中相应的DisplayName属性Html.ValidationSummary(true, "", new { class "text-danger" })验证消息的显示有两种&#xff0c;一种是Validation…

PrintJ的设计模式之旅——1.模式之父

好奇设计模式的源头&#xff0c;做了一番搜索和调查&#xff0c;于是便开启了这个系列“PrintJ的设计模式之旅”。 1.模式之父 GOF&#xff08;Gang of Four&#xff09; Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides合著了"Design Patterns: Elements of…

iOS 添加导航栏两侧按钮

self.navigationItem.leftBarButtonItem [[UIBarButtonItem alloc] initWithTitle:"首页" style:UIBarButtonItemStyleBordered target:self action:selector(popToRootView)] ;self.navigationItem.rightBarButtonItem [[UIBarButtonItem alloc] initWithTitle:&q…

java 1.6 ubuntu_ubuntu配置 Java SE 1.6

今天编译android 4.0时提示如下错误&#xff1a;You are attempting to build with the incorrect version of java.Your version is: java version "1.6.0_22".The correct version is: Java SE 1.6.查了一下现在已安装的java&#xff1a;java -versionjava version…

微信小程序 功能函数 把数字1,2,3,4换成春,夏,秋,冬

let season ‘1,2,3’;// console.log(season.length)if (season){if (season.length1){seasonChe1season.substr(0);seasonChe1 parseInt(seasonChe1)switch (seasonChe1) {case 1:(function(){seasonChe2春})()break;case 2:(function () {seasonChe2 夏})()break;case 3:(…

UVa 11549 Calculator Conundrum

大白书里面的题感觉就是没有什么固定的思路&#xff0c;只能认真理解学习汝佳大大的代码。 这里用的Floyd判圈法&#xff0c;就像插图里面的一样&#xff0c;两个小孩&#xff0c;一个快一个慢&#xff0c;如果实在一个环形跑道&#xff0c;那么快的那个最终一定会“追上”慢的…

servlet与MySQL商品管理系统_servlet和mysql实现宿舍管理系统

【实例简介】servlet mysql实现的宿舍管理系统&#xff0c;以及各个功能的视频录像【实例截图】【核心代码】Sushem└── Sushem├── kk 录像│ └── kk 2017-11-13 17-11-38.avi└── Sushem├── src│ ├── dao│ │ ├── BaoxiuDao.java│ │ ├──…

几个性能测试工具

我个人认为一个优秀的软件工程师必须掌握一定的测试技能。可能有的开发工程师认为测试是测试工程师的事情&#xff0c;不是开发工程师的事情。这种开发工程师是缺一条腿的&#xff0c;离开了测试工程师&#xff0c;你如何证明你的程序没有问题。 下面是我这两天搜集的性能测试工…

Bootstrap页面布局14 - BS按钮群组

首先看看这个代码&#xff1a; <div classbtn-group><button typebutton classbtn>计算机</button><button typebutton classbtn>网络</button><button typebutton classbtn>桌面项目</button> </div> 将功能相近的按钮分成一…

type const mysql_Mysql Explain之type详解

select version()&#xff1a;5.7.21MySQL 提供了一个 EXPLAIN 命令, 它可以对 SQL 语句进行分析, 并输出 SQL 执行的详细信息, 以供开发人员针对性优化.例如分析一条 SELECT 语句EXPLAIN 结果中的type字段Tips&#xff1a;常见的扫描方式system&#xff1a;系统表&#xff0c;…

Android Intent传递数据

刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intentnew Intent(MainActivity.this,TwoActivity.class);intent.putExtra("data", "hello two");startActivity(…

WCF中的标准绑定

使用过WCF的童鞋们都很清楚&#xff0c;绑定是必须的。我将这些绑定总结了下。 一、标准绑定简要说明 1.basicHttpBinding基于WS-I Basic Profile 1.1 的web服务,所需的.Net Framework版本为 3.0 以上。 2.wsHttpBinding针对改进的web服务的绑定,包括WS-Security,WS-Transactio…