Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 即使接收到数据包ack,TCP也会重新传输_Sockets_Tcp_Rabbitmq_Mqtt_Lwip - Fatal编程技术网

Sockets 即使接收到数据包ack,TCP也会重新传输

Sockets 即使接收到数据包ack,TCP也会重新传输,sockets,tcp,rabbitmq,mqtt,lwip,Sockets,Tcp,Rabbitmq,Mqtt,Lwip,我面临RabbitMQ服务器的一种奇怪行为(在ubuntu服务器14.04.3 LTS下) 客户机是一个基于LWIPV1.3.2的MQTT实现,位于一个微型MCU(Cortex-M3)上。当我的客户端使用其IPv4地址连接服务器时,它会工作,并且客户端服务器TCP套接字具有正确的[PSH+ACK]、[ACK]序列 但是,当客户端通过我的路由器(NAT在端口1883上处于活动状态)连接时,我得到以下序列(在服务器端) 服务器tcpdump端口1883: 7 2015-10-01 12:24

我面临RabbitMQ服务器的一种奇怪行为(在ubuntu服务器14.04.3 LTS下)

客户机是一个基于LWIPV1.3.2的MQTT实现,位于一个微型MCU(Cortex-M3)上。当我的客户端使用其IPv4地址连接服务器时,它会工作,并且客户端服务器TCP套接字具有正确的[PSH+ACK]、[ACK]序列

但是,当客户端通过我的路由器(NAT在端口1883上处于活动状态)连接时,我得到以下序列(在服务器端)

服务器tcpdump端口1883:

7     2015-10-01 12:24:30.962080    192.168.1.1    192.168.1.97    TCP    121   55061→1883 [PSH, ACK] Seq=1 Ack=1 Win=2920 Len=67
8     2015-10-01 12:24:30.962101    192.168.1.97    192.168.1.1    TCP    54    1883→55061 [ACK] Seq=1 Ack=68 Win=29200 Len=0
11    2015-10-01 12:24:30.968867    192.168.1.97    192.168.1.1    TCP    58    1883→55061 [PSH, ACK] Seq=1 Ack=68 Win=29200 Len=4
12    2015-10-01 12:24:30.971556    192.168.1.1    192.168.1.97    TCP    60    55061→1883 [ACK] Seq=68 Ack=5 Win=2916 Len=0
13    2015-10-01 12:24:30.989599    192.168.1.1    192.168.1.97    TCP    92    55061→1883 [PSH, ACK] Seq=68 Ack=5 Win=2916 Len=38
14    2015-10-01 12:24:31.171216    192.168.1.97    192.168.1.1    TCP    58    [TCP Retransmission] 1883→55061 [PSH, ACK] Seq=1 Ack=68 Win=29200 Len=4
15    2015-10-01 12:24:31.171411    192.168.1.1    192.168.1.97    TCP    60    [TCP Dup ACK 12#1] 55061→1883 [ACK] Seq=106 Ack=5 Win=2916 Len=0
请注意,它只发生在基于lwip的客户端上;我已经使用node.js下的mqtt模块成功地进行了测试

有人知道发送的数据包的格式有什么问题吗


谢谢你,丹。

你可能看到了缓冲膨胀效应。也就是说,重传在第一个ACK到达之前排队等待发送,但实际上是在第一个ACK到达之后进行的。与直觉相反,较小的传输缓冲队列可能有助于提高性能。这听起来很有趣,因为客户端(lwip)在获取/解释消息方面有很大的延迟。但是,如果我错了,请纠正我,因为tcpdump是在服务器端实现的,转储文件中存在的数据包是接口上以相同顺序接收的数据包的映像。在发送第一个分组(11)后200ms发生分组重传(14)。即使在前2.7毫秒内收到ACK(12)。在您看来,忽略传入数据包的条件是什么?我想知道,当连接方案如上所述时,IP协议是否有一种特殊情况:客户端(子网)->路由器->调制解调器(NAT路由,感谢dyndns)->服务器。您可能看到了缓冲区膨胀效应。也就是说,重传在第一个ACK到达之前排队等待发送,但实际上是在第一个ACK到达之后进行的。与直觉相反,较小的传输缓冲队列可能有助于提高性能。这听起来很有趣,因为客户端(lwip)在获取/解释消息方面有很大的延迟。但是,如果我错了,请纠正我,因为tcpdump是在服务器端实现的,转储文件中存在的数据包是接口上以相同顺序接收的数据包的映像。在发送第一个分组(11)后200ms发生分组重传(14)。即使在前2.7毫秒内收到ACK(12)。在您看来,忽略传入数据包的条件是什么?我想知道,当连接方案如上所述时,IP协议是否有一种特殊情况:客户端(子网)->路由器->调制解调器(NAT路由,感谢dyndns)->服务器