UDP调用connect()后服务端无法接收客户端报文问题求助
问题根因分析
- 客户端IP层发包校验失败
你客户端代码将socket绑定到源IP172.28.33.22,同时指定发包目标IP为127.0.0.1(回环地址)。Linux内核默认对回环路径的数据包做严格合法性校验:发往127.0.0.0/8段的数据包,源IP必须也属于回环地址段,否则内核会直接丢弃该数据包,同时返回ICMP目标不可达报文,这就是你抓到ICMP报错的核心原因,数据包在IP层就被拦截,根本没有递交给服务端的UDP socket。 - 你对UDP
connect()的作用理解是正确的,但不符合当前问题场景
UDP调用connect()后确实只会接收源IP、源端口和connect()指定参数完全匹配的报文,其他地址发来的报文会被丢弃。但你的场景下客户端的报文在IP层就被丢弃,服务端从来没有收到过这个报文,自然不会触发后续的过滤逻辑。
修复方案
- 方案一:修改客户端发包的目标IP为
172.28.33.22,和绑定的源IP保持同网段,满足内核路由校验规则 - 方案二:修改客户端绑定的源IP为
127.0.0.1,和目标地址的回环段属性匹配 - 方案三:仅测试场景可临时修改内核参数放开校验,执行
sysctl -w net.ipv4.conf.all.accept_local=1即可,生产环境不建议修改该参数
内容的提问来源于stack exchange,提问作者february
相关产品推荐
相关产品推荐

