gpt4 book ai didi

SSL 响应被分成两个回调

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:29 25 4
gpt4 key购买 nike

我正在开发客户端-服务器应用程序,并负责添加对在 websockets 上运行的支持。我在服务器端使用 Cowboy,并且一直在使用 Erlang websocket 客户端进行测试。

事情应该是这样的:

  1. 客户端打开套接字连接并开始http握手
  2. 服务器完成http握手
  3. 客户端向服务器发送消息,服务器发送回复
  4. 客户处理回复
  5. 重复 3 和 4

客户端模块实现

handle_info({Transport, Socket, Data}, StateName, State) ->
... do stuff with data ...

当数据出现时,由底层传输(gen_tcp 或 ssl)调用。

当我将客户端和服务器配置为使用 gen_tcp 时,一切正常。当我改为使用 ssl 时,websocket 握手完成,但在第 4 步中,我收到了对 handle_info 的回调,其中仅包含从服务器返回的数据的第一个字节.后续回调将包含响应的其余部分。

我真的对这种行为感到困惑,因为交换了 gen_tcp 的相同代码工作正常,而且我们还有两个使用 ssl(但不是 websockets 或 cowboy)构建的传输同样不表现出这种行为。

任何人都可以提出可能导致数据以这种方式拆分的原因吗?如果不需要,我宁愿不必为此编写处理程序。

更新:为了好玩,我修改了客户端,让它等待两个回调发生,并在尝试解析之前连接来自两个回调的数据。这解决了问题,但仍然让我感到困惑。

不过我确实注意到了一些事情:

  • 第一组两个回调总是只包含一个字节
  • 该字节始终为 130 (0x82)

不知道这是否相关。

最佳答案

TCP 中没有消息边界。您无权依赖您期望的行为。传输可以为您提供它喜欢的任何部分的数据,只要它以正确的顺序完整无缺地提供所有数据即可。 TCP 为您提供字节流,大多数 SSL 库也是如此(尽管在较低级别确实有 SSL 记录消息)。

关于SSL 响应被分成两个回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10986110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com