SSL响应分为两个回调

时间:2012-06-11 19:11:41

标签: ssl erlang websocket cowboy

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

事情应该是这样的:

  1. 客户端打开套接字连接并启动http handshake
  2. 服务器完成http握手
  3. 客户端向服务器发送消息,服务器发送回复
  4. 客户端处理回复
  5. 重复3& 4
  6. 客户端模块实现

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

    当数据出现时由底层传输(gen_tcp或s​​sl)调用。

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

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

    有人可以建议可能导致数据以这种方式分割的原因吗?如果我不需要,我宁愿不必为此写处理。

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

    我确实注意到了几件事:

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

    不知道这是否相关。

1 个答案:

答案 0 :(得分:5)

TCP中没有消息边界。您无权依赖您期望的行为。传输可以为您提供所需的任何数据,只要它以正确的顺序提供所有数据,完整无缺。 TCP为您提供了一个字节流,并且大多数SSL库同上(尽管在较低级别上确实存在SSL记录消息)。