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

本文探讨了线上环境中同一机器上两个模块A和B通信时,A向B重启后的监听套接字发起连接,导致源目的IP和端口完全相同的问题。这种特殊连接在重启场景中易于复现。

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


  这种类型的连接产生的过程类似于同时打开的情况。同时打开的情况是两个机器同时向另一个机器的已知端口发送SYN,一个机器上发送的SYN的目的IP和端口是另一个机器上发送SYN的套接字的本地IP和端口(注意这两个机器上没有对应端口的监听套接字),状态迁移过程如下图所示:
要实现从内网主机发送一个特定的UDP报文,并要求服务器使用NAT映射后的IP端口进行回应,需要在网络设备上配置适当的NAT规则,确保UDP流量能够正确地从内网穿透到外网,并且服务器在回应时能够将数据包发送回正确的内网主机端口。以下是实现这一目标的关键步骤注意事项: ### 三、UDP端口映射配置 在NAT环境中,UDP端口映射通常涉及将外网的某个IP地址端口映射到内网主机的特定端口TCP不同,UDP是无连接协议,因此NAT设备必须能够跟踪UDP会话的状态,以便正确地将响应流量转发回原始发送者。 在华为设备上,可以使用以下命令配置NAT Server以实现UDP端口映射: ```bash nat server protocol udp global 203.0.113.45 53 inside 192.168.1.10 53 ``` 上述命令将外网IP `203.0.113.45` 的UDP端口`53`(通常用于DNS服务)映射到内网主机 `192.168.1.10` 的相同端口[^3]。 ### 四、内网主机发送UDP报文 为了从内网主机发送UDP报文并确保服务器使用NAT映射后的IP端口进行回应,内网主机应使用绑定到特定端口的UDP socket来发送请求。例如,在Linux系统中,可以通过以下Python代码实现: ```python import socket UDP_IP = "8.8.8.8" # 外网服务器的IP地址 UDP_PORT = 53 # 外网服务器监听的端口 MESSAGE = b"Hello, Server!" print("UDP target IP: %s" % UDP_IP) print("UDP target port: %s" % UDP_PORT) print("message: %s" % MESSAGE) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(("0.0.0.0", 5353)) # 绑定到本地UDP端口5353 sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) data, addr = sock.recvfrom(1024) print("Received response from %s: %s" % (addr, data)) ``` 在此示例中,内网主机绑定了本地UDP端口`5353`并向外网服务器发送UDP报文。NAT设备会记录该连接状态,并将来自服务器的响应流量转发回内网主机的`5353`端口[^5]。 ### 五、NAT设备的会话保持 为了确保服务器的响应能够正确地返回到内网主机,NAT设备需要维护一个会话表,记录内网IP端口外网IP端口之间的映射关系。当服务器收到请求后,它将根据IP端口(即NAT设备的外网IP端口)来构造响应。NAT设备接收到响应后,查找会话表,并将目的IP端口转换回内网主机的实际IP端口,然后转发给内网主机[^1]。 ### 六、NAT穿透技术 某些情况下,可能需要使用NAT穿透技术(如STUN、TURN或ICE)来帮助应用程序发现其所在的NAT类型,并获取NAT分配的公网IP端口。这些技术常用于VoIP、P2P等需要直接通信的应用场景中。通过这些技术,应用程序可以主动获取其在NAT上的映射信息,并将这些信息告知通信对端,从而实现双向通信[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值