7

应用层消息通过网络以一系列数据包的形式发送,这些数据包在接收端组装并传递到应用层。
是否可以在Java这些单独的数据包级别进行网络编程?
还是在Java我们只能看到“应用程序”级别的数据包?即由所有这些网络数据包组装的“大数据包”?
我试图在谷歌上研究这个问题,但结果真的很混乱。
混淆是由于一些关于 UDP 的资源似乎表明该操作是在数据包上进行的,而其他人则说 Java 不能在原始套接字中工作,这意味着它可以在更高级别的抽象上工作。我不能找到我正在寻找的答案。如果是,这是哪个包?

4

3 回答 3

2

在 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 文档中读到它不能重塑流量,例如丢弃数据包等。为什么不能这样做?

您不能强制网络丢弃一个数据包,也不能欺骗内核丢弃一个数据包。如果您考虑什么是丢弃的数据包,答案是相当明显的。

于 2013-07-19T21:00:42.437 回答
0

如果其他一些设备将您的大 UDP 数据包分解成较小的数据包,您将看不到分包段。

读取 TCP 时,您会将字节作为流读取。您将不知道这些字节实际上是如何发送的。你可以读回 100 个字节,就你所知,它们可能已经发送了超过 10 个数据包。

没有 JNI 就无法在 java 中访问这些信息。当然,使用 JNI 你可以做任何事情:)

于 2013-07-19T20:54:48.747 回答
0

您似乎认为 UDP == raw。它没有。原始 == IP,甚至是以太网。UDP 是 IP 上的一层,TCP 也是如此。你不能在 Java 的原始套接字中工作,但你可以在 UDP 和 TCP 中工作。

于 2013-07-19T22:05:22.280 回答