基于uIP 1.0的HTTP服务器TCP数据包后续无法收到ACK的问题
问题:uIP 1.0 HTTP服务器发送大数据包后客户端停止ACK
在受限网络设备上基于uIP 1.0 TCP/IP栈开发HTTP服务器,该库不缓存数据,仅通过用户回调提供单个待发送数据包,或重传之前的数据;必须等前一个数据包收到远端ACK后,才能发送下一个数据包。
服务器逻辑是先发送45字节的响应头,之后将文件拆分为846字节的块发送。现在遇到的问题是:远端(macOS/Linux系统,用Firefox或wget)从第三个数据包开始就停止发送ACK。设备因未收到ACK不断重传该数据包,最终重置连接,且每次复现的情况完全一致。如果把数据块改小(比如256字节),客户端能在停止ACK前收到约10个数据包的ACK,而不是原来的3个。
以下是在客户端(192.168.178.30)抓取的Wireshark会话dump:
1 0.000000 192.168.178.30 192.168.178.70 TCP 78 56391 → 80 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=3618183324 TSecr=0 SACK_PERM 2 1.001115 192.168.178.30 192.168.178.70 TCP 78 [TCP Retransmission] 56391 → 80 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=3618184325 TSecr=0 SACK_PERM 3 1.096615 192.168.178.70 192.168.178.30 TCP 1008 80 → 56391 [SYN, ACK] Seq=0 Ack=1 Win=846 Len=0 MSS=846 4 1.097032 192.168.178.30 192.168.178.70 TCP 54 56391 → 80 [ACK] Seq=1 Ack=1 Win=65535 Len=0 5 1.125337 192.168.178.30 192.168.178.70 TCP 192 56391 → 80 [PSH, ACK] Seq=1 Ack=1 Win=65535 Len=138 6 1.447170 192.168.178.70 192.168.178.30 TCP 1008 80 → 56391 [PSH, ACK] Seq=1 Ack=139 Win=846 Len=45 7 1.447485 192.168.178.30 192.168.178.70 TCP 54 56391 → 80 [ACK] Seq=139 Ack=46 Win=65535 Len=0 8 1.754454 192.168.178.70 192.168.178.30 TCP 1008 80 → 56391 [PSH, ACK] Seq=46 Ack=139 Win=846 Len=846 9 1.754807 192.168.178.30 192.168.178.70 TCP 54 56391 → 80 [ACK] Seq=139 Ack=892 Win=65535 Len=0 10 2.061660 192.168.178.70 192.168.178.30 TCP 1008 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 11 2.794855 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 12 3.597716 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 13 4.645639 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 14 6.567428 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 15 9.844375 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 16 15.988703 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 17 22.132761 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 18 28.277190 192.168.178.70 192.168.178.30 TCP 1008 [TCP Retransmission] 80 → 56391 [PSH, ACK] Seq=892 Ack=139 Win=846 Len=846 19 34.318832 192.168.178.70 192.168.178.30 TCP 1008 80 → 56391 [RST, ACK] Seq=892 Ack=139 Win=846 Len=0
内容的提问来源于stack exchange,提问作者ynoxinul
相关产品推荐
相关产品推荐

