0

我正在开发一个使用 VpnService 接收来自接口的所有数据包(IP 数据包)的 Android 应用程序。

收到数据包后,我会查看 IP 标头以检查协议源 IP、目标 IP。如果是 TCP,那么我查看 TCP 标头,获取端口号并尝试将数据包发送到目标 IP。

我的问题是,通过 Java 中的 Socket() 发送数据时,我是否必须去掉 IP 和 TCP 标头?还是我保持 TCP 标头完好无损?

有关更多信息,我计算了 IP 和 TCP 标头的偏移量,以便在标头完成后立即发送数据。谢谢!

4

1 回答 1

1

通过 java 中的 Socket() 发送数据时,是否必须去掉 IP 和 TCP 标头?还是我保持 TCP 标头完好无损?

您没有剥离的 TCP 标头。您只需发送和接收数据。

我尝试了普通套接字,但它没有连接......所以我尝试使用阻塞的 SocketChannel

Socket 和 SocketChannel 之间在这个目的上没有区别。如果您使用它们中的任何一个,您只关心数据有效负载,而不是 IP 或 TCP 标头。

另外,如果不介意为我回答另一个问题。当我得到有效载荷时,我尝试在十六进制值(0x47,0x45,0x54)中搜索“GET”以找到 HTTP 标头,但我从来没有找到。这是正确的吗?我检查了请求的 IP 地址及其对 google.com 的要求。但有一件事是端口是 443,这意味着加密连接,所以我想这可能就是我找不到 Http 标头的原因。

这是正确的。它已加密,因此您无法读取它。但是,如果您正在编写一个 HTTP 代理,就像您看起来那样,所有这些都应该以纯文本形式的 CONNECT 命令行开头,您可以从中获取目标。

于 2013-07-30T01:15:55.627 回答