网络是怎样连接的_浏览器生成消息
一、网址
1,什么是网址
网址,准确地讲叫URL(Uniform Resource Locator)即统一资源定位符,其直观的表现形式就是浏览器中以“http:”,“ftp:”,“file:”,“maito:”开头的一串字符。访问不同的服务器的时候就会用到不同的开头,如访问Web服务器的时候就需要使用“http:”开头,访问FTP服务器的时候就会用到“ftp:”的URL开头。
网址的格式,以访问Web服务器为例一般为
http://user:password@www.xxx.com:80/filepath/file
其中的http:表示浏览器应该使用的访问方法,要访问Web服务器,user 和 password 可以省略,www.xxx.com 为网站的域名,80为端口号可以省略,/ 之后的 filepath/file 表示你要访问它的哪一个文件,为文件路径。
2,浏览器如何解析网址
浏览器所做的第一步工作就是解析URL,生成要发送给Web服务器的请求消息,以 http 协议为例。一般的我们的网址是以下这样的:
http://www.xxx.com/filepath/file
http浏览器会解析为协议,即要访问Web服务器,www.xxx.com为要访问的服务器,filepath/file 为要访问这个服务器上这个路径的文件。
有些URL会出现省略文件名的情况,即只有 filepath 没有 file,如下
http://www.xxx.com/filepath/
此时不必担心,服务器上已经设定好了文件名省略的时候要访问哪一个文件,大多数情况下是 index.html 或者 default.htm。由于上面这个网址以 / 结尾,表示一个目录,由于省略了文件名,所以就会访问 /index.html或者 /default.htm。
如果URL只有域名没有文件路径呢?比如下面这样:
http://www.xxx.com
没错,这样就访问根目录下的 index.html 文件或者default.htm文件。
如果要访问的是一个目录下的 index.html 那么在写路径的时候也可以不写最后的 / 。
二、HTTP协议
1,什么是HTTP协议
HTTP协议定义了客户端和服务器之间交互的信息内容和步骤。
首先,客户端会向服务器发送请求信息,在请求信息中包含URL和方法,还有一些用来表示附加信息的头字段,客户端向服务器发送请求的时候会先向服务器发送头字段,然后再发送数据。服务器收到请求信息之后解析请求信息中的URL和方法,生成响应消息,响应消息包含状态码,头字段和网页数据。响应消息被发送给客户端,浏览器从消息中读出相应的数据显示在屏幕上,这样HTTP的整个工作就完成了。简单来讲就是客户端向服务器发出请求,服务器相应该请求,想客户端发送响应消息,客户端浏览器对其进行显示。
URL前面已经讲过了,这里我们看一下HTTP的方法。主要使用的就是一下两种方法
-------------------------------------------------------
GET :获取URL指定的信息,如果指定的是文件,就返回文件的内容,如果指定的是CGI程序,就返回该程序的输出数据。
POST :从客户端向服务器发送数据,一般情况下是发送表单中填写的数据。
-------------------------------------------------------
2,HTTP请求和相应消息
请求消息格式:
-------------------------------------------------------
<方法><空格><URL><空格><HTTP版本> //请求行,大致了解请求内容
<字段名>:<字段值> //头字段,用于表示请求的附加信息
……. //头字段
<字段名>:<字段值> //头字段,数量可变,一直到空行为止
<空行>
<消息体> //包含客户端向服务器发送的数据
-------------------------------------------------------
响应消息格式:
-------------------------------------------------------
<HTTP版本><空格><状态码><空格><响应短语> //状态行
<字段名>:<字段值> //头字段,用于表示请求的附加信息
……. //头字段
<字段名>:<字段值> //头字段,数量可变,一直到空行为止
<空行>
<消息体> //包含服务器向客户端发送的数据
-------------------------------------------------------
3,发送请求接收回应
响应消息的格式和请求信息基本相同,不同点在于第一行,请求消息的请求行和响应消息的状态行格式不同,在响应消息中,第一行是状态码和响应短语,表示请求的执行是成功还是出错,状态码和响应短语的涵义是一致的,但是状态码是一个数字,主要向程序告知请求结果。响应短语是一串字符,主要向用户告知响应结果,用途不相同。
状态码由三位数字组成,第一位数字表示状态类型,后两位表示具体的情况,第一位数字的涵义如下:
-------------------------------------------------------
1XX:告知请求的处理进度和情况
2XX:成功
3XX:表示需要进一步操作
4XX:客户端出错
5XX:服务器出错
-------------------------------------------------------
4,对于网页中非文字的部分
由于一条请求信息只能写一个URL,所以当要访问的网页中包含图片的时候,必须对每一张图片再单独发送一条请求。文件同理。对于浏览器而言,它只是一条一条的发送请求信息,对于这些指挥工作不必了解。
三、IP地址
1,什么是IP地址
IP地址是指互联网协议地址,是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例如:
10.11.12.13
仅凭以上这一组数据我们无法区分哪一部分是网络号,哪一部分是主机号,所以还需要另外的附加信息来表示IP地址的内部结构,即子网掩码,子网掩码分两部分,前面全是1,后面全是0。例如:
10.11.12.13 / 255.255.255.0
子网掩码是1的部分表示网络号,子网掩码是0的部分表示主机号,以上子网掩码的前24位是1,后8位是0,也可以用一种更简略的方法表示子网掩码。例如:
10.11.12.13 / 24
24即表示子网掩码前面为1的位数。
另外,主机号所有位全部为0,表示整个子网,主机号所有位全部为1,表示对整个子网进行广播。
2,IP地址有什么作用
由于IP地址是唯一的,相当于现实中的地址住址等信息,拥有了对方的IP地址,就能够得到对象服务器的具体位置。
3,为什么有了域名还要使用IP地址
网络中存在无数的路由器,他们之间互相配合,根据IP地址来判断把数据传送到什么地方。
从运行效率上来看,IP地址很简短,只有32bit,也就是4个字节。域名最短的也要几十个字节,最长的可以达到255个字节,如果使用域名而不使用IP地址,显然的极大地增加了路由器的负担,传送数据也要更长的时间。
四、IP地址查询
1,域名和IP地址转换
IP地址简短高效,对路由器友好,但是对用户而言较难记忆。所以采用让路由器,服务器使用IP地址,而用户使用域名的方法。
2,域名和IP地址如何转换
为了填补域名和IP地址之间转换的障碍,需要有一个机制来通过名称查询IP地址,或者通过IP地址查询名称,这个机制就是DNS。
查询IP地址非常简单,只需要向最近的DNS服务器发送查询消息,就能得到某个域名的IP地址。例如:
询问DNS服务器 www.xxx.com 的IP地址是什么?DNS服务器响应一条消息,告诉你它的IP地址是 xxx.xxx.xxx.xxx。
通过DNS查询IP地址的操作称为域名解析,负责执行解析这一操作的就叫做解析器。解析器实际上是一段程序,包含在操作系统的Socket库中。
3,通过解析器查询IP地址
简单来讲,只需要调用Socket库中的gethostbyname("www.xxx.com") 方法即可。
调用解析器后,解析器就会向DNS服务器发送查询消息,然后DNS服务器返回响应消息,响应消息中包含所要查询的IP地址,解析器会取出其中的IP地址,将其写入一块指定的内存中。
4,解析器的内部原理
主要就是“控制流程转移”。应用程序调用Socket库中的方法,Socket库中的这个方法调用操作系统内部的协议栈的方法,通过协议栈进行收发消息。
控制流程:应用程序 -> Socket库中的解析器 -> 协议栈 -> 解析器 -> 应用程序。
五、DNS服务器之间的协作
1,DNS服务器的基本工作
DNS服务器的基本工作就是接受来自客户端的查询消息然后作出响应。
客户端的查询消息包含:域名,CLASS,记录类型。
在DNS服务器上会事先保存有上面这三个字段的记录数据,并且有第四个字段,为响应信息。
2,域名的层次结构
举例说明:
www.A.B.com.
其服务器就是在根域下的B域下的A域下,就可以找到目标服务器,客户端向DNS服务器发送查询消息之后,如果最近的DNS服务器中没有所要查询的域名,可以先去根域问问看,然后去B域问问看,顺藤摸瓜就能找到所要查找的域名,得到IP地址。
3,增加效率的办法
DNS服务器有缓存功能,能够“记住”一些查询过的域名的IP地址,当客户端查询这些消息的时候,可以不用从根域开始查找,直接从缓存中找到“答案”,响应客户端的请求。但是域名不存在的信息也会被保存,在一段时间内它可以访问了,但是缓存中的记录是该域名不存在,这会导致一些问题。
六、协议栈
1,什么是协议栈
协议栈(Protocol stack),又称协议堆叠,是计算机网络协议套件的一个具体的软件实现。协议套件中的一个协议通常是只为一个目的而设计的,这样可以使得设计更容易。因为每个协议模块通常都要和上下两个其他协议模块通信,它们通常可以想象成是协议栈中的层。最低级的协议总是描述与硬件的物理交互。每个高级的层次增加更多的特性。用户应用程序只是处理最上层的协议。
七、委托协议栈收发信息
1,协议栈收发信息流程
-------------------------------------------------------
创建套接字
将管道连接到服务器的套接字上
收发数据
断开管道并删除套接字
-------------------------------------------------------
2,创建套接字阶段
在得到目标域名的IP地址之后,调用Socket库中的socket程序组件创建套接字。
套接字有相对应的描述符,应用程序通过描述符来识别套接字。
3,连接阶段
使用Socket库中的connect程序组件完成这一操作,需要如下三个参数:
描述符:connect根据描述符判断使用哪一个套接字去和服务器的套接字进行连接。是应用程序识别套接字的机制。
服务器IP地址。
端口号:让通信的另一端也能识别出套接字的机制,端口号是已经已经指定好的,比如Web服务器是80,电子邮件是25。
4,通信阶段传递消息
同样是Socket库,使用write程序组件进行发送,服务器端响应后,用read程序组件将响应的消息存放到指定的接收缓冲区。
5,断开阶段,收发数据结束
调用Socket库中的close程序组件,连接在套接字之间的通道会断开,套接字本身也会被删除。
Web服务器遵守HTTP协议,在发送完响应消息之后会主动断开连接,浏览器执行read操作的时候,read会告知浏览器连接已经断开,浏览器得到这个消息也会执行close断开连接。
6,HTTP协议工作获取整个网页
HTTP协议将文档和图片都当做单独的对象处理,每一次获取数据都需要进行一次,连接,发送请求消息,接受响应消息,断开连接。如果一个网页中有多张图片或文档,就需要进行多次连接才能得到完整的网页。后来人们设计了能够在一次连接中发送多个请求和响应的方法,在HTTP1.1中就能够使用这种方法。所有数据传输完毕之后浏览器会主动执行断开连接的操作。
八、下一篇主要内容
本篇我们学习了浏览器和Web服务器之间收发数据的过程,但是实际收发信息的是协议栈,网卡和网卡驱动,只有这三者相互配合,数据才能在网络中流动起来。下一篇主要对这些内容进行学习。
--关于本文--
最近参与了一项网络方面的科研,但是自己在此之前对这一领域基本没有了解,无论从哪个方面都需要补一下网络方面的知识。这一系列的内容都属于学习笔记和总结,如果您发现问题同时有空闲时间的话还请指教,
--参考资料--
《网络是怎样连接的》(户根勤著)