关键词:浏览器,Web服务器,网址(URL),HTTP,HTML,协议,URI,请求消息,解析器,Socket库,DNS服务器,域名
- 浏览器的具体工作步骤是:
- 解析URL(注意这个“解析”跟解析器没有关系)
- 生成HTTP请求消息
- 向DNS服务器查询域名对应的ip地址
- 委托操作系统内部的协议栈将消息发送给Web服务器,按照指定的顺序来调用Socket库中的程序组件。
一、输入URL,浏览器解析网址
1、统一资源定位器 URL
-
浏览器:具备多种客户端功能的综合性客户端软件
-
FTP:文件传输协议
-
域名:像www.glasscom.com这样用句点(.)分隔的名称
-
URL:统一资源定位器
-
功能:不同的头,可以用以判断使用哪种功能。访问Web服务器的时候,用“http”,访问FTP服务器的时候用“ftp:“
-
格式:协议(http:,ftp:,file:,mailto:,)//服务器名称+数据源路径

- Web服务器和FTP服务器:
-
用http协议访问Web服务器:
http://用户名(可省略):密码(可省略)@Web服务器域名:端口号(可省略)/文件的路径名1
http://user:password@www.glasscom.com:80/dir/file.html
-
用FTP协议下载和上传文件:
ftp://用户名(可省略):密码(可省略)@FTP服务器域名:端口号(可省略)/文件的路径名1
ftp://user:password@ftp.glasscom.com:21/dir/file/html
-
服务器读取客户端本地文件:
file://计算机名(可省略)/文件路径名1
file://localhost/c:/path/file1.zip
-
发送邮件的URL:
邮件地址1
mailto:tone@glasscom.com
-
-
省略文件名情况:
比如
http://www.lab.glasscom.com/dir/预先在dir文件夹下设置省略时访问的默认文件名,一般是index.html或者default.html,遇到这种情况直接访问默认页面
-
2、浏览器解析HTTP协议的URL
-
HTTP协议

功能:定义了客户端和服务器之间的交互请求信息包括:”对什么“(URI,统一资源标识符)+“进行怎样的操作”(访问方法,包括GET方法,POST方法等)
-
URI:访问的各种目标,可以是一个网页数据文件名(html文件),也可以是一个CGI程序(Web服务器调用其他的程序)
-
GET方法:URI指定的是文件返回文件;URI指定的是CGI程序,返回输出结果
-
POST方法:向服务器发送数据,此时URI一般指向一个应用程序的文件名
-
HEAD方法:用于获取文件最后更新时间

- 注:超链接主要是GET方法,表单有POST也有GET
返回消息是状态码

-
二、生成HTTP请求消息
HTTP消息
-
请求消息
请求行(
方法 URI HTTP版本)+消息头(请求附加信息)+消息体(POST方法消息体内有表单数据) -
响应消息
状态行(
HTTP 状态码 响应短语)+消息头+消息体(从文件中读取的数据orCGI程序的输出数据)- 状态码和响应短语表示内容一致,用途不同,状态码是一个数字,用来像程序告知执行结果;响应短语是文字,向人们告知执行结果。
-
每条请求消息只能写一个URI,所以最多只能获取一个文件。当网页包含图片时,会在网页相应位置嵌入图片标签,屏幕上会预留显示图片的空间,然后再次访问Web服务器请求图片。
所以,一个网页包含3张图片,一共要向Web服务器发送4条请求
三、向DNS服务器发起 查询 Web服务器的IP地址 请求
1、IP地址
需求:在委托操作系统发送消息时,需要提供通信对象的IP地址。所以需要根据域名查询IP地址。(如果Web服务器采用了虚拟主机功能,可能无法通过IP地址访问)
局域网是基于TCP/IP结构设计的,小的子网通过路由器组成一个大的网络

-
IP地址(一共32bit)
定义:网络号+主机号(xx栋+xx室)
-
子网掩码:与IP地址等长,左半边全是1,右半边全是0,用以区分网络号和主机号

-
例如:10.11.12.13/255.255.255.0表示网络号是10.11.12,主机号是13
若为10.11.12.13/24,则表示子网掩码前24位为1

-
特殊情况:主机号比特全为0,表示代表整个子网。主机号比特全为1,表示对整个子网每个主机进行广播
2、Socket库提供查询功能,解析器向DNS服务器发起查询
-
Socket库:可以让其他应用程序调用操作系统网络功能的库。
-
解析器(DNS解析器,DNS客户端):是一段程序,包含在Socket库中,通过DNS查询IP地址的操作是 域名解析
- 解析器工作过程:一行代码
内存地址=gethostbyname('域名')

-
解析器工作的内部原理:
1.当网络应用程序(浏览器)调用解析器时,程序的控制流程就会转移(原程序暂停,被调用的程序运行)到解析器内
2.解析器会生成发送给DNS服务器的查询消息,这个过程与生成要发送给Web服务器的HTTP请求类似。
3.之后委托给操作系统内部的协议栈来执行发送功能,协议栈执行发送消息操作网卡将消息发送给DNS服务器。
4.之后按照上述相反的过程层层返回

-
注意:与发送其他消息不同的是,我们的终端预先已知DNS服务器的IP地址,不需要再去查询
- 解析器工作过程:一行代码
四、DNS查询到 Web服务器地址 的过程
-
DNS服务器的功能:
接收来自客户端的查询消息,然后根据消息内容返回IP地址。
-
解析器(DNS终端)向DNS服务器发送的查询消息包括:
-
域名(服务器名称,邮件服务器名称(即邮件地址中@之后的部分,不是邮件服务器的域名))
-
Class(始终为IN)
-
记录类型(A对应记录得到的是IP地址,MX对应记录得到的是邮件服务器)

注:当记录类型为MX时,DNS服务器会在记录中保存两种信息,分别是邮件服务器的域名和优先级。DNS服务器再次在自己内部用邮件服务器的域名搜索,可以找到邮件服务器的IP地址。 -
-
域名的层次结构
域名:越靠右表示层级越高
比如www.lab.glasscom.com表示:com集团,glasscom部,lab科,的www。
子域:下级域
建树:下级域的DNS服务器IP地址要注册到上级域的DNS服务器上
- 根域:其实域名应该是www.lab.glasscom.com.最后有一个点,表示注册在根域之下,不过根域一般省略。但是根域DNS服务器注册在互联网所有DNS服务器上。

- 工作原理:客户端访问最近的一台DNS服务器,该服务器经过以下反复找寻环节后可以响应解析器的查询消息。(注意:反复找寻的操作是第一个DNS服务器干的活)

-
实际的访问过程:
-
上级域和下级域共享一个DNS服务器,常有跳过一级查询
-
DNS服务器有缓存功能,若已缓存则直接返回,缓存有有效期
-
五、委托协议栈发送消息
收发数据:TCP协议、UDP协议。
TCP协议收发数据过程(由协议栈执行):
(1)创建套接字(创建套接字阶段)
(2)将管道连接到服务器端的套接字上(连接阶段)
(3)收发数据(通信阶段)
(4)断开管道并删除套接字(断开阶段)
-
套接字:数据通信管道两端的数据出入口
-
创建套接字:
管道在连接是由客户端发起的,在断开是由服务器or客户端任意一方发起

调用socket:创建套接字,返回描述符,放到指定内存中。- 描述符:用来识别不同的套接字的标识符
-
连接阶段:
调用connect组件,需要:
-
描述符
-
IP地址
-
端口号:当同时指定IP地址和端口号时,就可以识别出某台具体计算机上的套接字
注:在创建套接字时,协议栈会为这个套接字分配一个端口号;在执行连接操作时,会将这个随便分配的端口号通知服务器。
-
-
描述符和端口号的区别
描述符:用来在一台计算机内部识别套接字的机制
端口号:让通信的另一方能够识别出套接字的机制。预先约定:Web是80号端口,电子邮件是25端口。
-
通信阶段
调用write,需要:
-
描述符
-
发送的数据
调用read,需要:
- 指定接收到的内存地址:接收缓冲区(位于应用程序的内存空间)
-
-
断开操作
HTTP要求Web服务器先断开,HTTP1.1(能在一次连接中收发多个请求和响应)要求浏览器先断开