TCP重传
TCP Retransmition
我正在尝试在两个 stm32 设备之间建立 TCP 连接。首先,我们在 wireshark.When 上看到的线路之间一切都很完美,TCP 客户端重置并尝试发送新数据,wireshark 向我显示重传 TCP 消息但是当我调试服务器端时,服务器端获取消息并发送回显消息客户端收到此回显消息后。
虽然我收到并向另一方发送消息,但为什么显示重传消息?
完整客户端代码:https://paste.ubuntu.com/p/VJHzgv29FM/
完整服务器代码:https://paste.ubuntu.com/p/Wm9gvkSfF7/
/**
* @brief Initializes the tcp echo server
* @param None
* @retval None
*/
void tcp_echoserver_init(void)
{
/* create new tcp pcb */
tcp_echoserver_pcb = tcp_new();
if (tcp_echoserver_pcb != NULL)
{
err_t err;
/* bind echo_pcb to port 7 (ECHO protocol) */
err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7);
if (err == ERR_OK)
{
/* start tcp listening for echo_pcb */
tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);
/* initialize LwIP tcp_accept callback function */
tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);
}
else
{
/* deallocate the pcb */
memp_free(MEMP_TCP_PCB, tcp_echoserver_pcb);
}
}
}
客户:
/**
* @brief Connects to the TCP echo server
* @param None
* @retval None
*/
void tcp_echoclient_connect(void)
{
ip_addr_t DestIPaddr;
/* create new tcp pcb */
echoclient_pcb = tcp_new();
if (echoclient_pcb != NULL)
{
IP4_ADDR(&DestIPaddr, (uint8_t)192, (uint8_t)168, (uint8_t)1, (uint8_t)40);
/* connect to destination address/port */
tcp_connect(echoclient_pcb,&DestIPaddr,7,tcp_echoclient_connected);
}
else
{
SerialPrint("not null");
memp_free(MEMP_TCP_PCB, echoclient_pcb);
}
}
在使用wireshark分析网络流时,这里有一个doc from wireshark可以帮助你理解这些词的意思。
我们可以看到下面的东西:
TCP 重传
满足以下所有条件时设置:
这不是保活数据包。
在正向,段长度大于零或设置了SYN或FIN标志。
下一个预期序列号大于当前序列号。
对于您的情况,问题是段长度大于零或设置了 SYN 或 FIN 标志。这是你的reset导致的,所以这并不代表你的TCP连接导致重传。
我正在尝试在两个 stm32 设备之间建立 TCP 连接。首先,我们在 wireshark.When 上看到的线路之间一切都很完美,TCP 客户端重置并尝试发送新数据,wireshark 向我显示重传 TCP 消息但是当我调试服务器端时,服务器端获取消息并发送回显消息客户端收到此回显消息后。
虽然我收到并向另一方发送消息,但为什么显示重传消息?
完整客户端代码:https://paste.ubuntu.com/p/VJHzgv29FM/
完整服务器代码:https://paste.ubuntu.com/p/Wm9gvkSfF7/
/**
* @brief Initializes the tcp echo server
* @param None
* @retval None
*/
void tcp_echoserver_init(void)
{
/* create new tcp pcb */
tcp_echoserver_pcb = tcp_new();
if (tcp_echoserver_pcb != NULL)
{
err_t err;
/* bind echo_pcb to port 7 (ECHO protocol) */
err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7);
if (err == ERR_OK)
{
/* start tcp listening for echo_pcb */
tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);
/* initialize LwIP tcp_accept callback function */
tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);
}
else
{
/* deallocate the pcb */
memp_free(MEMP_TCP_PCB, tcp_echoserver_pcb);
}
}
}
客户:
/**
* @brief Connects to the TCP echo server
* @param None
* @retval None
*/
void tcp_echoclient_connect(void)
{
ip_addr_t DestIPaddr;
/* create new tcp pcb */
echoclient_pcb = tcp_new();
if (echoclient_pcb != NULL)
{
IP4_ADDR(&DestIPaddr, (uint8_t)192, (uint8_t)168, (uint8_t)1, (uint8_t)40);
/* connect to destination address/port */
tcp_connect(echoclient_pcb,&DestIPaddr,7,tcp_echoclient_connected);
}
else
{
SerialPrint("not null");
memp_free(MEMP_TCP_PCB, echoclient_pcb);
}
}
在使用wireshark分析网络流时,这里有一个doc from wireshark可以帮助你理解这些词的意思。
我们可以看到下面的东西:
TCP 重传
满足以下所有条件时设置:
这不是保活数据包。
在正向,段长度大于零或设置了SYN或FIN标志。
下一个预期序列号大于当前序列号。
对于您的情况,问题是段长度大于零或设置了 SYN 或 FIN 标志。这是你的reset导致的,所以这并不代表你的TCP连接导致重传。