websocket 通信的延迟调试
Latency debug for websocket communication
我正在处理 websocket 的调试延迟问题。
我正在尝试通过其 websocket 接口从 crypto-currency 交易所接收一些价格信息。我们收到的数据包包括交换服务器上生成的时间戳。我记录我们在计算机(“客户端框”)上收到报价信息的时间,并比较到达时间和服务器生成时间之间的延迟。大多数滴答声显示几十毫秒,这或多或少是好的。但是每天我们都会看到几次延迟变成几秒甚至十几秒,我想弄清楚这些大延迟是从哪里来的。
系统使用Python编程语言,我使用的websocket模块是websocket-client
(https://pypi.org/project/websocket_client/, https://github.com/websocket-client/websocket-client),我尝试在模块中添加日志,看看是否可以是由于模块处理时间,但仍然没有运气。
我目前想到的一个想法是使用tcpdump
来捕获网络流量并记录tcp数据包到达我的网卡的时间。如果这时候还出现延迟,我就只能把程序移到co-located服务器上了。但是,我在这里遇到了困难,因为 websocket 连接是 SSL-encrypted。因此我看不到消息中包含的报价生成时间。
这里有人有解决办法吗?特别是:
- 有什么方法可以从 client-end
websocket-client
python 包中检索 SSL 的私钥吗? (我假设密钥应该在本地某处可用,否则 websocket-client
无法自行解密数据。并且 WireShark 应该能够解密 TSL1.2 协议的消息)
- 如果使用
websocket-client
包不容易做到这一点,我很乐意尝试由 python、C/C++ 编写的其他 websocket 库。
- 能否
tcpdump
获取服务器发送TCP数据包时的时间戳(即使是服务器时间)?
我们也非常感谢任何其他建议。
非常感谢!
谢谢@Eugène Adell
我在 WireShark 中打开的 tcpdump 主要如下所示
我可以在 TCP Option - Timestamps
中看到 TSval
这些能说明什么吗?
抱歉可能是基本问题,在这方面真的缺乏经验&再次感谢。
编辑
Can tcpdump get the timestamp when the TCP data packet sent from
server (even in server time)?
打开您的捕获并查看数据包是否具有 TCP 时间戳选项(如 RFC 1323 but better explained in RFC 7323 中所定义)。如果是这样,第一个 SYN 数据包应该已经提到了它。
不幸的是,这些数据包中给出的 TSval(以毫秒为单位的时间戳值)的含义不是真实时钟,并不总是像真实时钟那样变化(这取决于您的计算机使用的实现)。例如,如果与您的服务器的对话持续 60 秒,请检查此 TSval 是否也从 60 秒开始移动,如果是这样,您可以使用此字段来跟踪数据包的发送时间。
我正在处理 websocket 的调试延迟问题。
我正在尝试通过其 websocket 接口从 crypto-currency 交易所接收一些价格信息。我们收到的数据包包括交换服务器上生成的时间戳。我记录我们在计算机(“客户端框”)上收到报价信息的时间,并比较到达时间和服务器生成时间之间的延迟。大多数滴答声显示几十毫秒,这或多或少是好的。但是每天我们都会看到几次延迟变成几秒甚至十几秒,我想弄清楚这些大延迟是从哪里来的。
系统使用Python编程语言,我使用的websocket模块是websocket-client
(https://pypi.org/project/websocket_client/, https://github.com/websocket-client/websocket-client),我尝试在模块中添加日志,看看是否可以是由于模块处理时间,但仍然没有运气。
我目前想到的一个想法是使用tcpdump
来捕获网络流量并记录tcp数据包到达我的网卡的时间。如果这时候还出现延迟,我就只能把程序移到co-located服务器上了。但是,我在这里遇到了困难,因为 websocket 连接是 SSL-encrypted。因此我看不到消息中包含的报价生成时间。
这里有人有解决办法吗?特别是:
- 有什么方法可以从 client-end
websocket-client
python 包中检索 SSL 的私钥吗? (我假设密钥应该在本地某处可用,否则websocket-client
无法自行解密数据。并且 WireShark 应该能够解密 TSL1.2 协议的消息)- 如果使用
websocket-client
包不容易做到这一点,我很乐意尝试由 python、C/C++ 编写的其他 websocket 库。
- 如果使用
- 能否
tcpdump
获取服务器发送TCP数据包时的时间戳(即使是服务器时间)?
我们也非常感谢任何其他建议。
非常感谢!
谢谢@Eugène Adell
我在 WireShark 中打开的 tcpdump 主要如下所示
TCP Option - Timestamps
中看到 TSval
编辑
Can tcpdump get the timestamp when the TCP data packet sent from server (even in server time)?
打开您的捕获并查看数据包是否具有 TCP 时间戳选项(如 RFC 1323 but better explained in RFC 7323 中所定义)。如果是这样,第一个 SYN 数据包应该已经提到了它。
不幸的是,这些数据包中给出的 TSval(以毫秒为单位的时间戳值)的含义不是真实时钟,并不总是像真实时钟那样变化(这取决于您的计算机使用的实现)。例如,如果与您的服务器的对话持续 60 秒,请检查此 TSval 是否也从 60 秒开始移动,如果是这样,您可以使用此字段来跟踪数据包的发送时间。