网络是怎样连接的—1.浏览器生成消息

一、网址

1,什么是网址

  网址,准确地讲叫URL(Uniform Resource Locator)即统一资源定位符,其直观的表现形式就是浏览器中以“http:”,“ftp:”,“file:”,“maito:”开头的一串字符。访问不同的服务器的时候就会用到不同的开头,如访问Web服务器的时候就需要使用“http:”开头,访问FTP服务器的时候就会用到“ftp:”的URL开头。

  网址的格式,以访问Web服务器为例一般为

  http://user:[email protected]: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服务器之间收发数据的过程,但是实际收发信息的是协议栈,网卡和网卡驱动,只有这三者相互配合,数据才能在网络中流动起来。下一篇主要对这些内容进行学习。

--关于本文--

最近参与了一项网络方面的科研,但是自己在此之前对这一领域基本没有了解,无论从哪个方面都需要补一下网络方面的知识。这一系列的内容都属于学习笔记和总结,如果您发现问题同时有空闲时间的话还请指教,

--参考资料--

《网络是怎样连接的》(户根勤著)

猜你喜欢

转载自www.cnblogs.com/cupkjgp/p/how-networks-work-1.html
今日推荐