首页 > 其他 > 详细

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

时间:2014-03-10 23:10:13      阅读:777      评论:0      收藏:0      [点我收藏+]

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

bubuko.com,布布扣

bubuko.com,布布扣
  这种类型的连接产生的过程类似于同时打开的情况。同时打开的情况是两个机器同时向另一个机器的已知端口发送SYN,一个机器上发送的SYN的目的IP和端口是另一个机器上发送SYN的套接字的本地IP和端口(注意这两个机器上没有对应端口的监听套接字),状态迁移过程如下图所示:
bubuko.com,布布扣
bubuko.com,布布扣
  这里看到的连接的建立过程只发生在一个机器、一个套接字上,但是过程几乎是一样的。我们假设套接字名称是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套接字的状态。状态迁移过程如下所示:
bubuko.com,布布扣
bubuko.com,布布扣

源目的IP和端口都相同的连接出现的原因,布布扣,bubuko.com

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

原文:http://blog.csdn.net/justlinux2010/article/details/20947609

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!