1.引言
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
2.HTTP协议介绍
1.HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
2.HTTP是基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
3.HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图http/https
4.HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
5.HTTP默认的端口号为80,HTTPS默认的端口号为443。
3.HTTP协议工作流程
一次HTTP操作称为一个事务,其工作过程大概如下:
1.用户在浏览器中键入需要访问网页的URL或者点击某个网页中链接;
2.浏览器根据URL中的域名,通过DNS解析出目标网页的IP地址;
浏览器请求这个页面:http://hackr.ip/index.html。
在这一步,需要域名系统DNS解析域名hackr.ip,得主机的IP地址 20X.189.105.112。
然后将上面结合本机自己的信息,封装成一个http请求数据包。
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的
HTTP协议是一种文本协议,所以,它的格式也非常简单。HTTP GET请求的格式:
GET /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
每个Header一行一个,换行符是\r\n。
HTTP POST请求的格式:
POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
body data goes here...
当遇到连续两个\r\n时,Header部分结束,后面的数据全部是Body。
HTTP响应的格式:
200 OK
Header1: Value1
Header2: Value2
Header3: Value3
body data goes here...
HTTP响应如果包含body,也是通过\r\n\r\n来分隔的。请再次注意,Body的数据类型由Content-Type头来确定,如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据。
3.在HTTP开始工作前,客户端首先会通过TCP/IP协议来和服务端建立链接(TCP三次握手)
4.建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
5.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
6.一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
3.1短连接
短连接的操作步骤是:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。
3.2 长链接
长链接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
长链接操作步骤:建立连接——数据传输…(保持连接)…数据传输——关闭连接
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
长链接分为 without pipelining 和 with pipelining,下图中是without pipelining,客户端只在收到前一个请求的响应后,才发出新的请求。
下图是with pipelining,每次建立链接后无需等待请求回来就可以发送下一个请求。
4.HTTP请求报文
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、请求体组成,下图给出了请求报文的一般格式。
请求行:
方法:
GET 获取资源
POST 向服务器端发送数据,传输实体主体
PUT 传输文件
HEAD 获取报文首部
DELETE 删除文件
OPTIONS 询问支持的方法
TRACE 追踪路径
协议/版本号
URL
请求头:
通用首部(General Header)
请求首部(Request Header)
响应首部(Response Header)
实体首部(Entity Header Fields)
请求体
请求报文拆解:
4.1GET请求
4.2POST请求
5.HTTP响应报文
HTTP响应组成:响应行、响应头、响应体。
响应行
(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
响应头
Date:生成响应的日期和时间;
Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1
响应体
响应报文拆解:
6.HTTP状态码
2XX 成功:
200(OK 客户端发过来的数据被正常处理
204(Not Content 正常响应,没有实体
206(Partial Content 范围请求,返回部分数据,响应报文中由Content-Range指定实体内容
3XX 重定向:
301(Moved Permanently) 永久重定向
302(Found) 临时重定向,规范要求,方法名不变,但是都会改变
303(See Other) 和302类似,但必须用GET方法
304(Not Modified) 状态未改变, 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
307(Temporary Redirect) 临时重定向,不该改变请求方法
4XX 客户端错误:
400(Bad Request) 请求报文语法错误
401 (unauthorized) 需要认证
403(Forbidden) 服务器拒绝访问对应的资源
404(Not Found) 服务器上无法找到资源
5XX 服务器端错误:
500(Internal Server Error)服务器故障
503(Service Unavailable) 服务器处于超负载或正在停机维护
7.首部字段
7.1通用首部字段
7.2请求首部字段
7.3响应首部字段
7.4实体首部字段