【问题标题】:send ipv6 jumbograms in c (linux) : How to change packet headers在 c (linux) 中发送 ipv6 jumbograms:如何更改数据包标头
【发布时间】:2015-12-17 14:23:42
【问题描述】:

如果问题太幼稚,我很抱歉,但我很困惑。我想发送IPv6 jumbograms(以便能够多播大小> 64 KB 的数据包)。我已经能够成功地多播普通的 IPv6 UDP 数据包。 对于从 RFC 2675 发送 jumbograms,我知道我必须进行以下更改:

  1. 将有效负载长度设置为 0
  2. 将下一个标头设置为逐跳

但是,我不知道如何在c socket programming 中实现这些(调用哪个函数等)。我是否必须创建一个自定义标头,或者是否有像 sendto 这样的函数可用于发送 jumbograms?

【问题讨论】:

  • 您确实意识到您需要一个可以支持这么大的 MTU 的完整路径? IPv6 不能像 IPv4 那样沿路径分段。发送主机负责对 IPv6 数据包进行预分片,以满足路径中最小的 MTU。
  • 是的,我愿意。我最关心的是如何至少成功地组装和发送数据包。由于 MTU 限制而无法发送大数据包是另一回事。

标签: c linux sockets ipv6


【解决方案1】:

如果您要制作自己的标头,则可以使用原始套接字。有关详细信息,请键入 man -s7 rawlook here。请注意,您实际上需要以这种方式实现自己的 IP 堆栈。

但是,我的理解是 linux 本身就支持 IPv6 jumbograms,因此您无需费心。试试ifconfig lo mtu 100000 并在环回设备上做一些测试来检查。

我怀疑问题可能是您的网络适配器和路径上的所有内容(端到端)也需要支持 jumbograms。

【讨论】:

  • 谢谢!所以,如果我不想使用原始数据包并使用原生 linux 支持 IPv6 jumbograms,你是否建议尝试以相同的方式发送数据包(更大的大小)(通过使用 sendto 函数并且不对包头)?
  • AIUI Linux 自动支持 IPv6 jumbograms(并将正确设置数据包头),因此只需使用 sendto 或其他任何东西,并正确设置 mtu。但是,只有当接口和流量路径支持它们时,它才会真正起作用。
  • 是的,我很清楚它只有在接口和流量支持可用的情况下才能工作。我希望使用 tcpdump 捕获发送方的数据包(以便我知道发送至少有效)。
猜你喜欢
  • 2012-10-26
  • 1970-01-01
  • 2013-07-06
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多