通过系统调用理解 resolv.conf 名称服务器

通过系统调用理解 resolv.conf 名称服务器

我试图了解 /etc/resolv.conf /etc/nsswitch.conf 的具体工作原理以及名称服务器条目 127.0.1.1 的意义

我执行了 strace ping google.com 来了解所涉及的系统调用,其中一部分是:

stat64("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=172, ...}) = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, 16) = 0
gettimeofday({1413780874, 913366}, NULL) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])
send(4, "\0040\1\0\0\1\0\0\0\0\0\0\6google\3com\0\0\1\0\1", 28, MSG_NOSIGNAL) = 28
poll([{fd=4, events=POLLIN}], 1, 5000)  = 1 ([{fd=4, revents=POLLIN}])
ioctl(4, FIONREAD, [204])               = 0
recvfrom(4, "\0040\201\200\0\1\0\v\0\0\0\0\6google\3com\0\0\1\0\1\300\f\0\1"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, [16]) = 204
close(4)                                = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(1025), sin_addr=inet_addr("173.194.123.36")}, 16) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(58830), sin_addr=inet_addr("192.168.1.13")}, [16]) = 0
close(4)

有人能解释一下这里发生了什么吗?特别是连接到 127.0.1.1,因为它是我的 resolv.conf 中的 namsserver 条目。为什么我们需要与 127.0.1.1 建立套接字连接?我们如何从它那里得到响应?

答案1

大概你的resolv.conf包括nameserver 127.0.1.1

在您的示例中ping 时,google.com首先需要查找此名称,以便ping知道可以向其发送 ICMP 回显请求数据包的 IP 地址。

为了找到 IP 地址,它会查阅配置的名称服务器,这就是它与 进行通信的127.0.1.1原因53/udp

答案2

127.0.0.1 仍然是一个 IP,因此它会与 127.0.0.1 建立 UDP 套接字连接。

答案3

首先,使用 检查 /etc/resolv.conf 是否存在stat()。其次,使用 准备用于解析的套接字socket()。然后使用 将此套接字初始化为connect()解析器的 IP 地址、udp 协议和端口号 53。然后使用 发送请求send()并使用 读取答复recvfrom()。然后使用 关闭套接字close()

相关内容