确定Java中多播数据包的剩余TTL

确定Java中多播数据包的剩余TTL,java,sockets,multicast,Java,Sockets,Multicast,如果我有一个监听多播数据的Java程序,我如何知道传入数据报的剩余TTL是什么 我知道如何在发送多播套接字上设置TTL,但我想知道到达的数据包的剩余TTL。我查看了(我想您也这样做了),但找不到一个好的Java API来执行此操作 TTL是IPv4数据报中的第9个整字节。如果从传入数据报输出DatagramPack的第9个字节,会发生什么情况?这看起来像TTL值吗?或者,IP数据报的报头在DatagramPacket中不可用,只是IPv4数据报的数据部分吗?到达的数据包是什么?一个数据报或UDP

如果我有一个监听多播数据的Java程序,我如何知道传入数据报的剩余TTL是什么

我知道如何在发送多播套接字上设置TTL,但我想知道到达的数据包的剩余TTL。

我查看了(我想您也这样做了),但找不到一个好的Java API来执行此操作


TTL是IPv4数据报中的第9个整字节。如果从传入数据报输出DatagramPack的第9个字节,会发生什么情况?这看起来像TTL值吗?或者,IP数据报的报头在DatagramPacket中不可用,只是IPv4数据报的数据部分吗?

到达的数据包是什么?一个数据报或UDP数据包实际上可以被分成几个IP数据包,如果它们的路由不同,则这些IP数据包以不同的TTL到达。无论是哪种情况(拆分还是不拆分),Java都不提供对IP报头的访问。

如果您使用原始套接字接收UDP数据报,您可以检查TTL(或IP或UDP报头中的任何其他内容)。不过,有很多陷阱:

  • 原始套接字不是Java本机的(尽管至少有一个多平台第三方插件可用:)
  • 在大多数操作系统上,您必须具有root访问权限或管理权限才能使用原始套接字
  • 如果您还想使用UDP数据,您必须自己进行校验和并重新组装碎片数据报……还可能在碎片之间遇到不同的TTL(正如jambjo所说)

经过进一步的调查,我认为这在纯Java中是不可能的。如果我愿意使用JNI,我认为可以使用rocksaw库: