应用层消息通过网络以一系列数据包的形式发送,这些数据包在接收端组装并传递到应用层。
是否可以在Java
这些单独的数据包级别进行网络编程?
还是在Java
我们只能看到“应用程序”级别的数据包?即由所有这些网络数据包组装的“大数据包”?
我试图在谷歌上研究这个问题,但结果真的很混乱。
混淆是由于一些关于 UDP 的资源似乎表明该操作是在数据包上进行的,而其他人则说 Java 不能在原始套接字中工作,这意味着它可以在更高级别的抽象上工作。我不能找到我正在寻找的答案。如果是,这是哪个包?
3 回答
在 Java 中是否可以在这些单独的数据包级别进行网络编程?
是的,但是您不太可能需要单独的数据包。
还是在 Java 中我们只能看到“应用程序”级别的数据包?
纯 Java 只能看到 TCP 流和与数据包一对一映射的 UDP 数据报,但您无法访问 UDP 标头。
即由所有这些网络数据包组装的“大数据包”?
您根本不会收到大包或小包。您读取数据并读取可用数据(最多为缓冲区的大小)
如果是,这是哪个包?
您可以使用 JPcap 查看单个数据包,但是,除非您需要每个数据包的准确时间戳或需要跟踪丢弃的数据包,否则这很少有用。
这通过 JNI 使用 winpcap (Windows) 或 libpcap (linux)。
在我见过的大多数情况下,这是很多工作却收效甚微。
从我的角度来看,提到 JNI 的答案意味着 Java 不支持它(因为您必须实际用另一种语言编写代码才能满足您的需要)
套接字、文件、GUI 组件最终都使用 JNI。根据这个定义,你不能做任何在 Java 中使用系统调用的事情,因为操作系统不是用 Java 编写的。
我不认为这是对您在 Java 中可以做什么的有用定义。
1)纯Java只能看到TCP流。那么UDP呢?
在没有 libPCap 的情况下,您无法使用 Java 中的任何协议访问数据包的标头。
我认为这一点意味着没有数据包访问
并非没有任何额外的库。
2)在我见过的大多数情况下,这需要做很多工作吗?为什么。
因为它的级别非常低,并且您通常不必担心的许多细节都会暴露给您。注意:您可能不会收到数据包,因为在尝试记录它们时它们可能会被丢弃,并且您将无法再次要求它们,因此您会错过它们。
它只是一个图书馆,对吗?
正确的。
它不起作用吗?
你为什么这么说?
我想看看我需要做的事情是否可以用 Java 完成,或者应该研究其他语言。
恕我直言,你不会发现用另一种语言更容易。
我在 jpcap 文档中读到它不能重塑流量,例如丢弃数据包等。为什么不能这样做?
您不能强制网络丢弃一个数据包,也不能欺骗内核丢弃一个数据包。如果您考虑什么是丢弃的数据包,答案是相当明显的。
如果其他一些设备将您的大 UDP 数据包分解成较小的数据包,您将看不到分包段。
读取 TCP 时,您会将字节作为流读取。您将不知道这些字节实际上是如何发送的。你可以读回 100 个字节,就你所知,它们可能已经发送了超过 10 个数据包。
没有 JNI 就无法在 java 中访问这些信息。当然,使用 JNI 你可以做任何事情:)
您似乎认为 UDP == raw。它没有。原始 == IP,甚至是以太网。UDP 是 IP 上的一层,TCP 也是如此。你不能在 Java 的原始套接字中工作,但你可以在 UDP 和 TCP 中工作。