首页 文章

SSL响应分为两个回调

提问于
浏览
3

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

事情应该是这样的:

  • 客户端打开套接字连接并启动http握手

  • 服务器完成http握手

  • 客户端向服务器发送消息,服务器发送回复

  • 客户端处理回复

  • 重复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)构建的传输,同样不会出现这种行为 .

任何人都可以建议可能导致数据以这种方式分裂的原因吗?如果我不需要,我宁愿不要为此写处理 .

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

我注意到了一些事情:

  • 第一组两个回调始终只包含一个字节

  • 该字节始终为130(0x82)

不知道这是否相关 .

1 回答

  • 5

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

相关问题