sockaddr_storage 大小为 128 字节

Posted

技术标签:

【中文标题】sockaddr_storage 大小为 128 字节【英文标题】:sockaddr_storage size of 128 bytes 【发布时间】:2013-02-25 20:20:24 【问题描述】:

我只是想知道为什么 sockaddr_storage 是 128 字节。我知道 IPv6 必须至少有 28 个字节,但这似乎有点过分,比 sockaddr_in6 多出 100 个字节。这只是为了将来证明存储结构还是有理由现在需要它?

【问题讨论】:

struct sockaddr_atmsvc 有多大?我也不知道,但我敢打赌它大于 28 个字节。 【参考方案1】:

您将在rfc 2553 的第 3.10 节和此SO post 中找到问题的答案。

原因是应该至少保持ip6和其他协议数据64位对齐的组合以提高效率。

来自 RFC 的相关部分:

对套接字 API 的一个简单补充,可以帮助应用程序 writers 是“struct sockaddr_storage”。这种数据结构可以 简化编写跨多个地址系列可移植的代码,并且 平台。该数据结构的设计目标如下。

  - It has a large enough implementation specific maximum size to
    store the desired set of protocol specific socket address data
    structures. Specifically, it is at least large enough to
    accommodate sockaddr_in and sockaddr_in6 and possibly other
    protocol specific socket addresses too.
  - It is aligned at an appropriate boundary so protocol specific
    socket address data structure pointers can be cast to it and
    access their fields without alignment problems. (e.g. pointers
    to sockaddr_in6 and/or sockaddr_in can be cast to it and access
    fields without alignment problems).
  - It has the initial field(s) isomorphic to the fields of the
    "struct sockaddr" data structure on that implementation which
    can be used as a discriminants for deriving the protocol in use.
    These initial field(s) would on most implementations either be a
    single field of type "sa_family_t" (isomorphic to sa_family
    field, 16 bits) or two fields of type uint8_t and sa_family_t
    respectively, (isomorphic to sa_len and sa_family_t, 8 bits
    each).

【讨论】:

【参考方案2】:

可能有些系统也希望能够在此结构中容纳struct sockaddr_un。后者具有大约 100 到 110 个字符的系统相关路径长度。 128 是一个漂亮的偶数。

【讨论】:

以上是关于sockaddr_storage 大小为 128 字节的主要内容,如果未能解决你的问题,请参考以下文章

将 sockaddr_storage 转换为 inet_ntop 的 sockaddr_in

如何理解存储在 sockaddr_storage 中的 IP 的 IP 版本

从 sockaddr_storage 中提取 IP 地址和端口信息

从sockaddr_storage中提取IP地址和端口信息

为什么块大小为128M?

HDFS 默认块大小为 128 MB,而 Hive 默认条带大小为 250 MB