【问题标题】:Java TCP split packetsJava TCP 拆分数据包
【发布时间】:2023-03-15 00:53:01
【问题描述】:

我正在使用弹簧集成 TCP 连接。从 Serializer 实现中,我将一些字节直接写入给定的 OutputStream。

第一个字节似乎是自己发送的(在它自己的 TCP 数据包中,顺便说一下,wireshark 报告格式错误),然后在下一个数据包中发送剩余字节。

更改要在一次调用中写入的前两个字节(两字节长数组)会导致这两个字节在单独的数据包中发送(非格式错误)并在下一个数据包中发送。这个结果是可重现的。

这是我可以(或应该)影响的事情吗?它在读取端引起了问题,因为该设备显然希望整个消息包含在单个 TCP 数据包中。

【问题讨论】:

    标签: java tcp spring-integration


    【解决方案1】:

    这是我可以(或应该)影响的事情吗?它在读取端引起了问题,因为该设备显然希望整个消息包含在单个 TCP 数据包中。

    那么这个应用程序的作者对 TCP 毫无概念。 TCP 是基于流的协议,而不是基于数据包的协议。这意味着一次写入可能会导致线路上出现多个数据包,或者多次写入可能会导致单个数据包。

    ...顺便说一下,wireshark 报告的格式错误...

    如果您在发送方系统上捕获数据包,您可能会看到将校验和计算卸载到网卡的效果。在这种情况下,wireshark 会报告校验和错误。如果您在中间或接收端捕获数据包,您应该会看到正确的校验和,因为发送方机器上的网卡在转发数据包之前计算了校验和。

    【讨论】:

    • 当然。然而,OP 可以通过插入 BufferedOutputStream 并在他去读取响应之前刷新,在一定程度上缓解他的问题。
    • 虽然你是对的,但它对 OP 没有帮助,不是吗?只要他不能修复接收方,这个答案就不会让他更接近解决方案(除了他现在知道校验和错误可能来自哪里)。
    • @DarkDust 除了我提到的可能的缓解措施之外,没有可以帮助 OP。如果您有不同的想法,请发布您的答案。
    • @EJP:我认为您的评论就是答案(或类似的解决方案;重点是让 one 对套接字进行写入调用,但这是在 Java 中完成的)。所以恕我直言,一种帮助 OP 的方法,但我缺乏 Java 技能来发布答案。但我认为 Steffen 的回答本身并没有帮助 OP 解决他的问题,尽管他的解释很有用。
    • @DarkDust 这是一个可能的答案。它不能保证工作。我没有说别的。 Steffen 的回答是完全正确的。这是一个字节流;接收方不能对打包做出任何假设;并且发件人无法真正控制它。
    猜你喜欢
    • 2011-07-14
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多