专栏首页Golang语言社区源目的IP和端口都相同的连接出现的原因

源目的IP和端口都相同的连接出现的原因

线上遇到了一个比较特殊的连接,它的源目的IP和端口完全相同,复现的场景是:同一个机器上的两个模块A和B通信,A模块会向B模块的监听套接字发起连接请求,B模块重启的时候就很容易出现这样的问题。下图是在线下复现的连接情况:

这种类型的连接产生的过程类似于同时打开的情况。同时打开的情况是两个机器同时向另一个机器的已知端口发送SYN段,一个机器上发送的SYN段的目的IP和端口是另一个机器上发送SYN段的套接字的本地IP和端口(注意这两个机器上没有对应端口的监听套接字),状态迁移过程如下图所示:

这里看到的连接的建立过程只发生在一个机器、一个套接字上,但是过程几乎是一样的。我们假设套接字名称是sk,调用bind将sk套接字的本地IP绑定为192.168.56.101,本地端口绑定为9090。首先,sk向目的IP是192.168.56.101,目的端口是9090的服务器发送SYN段,在发送SYN段之前,协议栈会将sk这个套接字的目的地址设置为192.168.56.101,目的端口设置为9090。当然,这个SYN段肯定是会在本机上进行接收处理。接收到这个SYN段后,会调用__inet_lookup()来查找对应的套接字。由于这个SYN段的源目的IP和端口信息和sk套接字的信息完全匹配,所以会由sk套接字来处理。sk套接字的状态会迁移到SYN_RCVD,然后发送SYN+ACK段。这个SYN+ACK段还是会由本机上的sk套接字处理。在SYN_RCVD状态下接收到SYN+ACK段,套接字的状态会迁移到ESTABLISHED。因为此时sk套接字期望接收的序列号,要比SYN+ACK段的序列号大1,相当于接收到了重复的段,所以还要发送一个D-ACK段,表示接收到了重复的段,但是不会影响sk套接字的状态。状态迁移过程如下所示:

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • selec/poll中的读写事件和epoll中的读写事件

    在Linux网络编程中,常常使用select和poll来做事件触发,监听socket的读写状态,然后进行读写操作。现在新的linux内核中,增加了epoll事件...

    李海彬
  • 【图解】Web前端实现类似Excel的电子表格

    本文将通过图解的方式,使用纯前端表格控件 SpreadJS 来一步一步实现在线的电子表格产品(例如可构建Office 365 Excel产品、Google的在...

    李海彬
  • GO语言学习:动态Web

    使用Golang中的模板template来实现在HTML中动态Web. 1.网络端口监听操作: Web动态页面要使用http.HandleFunc()而不...

    李海彬
  • udp/tcp流程

    py3study
  • Python Socket 编程详细介绍(转)

    套接字格式:socket(family, type[,protocal]) 使用给定的套接族,套接字类型,协议编号(默认为0)来创建套接字

    超蛋lhy
  • 【震惊】padding-top的百分比值参考对象竟是父级元素的宽度

    书写页面样式与布局是前端工程师Coding 中必不可少的一项工作,在定义页面元素的样式时,padding 属性也是经常被使用到的。

    胡哥有话说
  • Python 初学者常犯的5个错误,布尔型竟是整型的子类

    Python 是一种高级的动态编程语言,它以易于使用著名。目前 Python 社区已经非常完善了,近几年它的发展尤为迅猛。但是易于使用同样能带来一些坏处,即易于...

    机器之心
  • 抖音们继续浪,微信还能否成为B2B内容营销主战场?

    目前中国短视频独立用户数已经达到5.08亿,占国内网民总数的46%,这意味着基本上每2个互联网用户数中就有1个使用短视频。随着5G时代的到来,短视频的发布和消费...

    人称T客
  • LeetCode 1629. 按键持续时间最长的键

    LeetCode 设计了一款新式键盘,正在测试其可用性。测试人员将会点击一系列键(总计 n 个),每次一个。

    Michael阿明
  • 项目中Zookeeper配置参数笔记

    ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个prop...

    用户3003813

扫码关注云+社区

领取腾讯云代金券