URL即统一资源定位符(Uniform Resource Locator),用来唯一地标识万维网中的某一文档。URL有协议、主机和端口(默认为80)以及文件名三部分构成。

HTTP的工作原理
HTTP协议的主要特点
- 支持C/S(客户/服务器)模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。


1.通过请求和响应的交换达成通信
应用 HTTP 协议时,必定是一端担任客户端角色,另一端担任服务器端角色。仅从一条通信线路来说,服务器端和客服端的角色是确定的。HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
2.HTTP是不保存状态的协议
HTTP是一种无状态协议。协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
可是随着 Web 的不断发展,我们的很多业务都需要对通信状态进行保存。于是我们引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
3.使用 Cookie 的状态管理
Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。Cookie 的流程如下图
4.请求 URI 定位资源
HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。
5.告知服务器意图的 HTTP 方法(HTTP/1.1),HTTP 方法如下图

6.持久连接
HTTP 协议的初始版本中,每进行一个 HTTP 通信都要断开一次 TCP 连接。比如使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无畏的 TCP 连接建立和断开,增加通信量的开销。
为了解决上述 TCP 连接的问题,HTTP/1.1 和部分 HTTP/1.0 想出了持久连接的方法。其特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。旨在建立一次 TCP 连接后进行多次请求和响应的交互。在 HTTP/1.1 中,所有的连接默认都是持久连接。
7.管线化
持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并接收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
比如,当请求一个包含多张图片的 HTML 页面时,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术要比持久连接速度更快。请求数越多,时间差就越明显。
HTTP协议结构
HTTP消息分为请求消息(Response)和响应消息(Request)两类。
请求报文和响应报文都是由以下4部分组成:请求行、请求头、空行、消息主体。

请求报文(Request)
请求报文的类型是由它所采用的方法决定的。
请求行有3个字段:方法字段、URL字段、HTTP版本字段。

响应报文(Response)
状态行有3个字段:HTTP版本字段、状态码字段及解释状态字段的短语。

request消息结构和respone消息结构
- Request消息分为3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之间有个空行;
- respone消息分为3部分,第一部分叫Response line, 第二部分叫Response header,第三部分是body. header和body之间也有个空行

HTTP请求方法
HTTP请求方法有8种(所有方法全为大写),分别是GET、POST、DELETE、PUT、HEAD、TRACE、CONNECT 、OPTIONS。其中PUT、DELETE、POST、GET分别对应着增删改查,对于移动开发最常用的就是POST和GET了。
- GET:查,请求获取一个Web页面,GET请求会附在URL之后,就是把数据放置在HTTP协议头中,以?分隔URL和传输数据,参数之间以&相连,空格转换为+,中文字符改为该符号以16进制表示的ASCII
- POST:改,一般用于更新资源信息,POST把提交的数据放置在HTTP包的包体中,POST的安全性比GET要高。通过GET提交数据,用户名密码将明文出现在URL上
- HEAD:请求读取一个Web页面的首部。
- PUT: 增,请求服务器存储一个Web页面
- DELETE :删,请求服务器删除Web页面
- TRACE : 请求服务器送回收到的请求信息,主要用于测试或诊断
- CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器,用于代理服务器
- OPTIONS :请求查询服务器的性能,或者查询与资源相关的选项和需求,查询特定选项

通用报头
既可以出现在请求报头,也可以出现在响应报头中
Date:表示消息产生的日期和时间
Connection:指定该次请求回应结束后,如何处理连接,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接
Cache-Control:指定请求和响应遵循的缓存机制;缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)HTTP1.0 使用的类似 的报头域为 Pragma。
- 请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存 )、no-store、max-age、 max-stale、min-fresh、only-if-cached;
- 响应时的缓存指令包括: public 、 private 、 no-cache 、 no-store 、 no-transform 、 must-revalidate、proxy-revalidate、max-age、s-maxage.
- eg:为了指示 IE 浏览器(客户端)不要缓存页面,服务器端的 JSP 程序可以编写如下: response.sehHeader("Cache-Control","no-cache");
- //response.setHeader("Pragma","no-cache"); 作用相当于上述代码,通常两者 //合用 这句代码将在发送的响应消息中设置普通报头域: Cache-Control:no-cache
请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
- Host:服务器的DNS名称 ,它通常从 HTTP URL中提取出来的,必需
- User-Agent:关于浏览器和它的平台的信息,如Mozilla5.0
- Accept:客户端能处理的页面类型,如text/html。eg:Accept:image/gif,表明客户端希望接受 GIF 图象格式的资源;Accept:text/html,表明客户端希望接受 html 文本。
- Accept-Charset:客户端可以接受的字符集,如Unicode-1-1。 eg :Accept-Charset:iso-8859-1,gb2312. 如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
- Accept-Encoding:客户端能处理的页面编码方法,如gzip。eg: Accept-Encoding:gzip.deflate. 如果请求消息中没有设置这个域服务器假定客户端对各种内容编 码都可以接受。
- Accept-Language:客户端能处理的自然语言,如en(英语),zh-en(简体中文)。 eg: Accept-Language:zh-cn.如果请求消息中没有设置这个报头域 ,服务器假定客户端对各种语言都可以 接受。
- Authorization:客户的信息凭据列表。当浏览器访问一个页面时 ,如 果收到服务器的响应代码为 401(未授权),可以发送一个包含 Authorization 请求报头域的请求,要 求服务器对其进行验证。
- Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。
- Cookie:将以前设置的Cookie送回服务器,可用来作为会话信息。
响应报头
用于服务器传递自身信息的响应,常见的响应报头:
- Location:指示客户将请求发送给别处,即重定向到另一个URL,常用在更换域名的时候
- Server:关于服务器的信息,如Microsoft-IIS/6.0,与User-Agent请求报头是相对应的
- WWW-Authenticate:响应报头域必须被包含在 401(未授权的)响应消息中,客户端收到 401 响应消息时候,并发送 Authorization 报头域请求服务器对其进行验证时 ,服务端响应报头就包含该报头域 。
- Set-Cookie:服务器希望客户保存一个Cookie
实体报头
请求和响应消息都可以传送一个实体,常见的实体报头为:
- Content-Type:页面的媒体类型MIME,如image/png , text/html
- Content-Lenght:以字节计算实体正文的长度
- Content-Language:页面所使用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读
- Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding 这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
- Last-Modified:实体报头用于指示资源的最后修改日期和时间,在页面缓存机制中意义重大。
- Expires 实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时 ,直接从缓存中加载 ,缩短响应时间和降低服务器负载 )的页面,我们 可以使用 Expires 实体报头域指定页面过期的时间。
本文详细介绍了HTTP协议的工作原理,包括其主要特点:无连接、无状态、灵活等。HTTP通过请求和响应的交换进行通信,使用Cookie进行状态管理。文章还深入解析了HTTP的请求方法、通用报头、请求报头、响应报头以及实体报头,以及GET和POST的区别。
2095

被折叠的 条评论
为什么被折叠?



