为什么 python 套接字和同一 IP:port 目的地的 tcp ping 之间存在差异?

Why is there a discrepancy between python sockets and tcp ping for the same IP:port destination?

我的设置:

  1. 我正在使用 portmap.io 提供的 IP 和端口来执行端口转发。
  2. 我已经安装了OpenVPN(根据portmap.io的要求),当我想运行我的项目时,我运行一个现成的配置文件。
  3. 我的主要工作是使用 Python.
  4. 中的套接字在客户端和服务器之间发送消息
  5. 我已经安装了一个名为 tcping 的软件,它基本上允许我通过 tcp 连接 ping IP:port。

这个数字基本上可以概括:

我得到的结果:

  1. 当我尝试“ping”所述 IP 时,平均 RTT 最终始终保持在 30 毫秒左右。
  2. 我尝试使用相同的 IP 对 Python 中的套接字进行编程,我的机器上有一个服务器脚本 运行ning,在任何其他机器上都有一个客户端脚本,但绑定到这个知识产权。我尝试通过套接字发送一条像“Hello”这样的小消息,我发现这条消息的传输时间要长得多,而且在这方面是不一致的。有时最终需要 1 秒,有时需要 400 毫秒...

造成这种差异的原因是什么?

What is the reason for this discrepancy?

tcpping 只是测量建立 TCP 连接所需的时间。连接建立通常完全在 OS 内核中完成,因此甚至不涉及到用户 space 的切换。

即使是应用程序中的一些小数据交换也非常昂贵。首先,必须完成初始 TCP 握手。通常只有在 TCP 握手完成后,客户端才开始发送有效载荷,然后需要将其传递到另一端,放入套接字读取缓冲区,将用户 space 应用程序安排到 运行,读取来自应用程序和进程中缓冲区的数据,创建响应并将其传递给对等 OS 内核,让内核将响应传递给本地系统以及这里的很多东西,直到本地应用程序最终获得响应并结束这需要多长时间的时间。

鉴于最后一个时间与纯 RTT 相差太多,我会假设服务器系统性能低或负载高,或者应用程序编写不当。