我正在使用一个Android应用程序,该应用程序使用VpnService接收来自接口的所有数据包(IP数据包)。
收到数据包后,我会查看IP标头,检查协议源IP,目标IP。如果是TCP,那么我查看TCP头,获取端口号并尝试将数据包发送到目标IP。
我的问题是,在通过Java中的Socket()发送数据时,是否必须删除IP和TCP头?或者我是否保留TCP标头?
有关详细信息,我会计算IP和TCP标头的偏移量,以便在标头完成后立即发送数据。谢谢!
答案 0 :(得分:1)
在通过Java中的Socket()发送数据时,是否必须删除IP和TCP头?或者我是否保留TCP标头?
您没有 要剥离的TCP标头。您只需发送和接收数据。
我试过普通套接字,但它没有连接......所以我尝试使用阻塞SocketChannel
Socket和SocketChannel之间没有区别。如果您使用其中任何一个,则只关注数据有效负载,而不是IP或TCP标头。
另外如果不介意为我回答另一个问题。当我得到有效载荷时,我尝试以十六进制值(0x47,0x45,0x54)搜索“GET”以找到HTTP标头,但我从未找到过。这是正确的吗?我查看了所要求的IP地址以及要求google.com。但有一点是端口是443,这意味着加密连接,所以我认为这可能是我无法找到Http头的原因。
这是对的。它是加密的,所以你无法阅读它。但是如果你正在编写一个HTTP代理,就像你所看到的那样,所有这一切都应该以纯文本的CONNECT命令行开头,你可以从中获取目标。