HTTP
HTTP定义
超文本传输协议 HTTP HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议,所有的WWW文件必须遵守
OSI 七层模型
OSI是ISO制定的一个用于标准化计算机或通信系统间互联的标准体系。
OSI.png- 将会话层和表示层、应用层合并为一层,称之为“五层模型”。
- 在五层模型的基础上将物理层和数据链路层合并为一层,称之为四层模型”
HTTP 工作原理
- 地址解析
用客户端浏览器从URL中分解出协议名、主机名、端口、对象路径等部分,需要域名系统DNS解析域名localhost.com,得主机的IP地址。
- 地址解析
- 封装HTTP请求数据包
把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
- 封装HTTP请求数据包
- 封装成TCP包,建立TCP连接([TCP的三次握手]
在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接。
- 封装成TCP包,建立TCP连接([TCP的三次握手]
- 客户机发送请求命令
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可选内容。
- 客户机发送请求命令
- 服务器响应
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
- 服务器响应
-
- 服务器关闭TCP连接([TCP的四次挥手]
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
- 服务器关闭TCP连接([TCP的四次挥手]
URI和URL
URI:统一资源标识符
URL:统一资源定位符
与URI相比我们更熟悉URL,URL是使用浏览器等访问web页面的时候需要输入的网页地址
URI是更通用的资源标识符,URL是它的一个子集
URI由两个主要的子集构成
-
URL:通过描述资源的位置来描述资源
-
URN:通过名字来识别资源,和位置无关
URL
URI 是 Uniform Resource Identifier 的缩写
-
Uniform:规定统一的格式,可方便处理各种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式,加入新的协议方案(HTTP, HTTPS, FTP等)也更容易
-
Resource:资源的定义是“可以标识的任何东西”,除了文档文件、图像或者服务(天气预报)等能够区别于其他类型的,劝都可以称为资源,另外资源不仅可以是单一的,也可以是多数的集合体
-
Identifier:表示可标识的对象,也成为标识符
综上所述,URI就是某个协议方案表示的资源的定位标识符,协议方案是指访问资源所使用的协议类型名称
采用HTTP协议的时候,协议方案就是http,除此之外还有ftp、mailto、file等。
URL 格式
主要由三部分组成
-
方案,也就是我们常说的协议
-
服务器位置
-
资源路径
通用的URL由9部分组成
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<hash>
对于web页面来说最常用的协议就是http
和https
use
r和password
现在不常见了,不会在URL明文书写用户名和密码了,都是通过登录的方式
主机可以是IPO地址过着域名
端口号用来区分主机上的进程,方便找到web服务器,http默认是80
path
是资源的路径,也就是存放位置,不一定和物理路径完全对应,符合web服务器路由约定即可
params
,在一些协议中需要参数来访问资源,例如ftp是二进制还是文本传输,参数是名值对,用;隔开
query
:这个是get请求最常用的传递参数方式了 ?a=1&b=2&=3
hash
也成为片段,设计为标识文档的一部分,很多MVVM框架用作了路由功能
相对URL
相对URL是URL一部分,从路径开始,使用当前文档的设置
./image/logo.png
../script/a.js
/css/main.css
HTTP 协议有几种和服务器交互的方法
GET:获取资源
GET方法用来请求访问已被URL识别的资源
POST:传输实体主体
POST方法用来请求服务器传输信息实体的主体
PUT:传输文件
PUT要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置。
处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法
HEAD:获得报文首部
HEAD和GET方法一样,只不过不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等
DELETE:删除文件
DELETE是与PUT相反的方法,是按请求URI删除指定的资源
处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法
OPYIONS:询问支持的方法
用来查询针对请求URI指定的资源支持的方法
TRACE:追踪路径
是让web服务器端将之前的请求通信还回给客户端的方法发送请求时,在Max-Frowards首部字段中填入数值,每经过一个服务器端就-1,当数值为0时,停止传输,最后收到服务器返回状态码200 OK的响应。
但是,这种方法基本很少使用,而且很容易引起XST(跨站追踪)攻击,就更不会用到了。
CONNECT:要求采用隧道协议连接代理
该方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经过网络传输。
Status Code
完整的 HTTP 1.1规范说明书来自于RFC 2616,HTTP 1.1的状态码被标记为新特性,用来表示请求的结果,状态码被分为五大类:
- 100-199 用于指定客户端应相应的某些动作。
- 200-299 用于表示请求成功。
- 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
- 400-499 用于指出客户端的错误。
- 500-599 用于支持服务器错误。
常见状态码
200
OK 一切正常,对GET和POST请求的应答文档跟在后面。
206
Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)
301
Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
304
Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告 诉客户,原来缓冲的文档还可以继续使用。
404
Not Found 无法找到指定位置的资源。这也是一个常用的应答。
403
Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
500
Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
502
Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
504
Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)
报文
组成
HTTP报文是简单的格式化数据块,每个报文都包含一条来自客户端的请求或者一条来自服务器的响应,由3个部分组成
- 对报文进行描述的起始行 —— start line
- 包含属性的首部块 —— header
- 可选的包含数据的主体部分 —— body
HTTP报文分两类
请求报文
响应报文