【问题标题】:How does ancillary data in sendmsg() work?sendmsg() 中的辅助数据如何工作?
【发布时间】:2013-01-02 19:58:41
【问题描述】:

sendmsg() 允许将辅助数据发送到另一个套接字,我想知道这是如何工作的。

1) 辅助数据是否与普通消息一起打包?

2) 如果是这样,远程接收套接字如何知道如何解析这个?

3) 远程接收客户端如何检索这些辅助数据?

谢谢。

【问题讨论】:

    标签: linux network-programming


    【解决方案1】:

    辅助数据不会通过网络发送 - 永远不会。对于 Unix 域套接字,辅助数据用于在进程之间发送或接收文件描述符以共享或负载平衡任务。注意:Unix 域套接字在同一台机器上运行的进程之间传输信息,而不是在不同机器上运行的进程之间传输信息。

    同样,如果进程在不同机器上运行:您的数据包不使用任何辅助概念将与在发送机器(或接收机器)上应用辅助概念时的数据包完全相同。因此,辅助数据不是随您的数据包一起提供的。

    辅助数据用于接收从内核到用户空间应用程序的EXTRA数据包相关服务/信息,否则不可用。例如,假设机器 B 在线接收到一些数据包,并且您想知道数据包从哪个入口接口到达?你怎么会知道这个?辅助数据来拯救。

    辅助数据是在辅助控制缓冲区中设置的一种标志,并在调用 sendmsg()/recvmsg() 时传递给内核,它告诉内核当数据包发送或到达时,要提供哪些额外的服务/信息到调用调用的应用程序。

    辅助数据是内核和用户空间应用程序之间或同一台机器上的进程之间的通信方式(如果是 UNIX 套接字)。这不是电线上的数据包所具有的。

    供您参考,请下载代码示例here,它可以在我的 ubuntu 机器上完美运行。 src/igmp_pkt_reciever.c 中演示了辅助数据概念。

    【讨论】:

    • 该代码示例位于“付费墙”后面。介意在答案中或更公共的空间发布它吗?
    【解决方案2】:

    您只能通过几种选择方式使用辅助数据:

    • 您可以使用它来获取接收接口(IPv4)
    • 您可以使用它来指定跃点限制(对于 IPv6)
    • 您可以使用它来指定流量类别(同样是 IPv6)
    • ....
    • 您可以使用它来传递/接收文件描述符或用户凭据(Unix 域)

    这三种情况只是通过recvmsg(2)从内核态接收控制信息的人工API方法。最后一个是最有趣的:实际发送辅助数据的唯一情况是使用 Unix 域套接字,其中所有事情都发生在内核中,因此实际上没有任何东西在线上。

    【讨论】:

    • cmsg man page 显示了如何发送文件描述符。
    • 所以你说文件描述符是唯一实际发送数据的情况,那么其他情况下,数据不发送呢?该辅助数据的任何特定应用程序使用情况如何?这是我真正有兴趣知道的。
    • @wei 辅助数据的应用文件描述符。 (请参阅libancillary。)您可以拥有一个“网关”进程来接受传入的 TCP 连接,然后将它们交给同一台机器上的工作进程进行处理。
    • @chrisaycock 我的意思是,除了在 unix 域套接字之间传递文件描述符之外,这是否可以用于一般目的,我并不真正感兴趣?引起这种兴趣的原因是我现在正在阅读的代码使用它在两个 linux 机器之间传递自己的“私有”控制信息,以扩展现有的套接字选项。但我不能确定它是如何工作的。一个疯狂的猜测是,这些“私人”信息以某种方式被打包在数据包的 IP OPTIONS 标头中。对不起,我不能粘贴这个的源代码。
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2012-05-22
    • 2012-07-28
    • 2015-10-17
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多