Netcat服务器未响应客户端SYN请求:为何未生成SYN-ACK?
服务器未返回SYN-ACK报文的排查指导
上下文
- 客户端:STM32U585,搭载ENC28J60以太网控制器与NetX TCP/IP协议栈
- 服务器:Ubuntu系统,运行netcat服务器,启动命令:
netcat -l -p 6001 -s 192.168.1.2 -v - 网络环境:客户端与服务器以太网直连(无路由器),NetX未配置PPP,客户端硬编码服务器MAC与IP地址
- 验证信息:Wireshark确认服务器已收到SYN报文;该服务器可与其他Linux机器的netcat客户端正常建立连接
问题
服务器收到SYN报文后未生成SYN-ACK报文,以下是服务器端Wireshark捕获的SYN报文详情(目的MAC地址已编辑,与服务器硬件MAC一致):
Frame 1: 62 bytes on wire (496 bits), 62 bytes captured (496 bits) on interface enx00e121212121, id 0 Interface id: 0 (enx00e121212121) Interface name: enx00e121212121 Encapsulation type: Ethernet (1) Arrival Time: Mar 1, 2023 14:30:32.775293348 IST [Time shift for this packet: 0.000000000 seconds] Epoch Time: 1677661232.775293348 seconds [Time delta from previous captured frame: 0.000000000 seconds] [Time delta from previous displayed frame: 0.000000000 seconds] [Time since reference or first frame: 0.000000000 seconds] Frame Number: 1 Frame Length: 62 bytes (496 bits) Capture Length: 62 bytes (496 bits) [Frame is marked: False] [Frame is ignored: False] [Protocols in frame: eth:ethertype:ip:tcp] [Coloring Rule Name: TCP SYN/FIN] [Coloring Rule String: tcp.flags & 0x02 || tcp.flags.fin == 1] Ethernet II, Src: Coherent_8b:10:11 (00:1b:1c:8b:10:11), Dst: RealtekS_68:05:03 (00:XX:XX:XX:XX:XX) Destination: RealtekS_68:05:03 (00:XX:XX:XX:XX:XX) Address: RealtekS_68:05:03 (00:XX:XX:XX:XX:XX) .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) .... ...0 .... .... .... .... = IG bit: Individual address (unicast) Source: Coherent_8b:10:11 (00:1b:1c:8b:10:11) Address: Coherent_8b:10:11 (00:1b:1c:8b:10:11) .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) .... ...0 .... .... .... .... = IG bit: Individual address (unicast) Type: IPv4 (0x0800) Internet Protocol Version 4, Src: 192.168.1.13, Dst: 192.168.1.2 0100 .... = Version: 4 .... 0101 = Header Length: 20 bytes (5) Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) 0000 00.. = Differentiated Services Codepoint: Default (0) .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) Total Length: 48 Identification: 0x0001 (1) Flags: 0x00 0... .... = Reserved bit: Not set .0.. .... = Don't fragment: Not set ..0. .... = More fragments: Not set ...0 0000 0000 0000 = Fragment Offset: 0 Time to Live: 128 Protocol: TCP (6) Header Checksum: 0xb767 [validation disabled] [Header checksum status: Unverified] Source Address: 192.168.1.13 Destination Address: 192.168.1.2 Transmission Control Protocol, Src Port: 6000, Dst Port: 6001, Seq: 0, Len: 0 Source Port: 6000 Destination Port: 6001 [Stream index: 0] [Conversation completeness: Incomplete, SYN_SENT (1)] [TCP Segment Len: 0] Sequence Number: 0 (relative sequence number) Sequence Number (raw): 4106063055 [Next Sequence Number: 1 (relative sequence number)] Acknowledgment Number: 0 Acknowledgment number (raw): 0 0111 .... = Header Length: 28 bytes (7) Flags: 0x002 (SYN) 000. .... .... = Reserved: Not set ...0 .... .... = Nonce: Not set .... 0... .... = Congestion Window Reduced (CWR): Not set .... .0.. .... = ECN-Echo: Not set .... ..0. .... = Urgent: Not set .... ...0 .... = Acknowledgment: Not set .... .... 0... = Push: Not set .... .... .0.. = Reset: Not set .... .... ..1. = Syn: Set [Expert Info (Chat/Sequence): Connection establish request (SYN): server port 6001] [Connection establish request (SYN): server port 6001] [Severity level: Chat] [Group: Sequence] .... .... ...0 = Fin: Not set [TCP Flags: ··········S·] Window: 512 [Calculated window size: 512] Checksum: 0x5053 [unverified] [Checksum Status: Unverified] Urgent Pointer: 0 Options: (8 bytes), Maximum segment size, No-Operation (NOP), No-Operation (NOP), No-Operation (NOP), End of Option List (EOL) TCP Option - Maximum segment size: 1460 bytes Kind: Maximum Segment Size (2) Length: 4 MSS Value: 1460 TCP Option - No-Operation (NOP) Kind: No-Operation (1) TCP Option - No-Operation (NOP) Kind: No-Operation (1) TCP Option - No-Operation (NOP) Kind: No-Operation (1) TCP Option - End of Option List (EOL) Kind: End of Option List (0) [Timestamps] [Time since first frame in this TCP stream: 0.000000000 seconds] [Time since previous frame in this TCP stream: 0.000000000 seconds]
排查方向
校验码合法性检查
- TCP校验码:报文显示TCP校验码
0x5053未通过验证,Linux内核会直接丢弃校验失败的TCP包。需确认NetX协议栈计算SYN包校验码时,是否正确包含了IP伪头部(源IP、目的IP、协议号、TCP长度)的内容。 - IP校验码:IP头部校验码
0xb767状态为未验证,部分Linux内核配置会严格校验IP校验码,需检查客户端IP校验码生成逻辑是否符合RFC 791标准。
- TCP校验码:报文显示TCP校验码
TCP选项格式验证
报文中TCP选项包含连续3个NOP后接EOL,虽然标准允许该格式,但部分内核或协议栈对冗余选项的兼容性有限。可尝试修改NetX配置,只保留MSS选项,去掉多余的NOP,测试是否能触发SYN-ACK。服务器网络配置确认
- 确认服务器网卡
enx00e121212121已正确绑定192.168.1.2地址,无多IP冲突或地址配置错误。 - 执行
arp -an查看服务器ARP缓存,确认存在192.168.1.13对应的客户端MAC条目,若缺失可手动添加静态ARP条目测试。
- 确认服务器网卡
NetX协议栈参数调整
- 客户端SYN包窗口大小为512,虽Linux一般不会因此拒绝,但可尝试调整NetX的默认TCP窗口大小至更大值(如1460)测试。
- 检查NetX协议栈是否正确处理了SYN包的序列号生成,确保无异常值导致内核丢弃报文。
内容的提问来源于stack exchange,提问作者Vivek Vijayan
相关产品推荐
相关产品推荐

