本文主要取材于 《网络是怎样连接的》 第一章。
简述:在浏览器输入一个网址,浏览器会解析出域名,但是直接使用域名无法找到Web服务器。需要使用DNS解析器将域名解析为IP地址,然后客户端可以创建套接字,延伸出管道根据IP地址和端口号,去找到对应的Web服务器的套接字完成连接。套接字连接之后相当于客户端和服务端之间生成了管道,就可以收发数据了。
本章共四个章节,(1)生成HTTP请求消息 (2)向DNS服务器查询Web服务器的IP地址(3)全世界DNS服务器的大接力 (4)委托协议栈发送消息
1.生成HTTP消息
当我们在 浏览器输入 网址 例如 :http:// www.lab.glasscom.com/dir/file1.html,浏览器会解析这个网址,解析过程如下,然后得到相应的Web 服务器名字,即 www.lab.glasscom.com,为了得到服务,客户端得找到Web服务器名对应的IP地址在哪里,这时候就需要DNS服务器出现了。
2.向DNS服务器查询Web服务器的IP地址
浏览器生成生成HTTP消息之后,接下来我们需要委托操作系统将消息发送给Web服务器。在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP地址。因此,在生成HTTP消息之后,下一个步骤就是根据域名查询IP地址。
查询IP地址的方法非常简单,只要询问最近的DNS服务器“www.lab.glasscom.com的IP地址是什么”就可以了,DNS服务器会回答说“该服务器的IP地址为xxx.xxx.xxx.xxx”。
我们的计算机上一定有相应的DNS客户端,而相当于DNS客户端的部分称为DNS解析器,或者简称解析器。通过DNS查询IP地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)了。解析器实际上是一段程序,它包含在操作系统的Socket库中。
3.全世界DNS服务器的大接力
第2部分讲了 DNS来解析域名得到IP地址,然而一个DNS服务器无法存储所有的域名和IP对,那么怎么办呢?
以下个域名为例,www.lab.glasscom.com这个域名如果按照公司里的组织结构来说,大概就是“com事业集团glasscom部lab科的www”这样。其中,相当于一个层级的部分称为域。因此,com域的下一层是glasscom域,再下一层是lab域,再下面才是www这个名字。 所有的上一级机构知道下一层机构的位置。
因此 客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器(图1.15)。分配给根域DNS服务器的IP地址在全世界仅有13个,而且这些地址几乎不发生变化,因此将这些地址保存在所有的DNS服务器中也并不是一件难事。
4.委托协议栈发送消息
知道了IP地址之后,就可以委托操作系统内部的协议栈向这个目标IP地址,也就是我们要访问的Web服务器发送消息了。要发送给Web服务器的HTTP消息是一种数字信息(digital data),因此也可以说是委托协议栈来发送数字信息。收发数字信息这一操作不仅限于浏览器,对于各种使用网络的应用程序来说都是共通的。
向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用Socket库中的程序组件。
在收发数据之前,客户端和服务器之间需要建立起管道。那么管道如何建立呢?
建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。
首先,服务器一方先创建套接字,等待客户端连接。
客户端有需求时,会创建套接字,然后从该套接字延伸出管道,接到服务器的套接字上,管道连接就完成了。当套接字连接起来之后,剩下的事情就简单了。只要将数据送入套接字,数据就会被发送到对方的套接字中。当然,应用程序无法直接控制套接字,因此还是要通过Socket库委托协议栈来完成这个操作
收发数据操作:
(1)创建套接字(创建套接字阶段)(2)将管道连接到服务器端的套接字上(连接阶段)(3)收发数据(通信阶段)(4)断开管道并删除套接字(断开阶段)
套接字:套接字是用来区分不同的服务的,例如一台计算机客户端可以同时访问多个Web服务器,那么就需要创建多个套接字。在计算机内部,是使用描述符来区分不同的套接字。
在将管道连接到服务的套接字时,应用程序通过调用Socket库中的名为connect的程序组件来完成这一操作。这里的要点是当调用connect时,需要指定描述符、服务器IP地址和端口号这3个参数。
描述符让协议栈知道使用哪一个套接字去连接, IP地址是找到相应的服务器,端口号是为了找到服务器对应的套接字。
描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制。
问题:问什么不统一使用描述符或者 端口来识别套接字呢?
先保留问题,答案可能在6.2.3章节。