【问题标题】:Sending TCP packets through a socket通过套接字发送 TCP 数据包
【发布时间】:2013-09-16 02:18:19
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你有没有得到这个工作?

标签: android sockets vpn packet packet-capture


【解决方案1】:

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

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

【讨论】:

  • 感谢您的快速回答。我只需要使用套接字,就可以保护流量。最好我想发送与我捕获的完全相同的数据包。只是为了让我正确理解你。我会检查我正在使用哪个协议来创建合适的套接字,然后可以将初始数据包中的所有字节发送到那里。另一端会收到一个基本上有两个 IP 和 TCP / UDP 标头的数据包这一事实不会有问题吗?
  • 接收方只会读取第一个IP(剥离它)并将其传递给TCP层,TCP层将读取第一个TCP标头(剥离它)并将其传递给应用程序。因此,没有人应该因为这种封装而感到困惑。
  • 好的,谢谢,我不确定我是否完全理解整个概念,但我会努力让它发挥作用。关于您的编辑,目前性能并不那么重要。我正在为我大学的一门课程做这件事,所以让它发挥作用就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2022-11-12
  • 2012-10-13
  • 2020-12-03
  • 2016-02-17
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多