熟悉java的同窗,都知道javaEE当中很大一部分的内容,是WEB开发,那么在进行WEB开发的学习过程中,除了须要学习SpringMVC/STRUTS2等框架之外,咱们还须要对在WEB开发当中经常使用到的协议有所了解,那就是HTTP协议,今天就简单的记录一下本身学习HTTP协议的一些内容吧。文中参考了许多前人写的博客以及本身的一些理解,在文中末尾会进行参考标注。html
首先咱们先大致了解一下什么是HTTP协议,所谓的HTTP协议,全称:超文本传输协议,是用于从WEB服务器传输超文本(各种前端代码,如html等)到本地浏览器的传送协议。它是一个传输层基于TCP的应用层协议,它工做于客户端-服务端架构为上,浏览器(HTTP客户端)经过URL向HTTP服务端(WEB服务器)发送全部请求。Web服务器根据接收到的请求后,向客户端发送响应信息。它主要有如下特色:前端
1.简单快捷:客户端向服务端请求服务的时候,只须要传输请求方法(put、get、post、delete等)和URL便可(有的时候请求当中还须要携带body,这是后话)。因为HTTP协议简单,使得HTTP服务器的程序规模小,于是通讯速度很快。java
2.灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记(若有兴趣知道它能够传输什么类型的内容,能够查询如下Content-Type的类型表格)。浏览器
3.无链接:所谓的无链接,就是说HTTP是一个请求-响应的形式协议,即客户端发起一次请求,服务器相应该请求以后即断开链接。采用这种方式能够节省传输时间。服务器
4.无状态:指协议对于事务处理没有记忆能力。优势是:在服务器不须要先前信息时它的应答就较快。但其缺点也很明显:在缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。架构
在大致了解了HTTP协议的内容和特色,咱们再从细节介绍一下HTTP协议常涉及的一些重点,在特色1当中咱们提到,HTTP只须要传输请求方法和URL便可,那么什么是URL呢?app
HTTP之URL框架
URL全称:统一资源定位符,是互联网上用来标识某一处资源的地址。所谓标识某一处资源地址的意思就是,经过这个URL,咱们能够在互联网上找到这个资源,再形象点好比,这个就至关于快递要寄到家里时,须要查看的寄件地址。那么咱们经过一个例子来看看URL是由哪几个部分组成的。jsp
http://www.mycomputer.com:8080/wellhold/test/index.jsp?name=wellhold
经过这个地址咱们来分析一下一个完整的url是由哪几部分组成的:tcp
协议部分:http
域名部分:www.mycomputer.com,有时候能够是惟一的IP地址表示(实际上域名最后仍是会被DNS映射到IP地址的)
端口号部分:8080
虚拟地址部分:/wellhold/test/,表示能够在上述域名的服务器的这个地址找到该HTTP请求想要的资源
请求文件名:index.jsp,想要的资源名称
参数部分:name=wellhold,请求当中须要携带的参数(参数部分不是必须的)
经过这个例子,就能够看出一个完整的URL主要分为了以上几个部分。
那么了解了URL以后,咱们发如今介绍URL的时候,老是提到一个HTTP请求,那么HTTP请求当中究竟有什么东西了?接下来咱们介绍一下HTTP请求。
HTTP Request(请求)
一个完整的HTTP Request主要包含了如下部分:请求行(request line)、请求头部(header)、空行、请求数据。二话不说,先上一张图:
再经过一个例子来讲明:
POST / HTTP1.1 Host:www.wrox.com User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Content-Type:application/x-www-form-urlencoded Content-Length:40 Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley
第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,而且在每一个请求中自动发送等等
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。
其实也是很简单明了的东西,这里就再也不进行赘述了,接下来咱们再了解了解HTTP当中的response
HTTP RESPONSE(响应)
http的相应也主要是由四个部分组成:状态行、消息报头、空行和正文。
第一行为状态行,(HTTP/1.1)代表HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二行和第三行为消息报头,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
以后接着一行空行
最后接着就是正文。
附:关于http当中的状态码含义
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操做
4xx:客户端错误--请求有语法错误或请求没法实现,400:请求有语法错误、404:资源不存在、401:请求未受权、403:服务器拒绝服务
5xx:服务器端错误--服务器未能实现合法的请求,500:服务器发生错误、503:服务器当前不能提供服务,一段时间后可恢复。
在了解完了HTTP协议的各大要素以后,咱们来看看HTTP协议的具体工做的原理,或者说是流程是怎么样的呢?
HTTP工做原理(流程)
HTTP采用的是请求/响应的模式,客户端向服务器发送一个请求报文(HTTP Request),在这个报文包含了请求行(请求方法、URL、版本号)、请求头部(host、user-agent、content-type、connection)、请求数据(能够没有,在post当中有,在get当中将请求数据写入了url当中)。服务器接受到请求之后,以一个HTTP Response进行响应,响应包括了状态行(版本号、状态码)、响应报头(date、content-type、)以及响应正文(请求的具体资源)。如下是具体的工做步骤:
1.客户端向服务器发起请求:HTTP客户端(一般是浏览器)与WEB服务器的HTTP端口(默认80)创建一个TCP套接字的链接。
2.发送HTTP请求:客户端经过tcp套接字向服务器发送一个HTTP Request
3.服务器响应请求:WEB服务器解析请求后,在服务器当中寻找到相应的要请求的资源,将资源装入HTTP Response,复写到TCP的套接字,由客户端读取。
4.释放TCP链接:若在HTTP Request当中的connection为close,则服务器主动关闭链接;若connection为keepalive,则链接保持一段时间,在该时间内能够继续接受请求。
5.客户端解析响应内容获取资源。