【问题标题】:TCP RetransmitionTCP 重传
【发布时间】:2021-05-02 11:45:55
【问题描述】:

我正在尝试在两个 stm32 设备之间进行 TCP 连接。首先,我们在wireshark上看到的线之间一切都很完美。当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);
  }  

}

【问题讨论】:

  • 请出示您的代码
  • 我添加了源代码
  • 你能帮帮我吗?
  • 如何重置客户端?终止进程并再次运行?
  • 在图中,你重置了两次吗?

标签: tcp stm32 wireshark lwip


【解决方案1】:

在使用wireshark分析网络流时,这里有一个doc from wireshark可以帮助你理解这些词的意思。

我们可以看到以下内容:

TCP重传

当满足以下所有条件时设置:

  • 这不是一个保活数据包。

  • 在正向,段长度大于零或设置了SYN或FIN标志。

  • 下一个预期的序号大于当前序号。

对于您的情况,问题在于段长度大于零或设置了 SYN 或 FIN 标志。这是由您的重置引起的,因此这并不意味着您的 TCP 连接会导致重传。

【讨论】:

  • 这是一个很好的观点。我用这种方式进行测试,在成功通信后我刷新了wireshark窗口而不是重置我的设备而不是我看不到重新传输消息。每次刷新都显示我成功传输消息。它非常有趣
  • 我认为这可能是wireshark本身的问题:它无法判断你是重用端口还是重传消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2020-03-19
相关资源
最近更新 更多