【问题标题】:DNS over UDP example queryDNS over UDP 示例查询
【发布时间】:2015-10-25 20:01:11
【问题描述】:

我经常发现自己需要测试互联网连接是否在线。特别是,有时(在非常非常特殊的连接上)UDP 被禁用。现在,我认为测试 UDP 是否可用于我的连接的最简单方法之一是通过 DNS 查询。

现在,使用 getaddrinfo 之类的函数从查询中抽象出 UDP,因此(据我的理解)如果 UDP 不可用,则将使用 TCP。现在,由于我需要测试 UDP 连接,我需要自己使用查询来伪造 UDP 数据包。此外,我想查询公共 DNS 服务器(如 8.8.8.8),以便确定 UDP 连接可用于与外部主机通信。

所以我想知道:我可以通过 UDP 数据包发送的最简单的 DNS 查询是什么?你能给我看一个例子,它只要求 google.com 的 IP 到 DNS 服务器吗?

【问题讨论】:

    标签: c dns udp


    【解决方案1】:

    我不确定我是否完全理解您的问题,但最简单的查询类似于 SOA for .(即根区域的权限开始),如下所示:

    $ dig SOA . @8.8.8.8
    
    ; <<>> DiG 9.8.3-P1 <<>> SOA . @8.8.8.8
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46366
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;.              IN  SOA
    
    ;; ANSWER SECTION:
    .           4350    IN  SOA a.root-servers.net. nstld.verisign-grs.com. 2015102500 1800 900 604800 86400
    
    ;; Query time: 36 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Sun Oct 25 21:07:19 2015
    ;; MSG SIZE  rcvd: 92
    

    如果您询问 UDP 数据包是什么样的,只需使用 tcpdump 捕获它。然而,这种简单的 DNS 数据包在 C 中相对容易构建 - 参见RFC1035。您可能想要使用预先存在的库,例如 c-aresadns

    请注意,据我所知,您的解析器库是否回退到 TCP 取决于实现。 Linux 上的 IIRC glibc 不会回退到 TCP,而 OpenBSD 上的 libresolv 只有在 /etc/resolv.conf 包含 options tcp 时才会这样做。当以编程方式使用libresolv 时,您只需要ensure RES_USEVC is clear

    如果您正在寻找示例代码,'Stevens' TCP/IP 插图' 是规范的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 2010-11-07
      相关资源
      最近更新 更多