重学TCP协议(5) 自连接

1.自连接是什么

在发起连接时,TCP/IP的协议栈会先选择source IP和source port,在没有显示调用bind()的情况下,source IP由路由表确定,source port由TCP/IP协议栈从local port range中选取尚未使用的port。

如果destination IP正好是本机,而destination port位于local port range,且没有服务器监听(listen)的话,source port可能正好选中了destination port这就出现了(source IP,source port)=(destination IP,destination port)的情况,即发生了自连接。

2.自连接是怎么发生的

1. 两个tcp连接同时打开

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ax6Cx2X-1620216330809)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/43753ba6ae7f4b3eb984a2d0ff204720~tplv-k3u1fbpfcp-watermark.image)]

2.本来正常运行的客户端和服务端,服务端偶然挂掉之后,客户端再去连接它,就有可能出现自连接现象。

例如:同一台机器上的客户端和服务端(端口:50000)建立了一个长连接,服务端的进程挂掉了,端口50000释放,客户端去connect这个服务端的目的端口的时候正好选择了50000作为源端口,此时该端口没人用(因为服务端挂断了),使用是合法的,于是自连接形成了。

3.如何防止自连接

1. 让服务监听的端口与客户端随机分配的端口不可能相同即可

因为客户端随机分配的范围由 /proc/sys/net/ipv4/ip_local_port_range 文件决定,,所以只要让服务监听的端口小于 客户端分配的端口范围,就不会出现客户端与服务端口相同的情况。

2. 出现自连接的时候,主动关掉连接

例如在Go语言的tcp库中,加入的自连接判断

func selfConnect(fd *netFD, err error) bool {// If the connect failed, we clearly didn't connect to ourselves.if err != nil {return false}// The socket constructor can return an fd with raddr nil under certain// unknown conditions. The errors in the calls there to Getpeername// are discarded, but we can't catch the problem there because those// calls are sometimes legally erroneous with a "socket not connected".// Since this code (selfConnect) is already trying to work around// a problem, we make sure if this happens we recognize trouble and// ask the DialTCP routine to try again.// TODO: try to understand what's really going on.if fd.laddr == nil || fd.raddr == nil {return true}l := fd.laddr.(*TCPAddr)r := fd.raddr.(*TCPAddr)return l.Port == r.Port && l.IP.Equal(r.IP)
}

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

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

相关文章

Gradle复制文件/目录方法

2019独角兽企业重金招聘Python工程师标准>>> gradle复制文件/文件夹方法 复制文件 //复制IDE生成的classes.jar文件到build/libs中,并改名为FileUtils.jar. task copyFile(type:Copy) {delete build/libs/FileUtils.jarfrom(build/intermediates/bundles…

用户参与度与活跃度的区别_用户参与度突然下降

用户参与度与活跃度的区别disclaimer: I don’t work for Yammer, this is a public data case study, I’ve written it in a narrative format to make this case study more engaging to read.免责声明:我不为Yammer工作,这是一个公共数据案例研究&am…

python:__new__()与__init__()

参考:https://blog.csdn.net/qq_41020281/article/details/79638370 转载于:https://www.cnblogs.com/gcgc/p/11585599.html

重学TCP协议(6) 四次挥手

1. 四次挥手 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN1,其序列号为sequ(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1&#xff…

mysql数据库部分操作指令

用cmd开启服务时拒绝访问. 原因:不是管理员用户,没有权限 将服务中的 MySQL设置为手动启动, 否则 开机自动启动. 启动mysql服务,用管理员权限打开dos界面 windowsX A 打开开始界面 点击管理员开启cmd 启动服务:net start …

推箱子2-向右推!_保持冷静并砍箱子-哔

推箱子2-向右推!Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards a C…

UML建模图实战笔记

一、前言 UML:Unified Modeling Language(统一建模语言),使用UML进行建模的作用有哪些: 可以更好的理解问题可以及早的发现错误或者被遗漏的点可以更加方便的进行组员之间的沟通支持面向对象软件开发建模,可…

数据草拟:使您的团队热爱数据的研讨会

Learn the rules to Data Draw Up; a fun way to get your teams invested in data.了解数据收集的规则; 一种让您的团队投入数据的有趣方式。 Let’s keep things short. Metrics are one of the most important things in Product Management. They help us to u…

python:列表推导式

python中有种独特的语法:推导式,可以将代码压缩到1行,但是不使用也不影响。 有三种:列表、字典、集合(注意没有元组推导式) 列表推导式 # 1、一行代码实现1—100之和(知识点:列表推导式) print(…

WPF中删除打开过的图片

WPF中删除打开过的图片 原文:WPF中删除打开过的图片在WPF中,当我们删除打开过的图片时,往往会遇到"...无法删除,文件正在被另一个进程使用"的异常。即使当前文件是打开后关闭过的也不行。 这个问题的原因很简单,是因为W…

深入理解InnoDB(5)-文件系统

1. 数据库和文件系统的关系 像 InnoDB 、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。…

vim捐赠_#PayItBackwards-一位freeCodeCamp毕业生如何向事业捐赠10,000美元

vim捐赠On Monday my phone suddenly started buzzing. Shawn Wang, AKA Swyx, had just tweeted about a donation hed made to freeCodeCamp.org.星期一,我的电话突然开始嗡嗡作响。 Awn Swyx的Shawn Wang刚刚在推特上发布了他对freeCodeCamp.org的捐款。 I glan…

Digital River拉来Netconcepts站台 亚太营销服务升级

它是大洋彼岸的一家网络软件下载、分销商,很多重量级的软件行业领军企业都是其客户,它一直低调摸索亚太营销的路子,在今年九月份,它一改常态,高调宣布入华,三个月后,它带来了最新消息&#xff1…

按下按钮_按下

按下按钮Updated with the latest data: 23/8/2020更新最新数据:23/8/2020 As restrictions are lifted for Laois and Offaly, difficult times are set to continue for the people of Kildare, at least for another couple of weeks, as they continue to fight…

windows中怎么添加定时任务

linux中有crontab定时任务,很方便 其实windows也有类似的 需求:定时执行python脚本 1、Windows键R,调出此窗口,输入compmgmt.msc 2、 转载于:https://www.cnblogs.com/gcgc/p/11594467.html

css设置黑体宋体等(转)

代码如下: .selector{ font-family:"Microsoft YaHei",微软雅黑,"MicrosoftJhengHei",华文细黑,STHeiti,MingLiu } 说明: 加上中文名“微软雅黑”是为了兼容opera。 MicrosoftJhengHei为微软正黑体,STHeiti为华文黑体,Mi…

重学TCP协议(7) Timestamps 选项

1.Timestamps 选项的组成部分 时间戳选项占10个字节 kind(1字节) + length(1字节) info (8字节),其中kind8,length10,info由timestamp(TS value)和timestamp echo(TS Echo Reply)两…

sudoku代码_首席执行官可以编码吗? 在星期六晚上坐在酒吧时,从头开始观看Netlify首席执行官的Sudoku应用程序代码

sudoku代码Netlify CEO Matt Biilmann live-codes a Sudoku app using Netlify in this tutorial video. Matt shows how simple and quick it can be to create a working app using the JAMstack.在本教程视频中,Netlify CEO Matt Biilmann使用Netlify对Sudoku应用…

c++ 时间序列工具包_我的时间序列工具包

c 时间序列工具包When it comes to time series forecasting, I’m a great believer that the simpler the model, the better.关于时间序列预测,我坚信模型越简单越好。 However, not all time series are created equal. Some time series have a strongly defi…

bash 的相关配置

bash 参数自动补全 请安装 bash-completion bash 提示符 说明:参考文档 1. 简洁风格 if [[ ${EUID} 0 ]] ; then PS1\[\033[01;32m\][\[\033[01;35m\]\u\[\033[01;37m\] \w\[\033[01;32m\]]\$\[\033[00m\] else PS1\[\033[01;32m\][\u\[\033[01;37m\] \w\[\033[01;…