使用wireshark获取数据包的Java套接字

Posted

技术标签:

【中文标题】使用wireshark获取数据包的Java套接字【英文标题】:Java socket using wireshark fetch packets 【发布时间】:2013-11-05 09:25:18 【问题描述】:

我的客户端代码是这样的:

   socket = new Socket("10.105.1.20", 5678);
   DataOutputStrean dos = new DataOutputStream(socket.getOutputStream());
   short len = 4;
   dos.writeByte(len);
   dos.writeByte(len >> 8);
   dos.writeShort(0x0410);
   dos.flush();

应该是4字节发送到服务器。但是当我使用wireshark获取数据包时,数据是3字节

   00 04 10

我觉得应该是

   04 00 04 10

第一个字节 04 在哪里?我的代码中是否有问题或与wireshark.THX有关,请您帮忙!

【问题讨论】:

【参考方案1】:

没有什么可以保证所有四个写入都将在同一个数据包中发送。可能第一个字节是自己发送的,然后接下来的三个由 Nagle 算法合并。当您希望发送写入时,您可以使用 BufferedOutputStream 并刷新它,但仍然不能保证。 TCP 可以按照自己喜欢的方式对数据进行分段。

【讨论】:

是的,我在 prev 数据包中找到了第一个字节。在我的客户端和服务器中发送的每条消息都将分为 2 段(1 字节 + 下一个字节)【参考方案2】:

短原始数据类型在 Java 中是 16 位。

这个SO answer 展示了如何将一个short 转换为一个byte[],这可能是您正在寻找的。​​p>

此外,此SO question 包含有关字节顺序的更多信息。

【讨论】:

不解释观察结果。

以上是关于使用wireshark获取数据包的Java套接字的主要内容,如果未能解决你的问题,请参考以下文章

Java 套接字:TCP 校验和不正确

如何让Wireshark可以捕获无线网卡的数据包

Wireshark网络分析实战笔记基本信息统计工具的使用方法

原始 UDP 套接字卡在 recvfrom 上

java怎么解析Wireshark抓包文件

mac osx10.9环境下使用wireshark代理抓iphone包的问题