HTTP协议详解
Contents
HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于(事实上)TCP的连接方式。
HTTP协议工作流程
在OSI网络七层模型中,HTTP在应用层基于TCP协议,而HTTPS协议则是同处于应用层但是基于TLS、SSL协议之上。此外HTTP默认端口号为80,HTTPS的默认端口号为443。
由于HTTP是基于TCP协议,而TCP为一个端到端的面向连接的协议。所以HTTP在开始传输之前需要建立TCP连接,而建立连接的过程则需要进行三次握手。在HTTP1.1中默认在HTTP传输完成后不断开TCP连接,在此之前默认断开连接,即同一客户端的这一次请求和上一次请求之间没有对应关系。
一次HTTP操作为一个事务,其工作主要为以下四步骤:
- 客户端和服务端建立连接,如单击某个超链接输入某个网址
- 建立连接后,客户端发送一个请求给服务端。请求格式为:url(统一资源标识符)、协议版本号、MIME信息(请求修饰符、客户端信息和可能的内容)。
- 服务端收到信息后,给予响应信息,响应格式为:一个状态行,包括信息的协议版本号、一个成功或者错误的代码以及MIME信息(包括服务器信息、实体信息和可能的内容)。
- 客户端收到服务端的响应信息后,通过浏览器显示在用户显示屏上,然后客户端与服务端断开。
HTTP协议永远都是客户端发起请求,服务器回送响应。
HTTP协议结构
请求报文
HTTP协议无论是请求报文还是回应报文,都分为一下四个部分:
- 1. 请求行(报文头)
请求行由请求方法字段、URL 字段和 HTTP 协议版本字段 3 个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP 协议的请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
协议版本的格式为:HTTP / 主版本号. 次版本号,常用的有 HTTP/1.0 和 HTTP/1.1。
- 2. 请求头部(0个或者多个)
请求头部由关键字 / 值对组成,每行一对,关键字和值用英文冒号 “:” 分隔。请求头部通知服务器有关于客户端请求的信息。常见请求头如下:
Host 接受请求的服务器地址,可以是 IP: 端口号,也可以是域名
User-Agent 发送请求的应用程序名称
Connection 指定与连接相关的属性,如 Connection:Keep-Alive
Accept-Charset 通知服务端可以发送的编码格式
Accept-Encoding 通知服务端可以发送的数据压缩格式
Accept-Language 通知服务端可以发送的语言
- 3. 空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头,作为请求头的结束。
- 4. 请求数据
请求数据不在 GET 方法中使用,而是在 POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length。
HTTP协议是基于行的协议,每一行以\r\n作为分隔符。报文头通常表明报文类型(如请求类型),且报文头只占一行;请求头附带一些特殊信息,每一个请求头占一行,其格式为name:value,以分号(;)作为分隔。空行就以一个\r\n分隔;可选的消息体(body)通常包含数据。
- 响应报文
- 1. 状态行
状态行由 3 部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔。状态代码为 3 位数字,200~299 的状态码表示成功,300~399 的状态码指资源重定向,400~499 的状态码指客户端请求出错,500~599 的状态码指服务端出错(HTTP/1.1 向协议中引入了信息性状态码,范围为 100~199)。这里列举几个常见的:
200:响应成功
302:跳转,跳转地址通过响应头中的 Location 属性指定(JSP 中 Forward 和 Redirect 之间的区别)
400:客户端请求有语法错误,不能被服务器识别
403:服务器接收到请求,但是拒绝提供服务(认证失败)
404:请求资源不存在
500:服务器内部错误
- 2. 响应头部
与请求头部类似,为响应报文添加了一些附加信息。常见响应头部如下:
Server:服务器应用程序软件的名称和版本
Content-Type:响应正文的类型(是图片还是二进制字符串)
Content-Length:响应正文长度
Content-Charset:响应正文使用的编码
Content-Encoding:响应正文使用的数据压缩格式
Content-Language:响应正文使用的语言
- 3. 空行
作为响应头的结束
- 4. 响应数据
HTTP协议规定的方法
GET
获取资源。当客户端要从服务器中读取文档时,使用 GET 方法。GET 方法要求服务器将 URL 定位的资源放在响应报文的数据部分,回送给客户端。使用 GET 方法时,请求参数和对应的值附加在 URL 后面,利用一个问号(“?”)代表 URL 的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。POST
传输实体。当客户端给服务器提供信息较多时可以使用 POST 方法。POST 方法将请求参数封装在 HTTP 请求数据中,以名称 / 值的形式出现,可以传输大量数据。
- GET和POST请求都能够使用额外的参数,但是GET的参数是以查询字符串出现在URL中,而POST的参数存储在实体主体部分。
- GET的传参方式相比于POST安全性较差,应为GET传的参数在URL是可见的,可能会泄露私密信息。并且GET只支持ASCII字符,如果参数为中文则可能出现乱码,而POST支持标准字符集。
- GET方法用于信息获取,它是安全的(安全:指非修改信息,如数据库方面的信息),而POST方法是用于修改服务器上资源的请求;
- GET方法传输的数据量一般限制在2KB,其原因在于:GET是通过URL提交数据,而URL本身对于数据没有限制,但是不同的浏览器对于URL是有限制的,比如IE浏览器对于URL的限制为2KB,而Chrome,FireFox浏览器理论上对于URL是没有限制的,它真正的限制取决于操作系统本身;POST方法对于数据大小是无限制的,真正影响到数据大小的是服务器处理程序的能力。
HEAD
获取报文首部,和GET方法一样,但是不返回报文实体的主体部分,主要用于确认URL的有效性以及资源更新的日期等。PUT
上传文件,由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般WEB网站不使用此方法。DELETE
与PUT方法相反,并且同样不带验证机制。OPTIONS
查询支持的方法 >查询指定的URL能够支持的方法,会返回类似一下形式的内容1
Allow: GET, POST, HEAD, OPTIONS
TRACE
追踪路径。服务器会将通信路径返回给客户端,在发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器就会减一,当数值为零时就停止传输。CONNECT
要求用隧道协议连接代理。CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。