在Java中是否可以在这些单独的数据包级别上进行网络编程?
是的,但是您不太可能想要单独的数据包。
或者在Java中我们只能看到“应用程序”级别的数据包?
纯Java只能看到TCP流和UDP数据报,它们与数据包具有一对一的映射,但您无法访问UDP标头。
IE。由所有这些网络数据包组装而成的“大数据包”?
你不会收到大大小小的数据包。您读取数据并读取可用数据(最多可达缓冲区的大小)
如果是,哪个包执行此操作?
您可以使用 JPcap 查看各个数据包,但是,除非您需要每个数据包的准确时间戳或需要跟踪丢弃的数据包,否则这很少有用。
这通过 JNI 使用 winpcap (Windows) 或 libpcap (linux)。
在我见过的大多数情况下,这种方法的使用都是大量的工作却收效甚微。
从我的角度来看,提到 JNI 的答案意味着 Java 不支持它(因为你必须实际用另一种语言编写你需要的代码)
套接字、文件、GUI 组件最终都使用 JNI。根据这个定义,您不能执行任何使用 Java 中的系统调用的操作,因为操作系统不是用 Java 编写的。
我认为这对于 Java 中的功能来说不是一个有用的定义。
1)纯Java只能看到TCP流。那么UDP呢?
如果没有 libPCap,您将无法使用 Java 中的任何协议访问数据包的标头。
我认为这一点意味着没有数据包访问
并非没有任何额外的库。
2)在我见过的大多数情况下,这需要做很多工作吗?为什么。
因为它的级别非常低,而且很多你通常不必担心的细节都会暴露给你。注意:您可能不会收到数据包,因为在尝试记录它们时它们可能会被丢弃,并且您将无法再次请求它们,因此您会错过它们。
这只是一个图书馆吧?
Correct.
不起作用吗?
为什么这么说?
我想看看我需要做的事情是否可以用 Java 完成,或者应该考虑其他语言。
恕我直言,你不会发现用另一种语言更容易。
我在 jpcap 文档中读到它不能重塑流量,例如丢弃数据包等。为什么它不能这样做?
你不能强迫网络丢弃数据包,也不能欺骗内核丢弃数据包。如果您考虑一下什么是丢包,答案就相当明显了。