外面有没有人通过UDPSocket
(对于UDP数据报)和InputStream
(对于TCP流)实现坐在数据包捕获接口(如jpcap)上的工作?
我想给定jpcap中的回调API并不难,但是外面有没有人做过呢?这样做是否有任何问题(例如,我是否必须自己弄清楚如何重新组装TCP流?)
最佳答案
我还没有做这件事,但是我在解析C / C ++中捕获的数据包方面做了很多工作。我不知道是否存在任何此类的Java库。
本质上,您需要从IP开始逐步处理协议栈。 pcap数据以链接级头开始,但是除了忽略非IP数据包之外,我认为您所关心的没有很多。
IP最棘手的事情是重组分段的数据报。这是通过使用Flags字段和Fragment Offset字段中的More Fragments位,再加上Identification字段来区分不同数据报中的片段,然后使用Protocol字段来标识TCP和UDP数据包,以及Header Length字段来查找相应标题的开始。
对于TCP和UDP,下一步是多路分解,以分离捕获的数据包流中的各种连接。两种协议都通过源IP地址和目标IP地址以及源端口和目标端口的4元组来标识连接(嗯,UDP本身没有连接,但是我没有更好的用词),因此连接可以是与所有这四个值匹配的数据包序列。
一旦完成,对于UDP,除非您要检查校验和,否则就差不多完成了。 UDP标头中的“长度”字段告诉您数据包的长度;减去8个字节的标头即可获得您的数据。
TCP稍微复杂些,因为您确实必须重新组装流,这是使用标头中的序列号以及长度来完成的。这两个的总和告诉您流中的下一个序列号。请记住,您要在两个方向上跟踪流量。
(这比编写实际的TCP实现要容易得多,因为这时您必须实现Nagle算法和其他细节。)
网上有很多有关标头格式的信息。谷歌“ IP标头”的初学者。像Wireshark这样的网络分析仪对于这项工作是必不可少的,因为它将向您展示捕获的数据的外观。确实,由于Wireshark是开源的,因此您可能可以通过查看它的工作方式来了解很多