浏览器与服务器通信的过程
B/S(Browser/Server)结构就是浏览器/服务器结构,它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。本文将主要讲解浏览器和服务器通信的过程。
浏览器和服务器之间的通讯并不是看上去那么简单,里面还是有着许多的门道的。想要简单理解浏览器和服务器之间的通讯,我们可以打一个简单的比方:
设想我们自己就是浏览器,服务器就是10086语音服务台,我们现在想要和10086服务台取得联系(比如说想骚扰接线员MM),我们该怎么办呢?
当然,大多数人都应该想到,那就是要有部电话。是这样的,这就引出了我们的第一个概念:套接字(Socket)。
套接字在百度百科上的解释是:
多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
这个解释太学术了,我们可以简单把套接字理解成一个电话,我们可以从中发送信息和获取信息。
好了,电话有了,我们该给10086服务台打电话了。等等,我们是不是忘了一点,给10086打电话是不是要保证10086服务台也要有一部电话来等待我们的来电呢?对的,那么就是说服务器端也要有一个套接字,专门接受浏览器的请求。一般当一个服务器启动服务后就会开启一个监听连接的套接字,专门等待浏览器连接,接受浏览器请求。
接下来我们要开始打电话了。大多数人都应该有给10086服务台打电话的经验吧,接通后并不是马上由接线员MM来接听你的电话的,而是根据语音提示选择你想要的服务。当你选择了语音服务以后,系统才会自动给你安排一个接线员MM来接听你的电话。那么这个过程是不是又生成了一个套接字呢?是的,没错,我们可以把呼叫系统(也就是给你语音提示,让你选择服务的系统)当成专门接受浏览器的请求的那个套接字,当浏览器发送了一个请求后系统自动生成一个专门和你的浏览器通信的套接字,这样我们就可以和接线员MM通话了,浏览器也就可以和服务器通信了。
当然这远远不是B/S结构的全部,我们还需要进一步深化:
首先我们想想,我们要和接线员通话是不是要约定一个大家都能听得懂的语言,否则我说中文他说英语,这样就谁也听不懂谁的话,也不会完成通话,那么这个约定的语言是什么呢?那就是HTTP协议。
还是先来看百度百科上的解释:
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
我们就可以把它理解成一种浏览器和服务器都遵循的一种语法规范,所有的信息都是通过这种语法规范传输的,这样浏览器和服务器都可以正确的理解。
浏览器和服务器一般并不是直接连接上的,而是需要通过中间的网络设备,就像我们的声音并不是直接传到接线员的耳朵里,而是要通过电话线通过电波传送一样,浏览器和服务器所发送的遵循HTTP协议的信息也要通过网络设备的传递才能被对方所接收。而这就需要一种在网络设备(网线)上传输数据的一种通用的语法规范(协议)。这样的协议使用最多的有2种:TCP协议和UDP协议
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
不管使用哪种方法,总之这样网络设备间也有了一套传输的协议,这样一来,浏览器和服务器才能真正的实现通信。
下面让我们来看看我们浏览网页的时候发生了什么吧。
1.首先我们在地址栏上输入我们想要打开的网址,然后我们通常会按下回车。这样一个请求就由浏览器以一种满足http协议的请求报文的形式发往服务器,请求报文中包含了要请求的页面地址,请求的文件类型等一系列信息。
2.在请求报文传递至客户端得网络设备的时候,网络设备把请求报文包装在一个满足TCP协议的数据中,通过网线传向服务器的网络设备。
3.服务器的网络设备接收到数据后,使用特殊的算法将数据解译,重新恢复成浏览器发出满足http协议的请求报文的形式,然后传向服务器软件。
4.服务软件得到请求报文后,根据请求报文所请求的页面地址在服务器的数据库中找到相应的页面,然后生成满足http协议的响应报文发向浏览器。响应报文中包括了响应报文头和被请求页面的代码(响应报文体)。
5.同样的,响应报文通过服务器的网络设备,被包装在一个满足TCP协议的数据,通过网线传向客户端的网络设备。
6.客户端的网络设备将响应报文解析,然后传给浏览器软件,浏览器在将响应报文解析,这样我们就在浏览器上看到了想要看到的网页。
以上只是浏览器与服务器之间通信的最简单的形式,实际使用中,一个网页往往包含着html代码,js代码,css样式表,图片等等多种数据,而这些数据并不是一次性由服务器传给浏览器的,而是存在着一定的顺序。首先服务器收到浏览器的请求后会将html代码发给浏览器,浏览器收到响应后会解析响应报文,发现html代码中包含着js代码和css样式表,而浏览器端并没有这些数据,所以浏览器会再次发送请求,向服务器请求js代码或css样式表数据(注意一次只能请求一种类型的数据),服务器收到请求后,会根据浏览器的请求再次找到数据库中的js文件或css样式表,将其发送到浏览器端。当网页中包含图片的时候也是同理。就这样循环往复,经过多次浏览器的请求和服务器的响应,当浏览器发现自己已经有了所有需要的数据后,会停止发送请求,这样一个完整的网页就呈现在我们眼前了。
以上只是浏览器与服务器之间通信的大致过程,要想详细了解其中门道还请各位参考更详细的文章。