通过套接字发送TCP数据包

时间:2013-09-11 21:33:28

标签: android sockets vpn packet packet-capture

我正在使用VpnService捕获数据包,捕获它们之后我想将它们发送到目的地。现在,捕获方面有效。我从数据包中获得了协议,源IP /目标IP和源端口/目标端口。

我正在考虑使用这些参数创建套接字。 VpnService实际上有一个方法protect()来保护套接字,并且流量不会通过VPN转发。

我没有套接字的muche经验。但是前几天我在这里读了一条评论说我只通过套接字而不是IP或TCP头发送实际数据?但由于TCP使用3次握手(如果我错了,请纠正我),第一个数据包不会有任何数据,只有SYN - 标志。

这是否意味着此方法不起作用或者我可以通过套接字发送带有标头的数据包吗?

1 个答案:

答案 0 :(得分:0)

是的,我们可以通过套接字发送数据,而不必担心传输层或IP层标头。根据套接字类型(SOCK_STREAM或SOCK_DGRAM),底层(以及行为堆栈)在应用程序数据之上添加TCP或UDP标头。最后,在发送之前,IP层将添加IP头。但是,如果您的设计需要,您可以始终"封装"将您的整个数据包与IP / TCP / Data作为数据并发送到另一端。当另一端接收到数据包时,应用层将接收实际上是原始IP / TCP /数据的数据。

修改 您应该再探讨两个问题:a)我们如何维护数据包边界和(b)MTU大小。第一个需要考虑因为TCP不打扰数据包边界,所以有可能当你在接收器上读取数据时,它不会从头开始 - 一个快速的解决方案是检查你是否正在击中标题然后读取数据包的长度并继续读取,直到您读取了那么多数据。第二个是如果您的数据包已经是MTU的大小,那么添加2个额外的标头会使其超出MTU,因此可能会碎片化。如果你担心表现,那么这可能不是一件好事。