图2.1:浏览器调用socket库中的解析器,向DNS服务器询问域名的ip地址
(图中的gethostbyname是解析器的名称;协议栈是操作系统的网络控制软件,也称协议驱动、TCP/IP驱动)
图2.2 DNS服务器根据客户端查询信息查询IP
来自客户端的查询消息包含以下3种信息。
(a)域名服务器、邮件服务器(邮件地址中@后面的部分)的名称
(b)Class
在最早设计DNS方案时,DNS在互联网以外的其他网络中的应用也被考虑到了,而Class就是用来识别网络的信息。不过,如今除了互联网并没有其他的网络了,因此Class的值永远是代表互联网的IN
(c)记录类型
表示域名对应何种类型的记录。例如,当类型为A时,表示域名对应的是IP地址;当类型为MX时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息也会不同,DNS服务器上事先保存有前面这3种信息对应的记录数据。
还有很多其他的类型。例如根据IP地址反查域名的PTR类型,查询域名相关别名的CNAME类型,查询DNS服务器IP地址的NS类型,以及查询域名属性信息的SOA类型等。
图2.3 DNS服务器接力查询域名ip的过程
(1)每台DNS服务器都可以找到根域DNS服务器
(2)离客户端最近的的DNS服务器就是客户端网络设置里填写的DNS服务器地址
(3)一台DNS服务器管理多个域
(4)上图中从根域DNS服务器层层下查的过程的前提是,离客户端最近的DNS服务器中没有这个域名的资源记录,同时它的缓存中也没有查找过该域名的记录。
图2.4: 客户端与服务器端的网络应用程序使用Socket库来收发数据
建立数据管道的关键在于管道两端的数据出入口,这些出入口称为套接字。需要先创建套接字,然后再将套接字连接起来形成管道。
1.首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道。当服务器进入等待状态时,客户端就可以连接管道了。
2.客户端也会创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字3.上。当双方的套接字连接起来之后,通信准备就完成了。
3.接下来只要将数据送入套接字就可以收发数据了。
图2.5:服务器与客户端收发数据的具体步骤
(1)创建套接字(创建套接字阶段)
(2)将管道连接到服务器端的套接字上(连接阶段)
(3)收发数据(通信阶段)
(4)断开管道并删除套接字(断开阶段)
上述过程都是应用程序调用Socket库委托操作系统完成的,应用程序本身并不执行操作