-1

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

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

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

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

4

1 回答 1

0

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

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

于 2013-09-11T21:46:04.863 回答