网络套接字通信的延迟调试

问题描述

我正在研究websocket的调试延迟问题。

我正在尝试通过其websocket界面从加密货币交易所接收一些价格信息。我们收到的数据包包括在交换服务器上生成的时间戳。我记录了在计算机(“客户端”)上收到报价信息的时间,并比较了到达时间和服务器生成时间之间的延迟。大多数刻度线显示几十毫秒,多少有些微不足道。但是每天我们都会看到几次延迟变成几秒钟甚至超过十秒,我想弄清楚这些大延迟来自何处。

系统正在使用Python编程语言,而我正在使用的websocket模块是websocket-clienthttps://pypi.org/project/websocket_client/https://github.com/websocket-client/websocket-client),我试图在模块内部添加日志,看看是否是因为模块处理时间长,但还是没有运气。

我目前想到的一个想法是使用tcpdump捕获网络流量并记录tcp数据包到达我的网卡的时间。如果这段时间仍然显示延迟,那么我只能将程序移至同一位置的服务器。但是,由于websocket连接是经过SSL加密的,因此我在这里遇到了困难。因此,我看不到消息内部的滴答生成时间。

有人在这里解决方案吗?特别是:

  • 是否有任何方法可以从客户端的websocket-client python包中检索SSL的私钥? (我认为密钥应该在本地某个地方可用,否则websocket-client本身无法解密数据。WireShark应该能够为TSL1.2协议解密消息)
    • 如果使用websocket-client软件包不那么容易,我很乐意尝试其他由python,C / C ++编写的websocket库。
  • tcpdump是否可以从服务器发送TCP数据包时获得时间戳(甚至在服务器时间内)?

任何其他建议也将受到高度赞赏。

非常感谢!


感谢@EugèneAdell 我在WireShark中打开的tcpdump大致如下

enter image description here

我可以在TCP Option - Timestamps中看到TSval

enter image description here

这些可以说明什么吗? 很抱歉,可能是一些基本问题,确实缺乏该领域的经验,再次感谢。

解决方法

编辑

tcpdump可以从何时发送TCP数据包时获取时间戳记 服务器(甚至服务器时间)?

打开捕获窗口,查看数据包是否具有TCP时间戳选项(如RFC 1323中所定义,但在RFC 7323中有更详细的说明)。如果是这样,那么第一个 SYN 数据包应该已经提到它。

不幸的是,这些数据包中给出的 TSval (时间戳值(以毫秒为单位))的含义不是真实时钟,并且并非总是像真实时钟那样变化(取决于计算机所使用的实现方式) )。例如,如果与服务器的对话持续60秒,请检查此TSval是否也从60秒移开,如果可以,则可以使用此字段来跟踪数据包的发送时间。