网络是怎样连接的 - 第1章
第一章:浏览器生成消息
主要包括四个部分:
1.生成HTTP请求消息;
2.向DNS 服务器查询Web 服务器的IP 地址;
3.世界各地的DNS服务器的接力;
4.浏览器就将消息委托给操作系统发送给Web服务器;
1.1 生成HTTP请求消息
网址,准确来说应该叫URL(Uniform Resource Locator),不同的URL用于判断浏览器访问什么Web服务器,比如访问Web 服务器时用“http:”,而访问FTP服务器时用“ftp:”。(File Transfer Protocol,文件传送协议)根据访问目标的不同,URL 的写法也会不同。
尽管URL 有各种不同的写法,但它们有一个共同点,那就是URL 开头的文字,即“http:”“ftp:”“file:”“mailto:”这部分文字都表示浏览器应当使用的访问方法。比如当访问Web 服务器时应该使用HTTP协议(Hypertext Transfer Protocol,超文本传送协议),而访问FTP 服务器时则应该使用FTP 协议。
浏览器解析 URL
HTTP协议
请求消息就是要求服务器 ‘对什么’ 进行 ‘怎样的操作’。Uniform Resource Identifier,统一资源标识符相当于 ‘对什么’,进行怎样的操作相当于方法,主要包括get方法,post方法等等。最常用的就是get方法和post方法。
收到请求消息之后,Web 服务器会对其中的内容进行解析,通过URI和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。在响应消息的开头有一个状态码,它用来表示操作的执行结果是成功还是发生了错误(比如经常看到的404 Not Found实际上就是返回的错误的状态码)。
需要注意的是:实际上并不只是通过URL才能访问服务器,通过超链接,或者填表之后点击提交这些操作实际上都需要和服务器交互。
在HTML 文档中写上<a href="……">
标签,其中”……” 部分为URL,这就是一个超级链接。
浏览器再经过了对URL的解析后,浏览器确定了Web 服务器和文件名,接下来就是根据这些信息来生成HTTP 请求消息了。
在地址栏中输入网址并显示网页应该使用GET方法;
点击超级链接的场景中也是使用GET 方法;
如果是表单,在HTML源代码中会在表单的属性中指定使用哪种方法来发送请求,可能是GET 也可能是POST。(GET 方法能够发送的数据只有几百个字节,如果表单中的数据超过这一长度,则必须使用POST 方法来发送。)
浏览器与Web 服务器之间交互消息的一个实例。在这个例子中,我们需要获取一张名为sample1.htm 的网页,网页中包含一张名为picture.jpg 的图片,下图中展示了这个过程中产生的消息:
1.2 向DNS 服务器查询Web 服务器的IP 地址
通过IP 地址我们可以判断出访问对象服务器的位置,就像门牌号,从而将消息发送到服务器。
IP 地址的主机号
- 全0:表示整个子网
- 全1:表示向子网上所有设备发送包,即“广播”
之所以用IP而非直接用域名传输,是因为IP地址只占用4个字节,而且长度固定,路由器的负担小。
将域名转换为IP地址需要DNS解析,也叫做域名解析;域名解析器实际上是一段程序,它包含在操作系统的Socket库中;经过解析后,解析器会向DNS 服务器发送查询消息,然后DNS 服务器会返回响应消息,其中就包括IP地址。
调用解析器时完整的工作过程如下:
1.3 DNS的接力
发送给DNS服务器的请求消息主要包含3个部分:域名、class、记录类型。
域名就是你在浏览器上输入的域名;class,识别网络的信息,默认为IN;记录类型,域名对应何种类型的记录,A表示IP地址,MX表示邮件服务器
例如,如果要查询 www.baidu.com 这个域名对应的IP 地址,客户端会向DNS 服务器发送包含以下信息的查询消息。
(a) 域名 = www.baidu.com
(b) Class = IN
(c) 记录类型 = A
首先,信息保存在多台DNS服务器中,DNS 服务器中的所有信息都是按照域名以分层次的结构来保存的。
域名都是用句点来分隔的,比如www.lab.glasscom.com,这里的句点代表了不同层次之间的界限,在域名中,越靠右的位置表示其层级越高。最下层的www是服务器的名称。
根据域名层级结构的高低,DNS服务器将负责管理下级域的DNS 服务器的IP 地址注册到它们的上级DNS 服务器中,这样,我们就可以通过上级DNS 服务器查询出下级DNS 服务器的IP 地址,也就可以向下级DNS 服务器发送查询请求了。
整个的查询过程如下:
客户端首先访问最近的一台DNS服务器(在上面的TCP/IP设置为自动获取DNS服务器地址),然后服务器把查询消息发送给根域(DNS最高级的域),根域判断这个域名属于com域,因此根域DNS服务器返回它所管理的com域的DNS服务器的IP地址,com域DNS服务器判断这个域名属于下一级baidu域,返回它所管理的baidu域的DNS服务器的IP地址,大体意思就是说,我不知道你这个域名的IP地址,但我给你另一个DNS服务器的IP地址,它可能知道。接下来baidu域判断这个域名属于下一级www域,再返回www域DNS服务器的IP地址,到了www域后,就找到了www.baidu.com这个域名的IP地址了,将这个IP地址发送回客户端,也就完成了查询过程。
通过缓存机制可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始。
1.4 委托协议栈发送消息
查到了IP地址,接下来就是向这个IP地址发送消息了。数据收发操作概览和向DNS 服务器查询IP 地址的操作一样,这里也需要使用Socket 库中的程序组件。
简单来说,整个的通信过程就是收发数据的两台计算机之间连接了一条数据通道,数据沿着这条通道流动,最终到达目的地。我们可以把数据通道想象成一条管道,将数据从一端送入管道,数据就会到达管道的另一端然后被取出。数据可以从任何一端被送入管道,数据的流动是双向的。
在进行收发数据操作之前,双方需要先建立起这条管道才行。建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。
- 收发数据的操作分为若干个阶段,可以大致总结为以下4 个。
- 创建套接字(创建套接字阶段)
- 将管道连接到服务器端的套接字上(连接阶段)
- 收发数据(通信阶段)
- 断开管道并删除套接字(断开阶段)
首先,服务器一方先创建套接字,然后等待客户端向该套接字连接管道A。当服务器进入等待状态时,客户端就可以连接管道了。具体来说,客户端也会先创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上。当双方的套接字连接起来之后,通信准备就完成了。接下来,就像我们刚刚讲过的一样,只要将数据送入套接字就可以收发数据了。我们再来看一看收发数据操作结束时的情形。当数据全部发送完毕之后,连接的管道将会被断开。管道在连接时是由客户端发起的,但在断开时可以由客户端或服务器任意一方发起A。其中一方断开后,另一方也会随之断开,当管道断开后,套接字也会被删除。到此为止,通信操作就结束了。
基本流程如下:
需要注意的几点:
- 以上的这些操作都是在操作系统中实现的
- Socket表示操作系统中的库,socket表示套接字。
- IP 地址不是分配给每一台设备的,而是分配给设备中安装的网络硬件的。
connect中的端口号:浏览器访问Web 服务器时使用80 号端口,电子邮箱使用25号端口。
描述符:应用程序用来识别套接字的机制。connect 会将应用程序指定的描述符告知协议栈,然后协议栈根据这个描述符来判断到底使用哪一个套接字去和服务器端的套接字进行连接,并执行连接的操作A。
ARP:地址解析协议,据已知IP 地址求出MAC 地址。
课后练习
- http://www.nikkeibp.co.jp/ 中的 http 代表什么意思?
答:http 协议 - 下面两个网址有什么不同?
a. http://www.nikkeibp.co.jp/sample
b. http://www.nikkeibp.co.jp/sample/
答:a 中的 sample 代表文件名,b 中的 sample 代表目录名 - 用来识别连接在互联网上的计算机和服务器的地址叫什么?
答:IP 地址 - 根据 Web 服务器的域名来查询 IP 地址时所使用的服务器叫什么?
答:DNS 服务器 - 向 DNS 服务器发送请求消息的程序叫什么?
答:解析器