【问题标题】:C - TCP Checksum (using raw sockets) -- how to source IP addressC - TCP 校验和(使用原始套接字)——如何获取 IP 地址
【发布时间】:2011-06-29 17:35:01
【问题描述】:

当使用raw sockets发送TCP数据时,允许将source ip address留零,以便内核输入正确的值。这很有帮助,尤其是在使用多个接口(具有不同的IP 地址)时。

我现在的问题是:要计算到TCP 校验和,我需要知道源 IP 地址到底是什么。这对我来说似乎是不可能的?

有没有办法确定我的传出数据包的来源IP

(另一种方法是专门将我的原始套接字绑定到一个地址,但我不想这样做)。

/edit: 使用 Linux

【问题讨论】:

  • 您使用的是什么操作系统?原始套接字设施可能因操作系统而异,因此这很重要。
  • 为什么需要计算校验和?
  • 为什么不使用 SOCK_STREAM 套接字,这样您就不必担心自己实现所有 TCP?我很好奇您从原始套接字中获得了什么好处,这使得所有这些额外的工作变得有价值。
  • 这是一个研究项目,它强制执行tcp 以及使用raw sockets 和正确的校验和。

标签: c sockets tcp checksum


【解决方案1】:

如果你不绑定你的socket,内核必须根据目的地址找到源地址。

基本上完成了路由查找并确定了目标接口。之后,从该接口获取 IP:数据包的来源。

所以你的问题变成了执行路线查找,就像ip route get 所做的那样。

编辑

@nos 提到使用不同的套接字 (UDP) 并将其连接到该目标地址。使用 getsockname 获取它的本地绑定名称应该会为您提供将用于该目标的源地址。

【讨论】:

  • 您可以创建一个 UDP 套接字,将其连接()到同一个远程 IP(也可能使用 INADDR_ANY 绑定()它)并在其上调用 getsockname() 以了解源地址。除非您应用了一些非常奇怪的 netfilter 规则,否则它不太可能与您自己的原始套接字数据包的路由不同。
  • netfilter 规则并没有那么奇怪(fwmark),例如,我有一些用于通过不同的路由发送邮件。
  • 尽管UDP socket 的方法是相当的黑客,我可能会尝试这个,因为它似乎提供了解决问题的方法。 - 但实际上我希望有一个更好的选择;)
  • @david 绑定socket ;)
  • @david 这是最好的选择。并且,RAW 套接字是一种黑客攻击,不是吗? ;)
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 2020-08-02
  • 2012-10-08
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多