【问题标题】:Data structures padding when sending over TCP通过 TCP 发送时的数据结构填充
【发布时间】:2012-08-30 01:38:00
【问题描述】:

我注意到 FastCGI 协议定义了一个 7 字节的记录(通信中使用的数据结构)标头,并带有 1 个字节的填充。必要时还会填充其他结构。想知道这个字节是否改变了任何东西,我对 7 字节和 8 字节缓冲区的 1000000 次顺序发送和接收进行了计时,结果发现……没有什么特别的。几次执行提供的数据如此多变,甚至不值得平均。 (testing code)

如果我必须通过 TCP 发送 7 字节数据,是否值得添加一个字节,所以我的发送和读取操作在 8 字节缓冲区上进行?那来自哪里以及如何知道什么填充是合适的?如果套接字是 Unix 文件套接字还是 INET 套接字,有什么不同吗?如果发件人和收件人在同一主机上,会有所不同吗?

【问题讨论】:

    标签: sockets networking


    【解决方案1】:

    不,填充与网络无关。

    通常会看到以这种方式定义的结构,以便它们在 4 字节边界上对齐(或在 64 位操作系统上为 8 字节)。更多信息请看这里:

    http://en.wikipedia.org/wiki/Data_structure_alignment

    【讨论】:

      【解决方案2】:

      这可以追溯到不同架构的alignment requirements,这里的主要目的是最大程度地减少必须在严格对齐平台上完成的数据复制,并利用在商用 PC 硬件上更快的执行。这就是为什么大多数低级协议(如 IP 和 TCP)的标头中的整数在 32 位或 64 位边界上对齐。

      【讨论】:

      • 我知道数据结构对齐问题,但认为高级的、独立于平台的网络协议规范不会关心它们......
      • 它是哪种协议会有所不同。例如,HTTP 是基于文本的,不在乎。二进制通常会做的任何事情 - 毕竟,最终一切都归结为物理机器上的位和字节。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2016-01-11
      • 1970-01-01
      相关资源
      最近更新 更多