HTTP协议和TCP/IP协议簇内的其它众多协议类似,用于客户端和服务端的数据通信,在一条通信线路上必定有一端是客户端,另一端是服务端。HTTP的全名叫超文本传输协议
,它定义了Web客户端向服务端请求Web的标准方式,同时它也是一个无状态的协议。
HTTP不保存状态,也就是说每当有新的请求发送时,就会有对应的新响应产生,协议本身不会保留之前的请求响应结果。这是为了快速的处理大量事务,确保协议的可伸缩性,特意如此设计。
URI
:统一资源标志符,HTTP协议使用URI进行互联网资源的定位,在客户端请求资源时,URI需要将作为请求报文中包含在内进行资源的定位。
- GET:用来请求访问已被URI识别的资源。
- POST:用来传输请求的实体,虽然GET也能传输,但是通常传输请求实体用POST。
- PUT:传输文件
- HEAD:和GET一样,只是不返回报文主体部分,一般用来确认URI的有效性。
- DELETE:删除资源文件
- OPTIONS:询问支持的方法
- TRACE:追踪路径
- CONNECT:要求用隧道协议链接代理
1.域名解析 (目的:得到服务器IP地址,定位地址)
2.TCP握手 (目的:建立连接状态)
3.发送HTTP请求 (目的:发起请求)
4.响应HTTP请求 (目的:得到资源)
5.TCP挥手 (目的:结束连接状态,此过程和Connection:keep-alive有关,原因详情看下文)
6.浏览器解析/渲染资源展现给用户
为了解决TCP连接频繁的建立和断开的问题,HTTP/1.1和一部分的HTTP/1.0提出了持久化链接的概念,称之为HTTP keep-alive
或HTTP connection reuse
,特点是只要任意一段没有明确提出断开连接,则保持TCP的连接状态。
对于请求来说请求行包含请求服务器的方法,资源URL和HTTP版本信息
对于响应来说响应行包含请求结果的状态码,消息说明和HTTP版本信息
请求头包含请求或响应的各种条件和属性,一般分为4种头部:通用头部,请求头部,响应头部,实体头部:
- 通用首部字段:请求报文和响应报文都会使用的各种头部。
- 请求首部字段:从客户端向服务器发送请求时使用的各种头部。
- 响应首部字段:从服务器向客户端发送响应时使用的各种头部。
- 实体首部字段:在请求/响应的实体部分使用的各种头部。
- **Connection 连接管理:**
1.控制代理服务器不再转发该头部 Connection:Upgrade
2.管理持久连接 Connection:Keep-Alive
表示客户端与服务器的连接是持久连接,这也是HTTP1.0和1.1很大的不同之处。
- Date 创建报文的时间:
Date:Tue,01 Jul 1999 09:09:09 GMT 表示通信双方发送报文的时间。
- Transfer-Encoding 编码方式:
Transfer-Encoding:chunked 表示传输报文主体时采用的编码方式。
- Via 路径追踪:(各个代理服务器会在Via信息中添加自己服务器的元信息)
Via:1.0 gw.hackr.jp(Squid/3.1),1.1 a1 example.com(Squid/2.7) 表示HTTP报文从客户端到目标服务器经过所有的代理或网关,每经过一个代理服务器,Via的信息就会添加追加一条该服务器的元信息。
- Warning 警告:
Warning:[警告码][主机:端口]"[警告内容]"([警告时间]) 表示通信之间的各种警告提示信息。
- **Accept 能接受的格式:**
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
表示客户端告知服务器自己能处理的媒体信息类型,类型之间逗号隔开,q表示权重,不指定权重,默认q=1。
- Accept-Charset 能接受的字符集:
Accept:Charset:iso-8859-1,unicode-1-1;q=0.8 表示客户端告知服务器自己能处理的字符集,q表示字符集间的权重优先级,各种字符集之间逗号隔开。
- Accept-Encoding 能接受的内容编码:
Accept-Encoding:gzip,deflate 表示客户端告知服务器自己处理文件的编码方式,gzip和deflate均是压缩算法格式,q表示权重优先级。
- Accept-Language 能接受的语言:
Accept-Language:zh-cn,zh;q=0.7;en-us,en;q==0.3 表示客户端告知服务器自己能处理的语言,中文或英文等等。
- Authorization 认证信息:
Authorization:Basic wllirSOI64Slsdkhsdf635dg== 表示客户端告知服务器用户代理的认证信息,如果服务器要求该认证信息,而客户端没有传入,则会抛出401错误。
- Host 请求的目标服务器主机名:
Host:www.wangzhicto.com 指明要请求的目标服务器,当某个IP地址下映射了多个域名,转发服务器无法得知客户端要访问哪一个子服务器时,就必须要明确指定时哪一个子服务器。
- Range 请求资源范围:
Range:bytes=1024-2048 表示客户端告知服务器自己所需要的资源的范围,比如客户端需要username.txt文件的第1024-2048字节内容,服务器就无需全部返回。注:范围单位是字节。
- Referer 请求发起来源地址:
Referer:http://www.taobao.com/index.html 表示请求的URL是从哪一个页面发起的。
- User-Agent 客户端信息:
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36 客户端告知服务器自己的基本信息,比如操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
- **Server 服务器信息:**
Server:Apache/2.2.0 (Unix) 表示服务器告知客户端当前服务器上的HTTP服务器应用程序基本信息。
- Accept-Ranges 范围处理:
Accept-Ranges:bytes 告知客户端当前服务器能否处理范围请求,不能处理就返回none
- Location 资源重定向:
Location:http://www.wangchicto2.com/hello.html 表示服务器告知客户端,被请求的资源在另一个地址,希望客户端按照如下地址进行请求,并且返回的状态码为3开头的三位数,比如302重定向。
- Retry-After 服务器维护通知:
Retry-After:Tue,01 Jul 1999 09:09:09 GMT 告知客户端服务器维护到某个时刻以后再来访问。
- Content-Encoding 内容编码方式:
Content-Encoding:gzip
- Content-Language 内容语言:
Content-Language:zh-CN
- Content-Length 内容大小:
Content-Length:1024 表示返回的内容大小,单位:字节。
- Content-Range 内容范围:
Content-Range:1024-2048 表示返回的内容范围。
- Content-Type 实体类型:
Content-Type:text/html;charset=utf-8 表示返回的内容类型格式。
- **Cookie 客户端信息对象:**
Cookie:username=wangzhi 表示客户端告知服务器一些私密信息
HTTP状态码表示服务器返回给客户端的状态,可以大概描述处理的结果情况。HTTP状态码分为5类,分别是1xx,2xx,3xx,4xx,5xx ('xx’表示数字)
1xx:1开头的三位数,表示服务器接收后请求正在处理。
2xx:2开头的三位数,表示服务器正常处理完毕。
3xx:3开头的三位数,表示该请求需要附加操作才能继续完成。
4xx:4开头的三位数,表示服务器无法处理该请求。
5xx:5开头的三位数,表示服务器在处理请求过程中出错。
SPDY
:Google在2010年发布了SPDY,目的是解决HTTP的性能瓶颈,缩短web页面的加载时间。SPDY在会话层介入,控制对数据的流动。当HTTP使用SPDY后,HTTP协议可获得:
- 多路复用流
- 请求优先级
- 压缩HTTP头
- 推送
- 服务器提示
目前主流的HTTP/1.1是自从1999年发布的RFC2616之后再未修改过,IETF组织在2014年11月实现了HTTP/2.0。HTTP/2.0目标是改善用户在使用web时的速度体验。
- 多路复用
- TLS义务化
- 协商
- 客户端拉拽、服务器推送
- 流量控制