作家
登录

Docker容器网络下UDP协议的一个问题

作者: 来源: 2017-08-23 09:49:41 阅读 我要评论

  • [pid   477] setsockopt(124, SOL_IPV6, IPV6_MULTICAST_HOPS, [1], 4) = 0 
  • [pid   477] bind(124, {sa_family=AF_INET6, sin6_port=htons(6088), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0 
  •  
  • [pid   477] getsockname(124, {sa_family=AF_INET6, sin6_port=htons(6088), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0 
  • [pid   477] getsockname(124, {sa_family=AF_INET6, sin6_port=htons(6088), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0 
  •  
  • [pid   477] recvfrom(124, "j\201\2450\201\242\241\3\2\1\5\242\3\2\1\n\243\0160\f0\n\241\4\2\2\0\225\242\2\4\0"..., 2048, 0, {sa_family=AF_INET6, sin6_port=htons(38790), inet_pton(AF_INET6, "::ffff:172.17.0.3", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 168 
  •  
  • [pid   477] sendto(124, "k\202\2\0210\202\2\r\240\3\2\1\5\241\3\2\1\v\243\5\33\3TDH\244\0220\20\240\3\2"..., 533, 0, {sa_family=AF_INET6, sin6_port=htons(38790), inet_pton(AF_INET6, "::ffff:172.17.0.3", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 533 
  • 其对应的逻辑是如许的:应用 ipv6 绑定在 0.0.0.0 和 6088 端口,调用 getsockname 获取当前 socket 绑定的端口信息,数据传输过程应用的是 recvfrom 和 sendto 。

    因为是在传输数据的时刻掉足的,是以第一个疑点是 sendmsg 和 sendto 的某些差别导致选择源地址有不合,经由过程 man sendto 可以知道 sendmsg 包含了更多的┞菲握信息在 msghdr 。一个合理的猜测是 msghdr 中包含了内核选择源地址的信息!

    经由过程查找,发明 IP_PKTINFO 这个选项就是让内核在 socket 中保存 IP 报文的信息,当然也包含了报文的源地址和目标地址。 IP_PKTINFO 和 msghdr 的关系可以在这个 stackoverflow 中找到:https://stackoverflow.com/questions/3062205/setting-the-source-ip-for-a-udp-socket。

    而 man 7 ip 文档中也说清楚明了 IP_PKTINFO 是怎么控制源地址选择的:

    1. IP_PKTINFO (since Linux 2.2) 
    2.               Pass  an  IP_PKTINFO  ancillary message that contains a pktinfo structure that supplies some information about the incoming packet.  This only works for datagram ori‐ 
    3.               ented sockets.  The argument is a flag that tells the socket whether the IP_PKTINFO message should be passed or not.  The message itself can only be sent/retrieved as 
    4.               control message with a packet using recvmsg(2) or sendmsg(2). 
    5.  
    6.                   struct in_pktinfo { 
    7.                       unsigned 

        推荐阅读

        如何确定恶意软件是否在自己的电脑中执行过?

      【51CTO晃荡】8.26 带你与清华大年夜学、搜狗、京东大年夜咖们一路商量基于算法的IT运维实践 很不幸,你在本身的电脑里发清楚明了一个恶意的可履行法度榜样!那么问题来了:这个文件到底有>>>详细阅读


      本文标题:Docker容器网络下UDP协议的一个问题

      地址:http://www.17bianji.com/lsqh/36867.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)