JavaWeb之客户端/服务器通信原理

             相信已经有很多人十分了解客户端与服务器之间的通信基本过程了,这里就容小编把近段时间关于这方面的学习做一个归纳。还是那句话,我不是资深专业的技术党,一个俗人就用通俗易懂的方法来诠释我的理解,这里主要讲的是基于http协议的通信机制,所以这里的客户端指的是浏览器,希望给大家新的体验。

一、总结

     一上来就给总结,我相信各位也是醉了,这里我想说的是文章采用总-分-总的组织方式来阐述,先告诉大家结果有助于大家细细的根据自己的理解拆分文章脉络。总结浏览器客户端与服务器的通信,就是“ 浏览器向服务器发送请求,服务器接收到请求之后进行相关处理,最后将结果返回给浏览器”。关于这个结论,本文将从以下几个部分来分别阐述:(1)、 浏览器如何向服务器发送请求????(2)、 服务器接收到请求之后会干些什么????(3)、 浏览器如何接收到服务器传回的数据????(4)、 浏览器接收到数据之后会如何的呈现????围绕以上四个核心问题,我将一个一个介绍涉及的知识体系。

二、什么是网址?

            我们肯定都会敲网址,比如 http://www.sina.com.cn/webApp/xxx.html,这是一个常见的网址,但是你真正了解它吗?有些大神肯定一眼就明白,这里我还是一步步说吧。关于这个网址其实可以拆分为4个部分,分别是第一部分 http://,第二部分 www.sina.com.cn,第三部分 /WebApp,第四部分 /xxx.html
            对于第一部分,叫做协议名称,这里就是HTTP协议啦,具体什么是HTTP协议我会在后面解释。
            对于第二部分,叫做主机名,有经验的人会在我的电脑里键入资源地址来找到对应的文件,那是localhost就是主机名,其实就是对应我们的本机电脑,这在网址里是一样的
            对于第三部分,叫做web应用虚拟映射地址。它指的是我们主机上的web应用有一个本机的物理地址,如D:\XXX\XXX,我们将这个物理地址通过服务器配置得到虚拟路径。
            对于第四部分,叫做资源名称,通常一个web应用里对应有很多的web资源,如html、js、css等,这些资源的名称紧跟web应用路径之后,方便服务器找到对应请求的资源
            所以,当我们往浏览器里键入网址或请求资源的时候,实际上是告诉服务器我们用的是神马协议,我请求的主机名是啥,我要的资源在哪个web应用里,你该如何找到我要的资源等等。这一切告诉了服务器,服务器才勉为其难的帮你去找找看先。说到这,我先提一下关于虚拟路径的事,有很多时候提到服务器配置会不太理解,配置啥呀到底,其实举个例子就容易理解了,这里拿Tomcat服务器为例。Apach-Tomcat是灰常流行的开源服务器,有机会大家一定要试一下。当我们把文件解压之后,可以在conf文件夹中找到一个名为Server.xml的文件,这个文件是记录了有关服务器的所有重要配置信息。打开之后可以找到一个标签<Host></Host>,这个标签对应我们的主机,在这个标签里我们可以进行有关的配置如<Context path="/webApp" docBase="D:\XXXX\XXX" />,path属性记录了虚拟路径而docBase属性则是文件的物理路径,这样我们就实现了一个资源或web应用的服务器配置。
            讲好了虚拟路径,再讲讲主机名,主机名是啥?主机名实际上映射为TCP/IP协议下的IP地址,这个互联网上每台计算机都有的属性,浏览器通过查找主机名的IP地址去寻找对应的目标。浏览器可以通过DNS服务器获取对应主机的IP地址,所以主机必须经过DNS注册得到对应的IP才能够被互联网使用,其实还需要知道一点,查找IP地址的起始入口不是DNS服务器,而是C盘system32下的一个文件,里面预存储了主机名和IP地址的对应关系,浏览器先从当前文件下查找,如果没有发现对应的主机IP,再从DNS下获取。有些邪恶的朋友可以篡改www.baidu.com的IP地址,方法你懂的,这样就可以把百度链接到其他地方了~~~~所以总结主机名是用来寻找IP的,另一个作用是带给服务器,告诉服务器我要的是哪个主机,因为可能有多个主机存在。
            接着之前,当我们将网址送入浏览器之后,浏览器会根据HTTP协议,向服务器发送请求,下面就来讲解下什么是Http协议,这涉及到我们的第一个核心问题:如何向服务器发送请求???

三、HTTP协议

            之前很郁闷的一件事,说的可好听的HTTP协议到底是啥,经过我百般理解,终于特么的明白了:HTTP协议就是一个规范,这个规范就是用于定义客户端与服务器通信的消息格式。说白了,就是你用怎么样的格式给我大服务器发消息它才能看的懂,尼玛的你要是发了一堆P话我哪知道你想干嘛...
            既然知道了HTTP协议就是一种规范格式,那么肯定包括请求的格式与响应的格式,前者用于客户端,后者用于服务器。
            HTTP协议经过1.0和1.1两个版本,前者一次连接只能访问一个web资源,获取之后立即断开连接;后者可以建立一次连接后获得多个web资源。
            这里不深入讲解协议的技术层实现,反正我也不懂,就给大家说下请求和响应的格式内容吧。

   3.1 HTTP请求

            HTTP请求的格式如下所示:

GET /AA/3.jpg HTTP/1.1    <span style="color:#006600;">//请求行</span>
Accept:*/*
Accept-Language:English
Connection:Keep-Alive
Host:localhost
Referer:http://localhost//links.asp
User-Agent:Mozilla/4.0
Accept-Encoding:gzip,deflate
                         <span style="color:#006600;">//空行表示请求结束;</span>
           客户端连接上服务器之后,向服务器寻求某个web资源,被称为客户端向服务器发送了一个HTTP请求。而一个完整的HTTP请求包含三个部分, 请求行,多个请求消息头,以及一个空行表示请求结束
           在请求行的内容中,GET表示请求方法,/AA/3.jpg表示请求的内容,HTTP/1.1是所执行的请求协议与版本号
           多个消息头的具体含义将会另文介绍。
           所以浏览器向服务器请求的过程就是在HTTP协议下,采用固定的规范格式来传递给服务器各种消息,这就是向服务器请求的方式。接下来是HTTP响应:

  3.2 HTTP响应

        HTTP响应的格式如下所示:
HTTP/1.1 200 OK                    <span style="color:#006600;">  //状态行</span>
Server:Microsoft-IIS/5.0
Date:Thu,13,Jul 2000 05:42:34 GMT
Content-Length:2291
Content-Type:text/html
Cache-control:private
...    
                                    <span style="color:#006600;">//空行表示响应消息结束</span>
<HTML>                              <span style="color:#006600;">//紧跟内容</span>
<Body>
...
</Body>
        一个完整的HTTP响应包括状态行,响应消息头,空行以及实体内容四个部分。
        所以服务器接收到HTTP请求之后,会根据请求的相关消息头中的内容,去寻找相关的web资源,如果找到,会执行200~299代码命令,表示成功,当资源不存在会返回404NOT FOUND错误,当资源被重新定位了,会返回304,当响应成功,服务器会执行各个响应消息头,根据请求命令设置响应消息头如内容长度,响应时间,设置返回内容的方式,是否采用压缩等。这就是服务器执行请求后会干的事儿。
       关于第三和第四个问题,实际上都涉及到具体的请求消息头内容和,如如何接收服务器返回的数据,请求消息头中有一项是Accept-Encoding方式,这就告诉了服务器可以以什么 样的编码方式来传回数据,如gzip,服务器就会以gzip压缩方式传回,至于如何呈现返回的数据,则是服务器在响应请求的数据类型之后,将以正确的方式传递回数据,如请求jpg就返回jpg,这期间可能会对数据进行压缩或者二进制的编码,在浏览器得到之后就需要进行解析,从而来呈现数据。

四、三次握手

             其实说到客户端服务器的通信机制,不得不提的就是三次握手了,那么到底什么是三次握手?先请看下面这张图:

           三次握手的具体技术底层细节先不说了,这里就粗浅的介绍下大致的流程:
           第一次握手:客户端小明想要一颗糖,就问服务器老师说:给我一颗糖好吗?此时是小明主动提出交涉,发送SYN信息,所以小明进入了SYN_SEND状态;
           第二次握手:服务器老师接收到了小明的请求,拿出一颗糖,她需要确认下是不是小明真要糖,所以她向小明发送了SYN_ACT消息,老师进入了SYN_RECV状态;
           第三次握手:小明收到了老师的确认消息,心想,老师真小心啊,我还是确认下吧,于是回复了ACT消息,双方从此建立了连接,进入了ESTABLISH状态。
           所以总结就是:客户端主动伸出两次手来握手,分别发送SYN和ACT消息,服务器主动伸出一次手,发送SYN_ACT消息,双方经历了SYN_SENT  、SYN_RECV、 ESTABLISH三个状态。三次握手建立在向服务器请求层面上,所以发送时段最靠前。

五、图解HTTP请求与响应

           下面将以图解的形式来为大家呈现最终的HTTP请求与响应模式,希望大家能理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值