HTTP协议简介
关于HTTP协议的基本介绍。
HTTP协议是基于TCP/IP协议之上的应⽤层协议,主要⽤于规定互使⽤联⽹中客户端和服务器之间的通信格式,不关⼼具体传输细节,默认80端⼝。对于Web开发,不管是前端还是后端开发,了解HTTP协议是必备的⼀些基本知识。
发展历程
HTTP/0.9
于1991年发布,只有⼀个GET命令,返回HTML格式内容。
HTTP/1.0
于1996年5⽉发布,增加POST、HEAD命令,传输内容可以说任意格式,不再仅限于HTML,并且报⽂规定了⼀些元数据字段,⽐如字符集、状态码、编码、缓存等。
HTTP/1.1
于1997年1⽉发布,增加PUT\PATCH\DELETE等命令,并新增了⼀些功能机制:
持久连接(keep-alive可保持长连接,减少重复请求)。
管道机制(pipelining,⼀个TCP连接中客户端可同时发送多个请求)。Content-Length字段(报⽂内容长度)。
Host字段(⽤于指定服务器域名,可以将请求发往同⼀台服务器的不同站点)。1.1版本基本完善了HTTP协议,并且⼀直使⽤⾄今仍然是⽬前最流⾏的版本。
SPDY
于2009年由⾕歌研发,使⽤多种新特性提⾼HTTP/1.1版本效率不⾼的问题。作为HTTP/2版本草案,在HTTP/2发布后已停⽌使⽤。
HTTP/2
于2015年发布,基于⾕歌的SPDY协议之上进⾏了⼩部分修改。主要有以下特点:
⼆进制协议(HTTP/1.1版本头信息使⽤⽂本格式,数据体可以是⽂本或⼆进制格式,⽽HTTP/2版本则全部使⽤⼆进制格式,⽅便将来扩展)。
多⼯传输(复⽤TCP连接,双向实时通信,客户端服务器可同时发送多个请求和响应,并且不需要按照请求顺序回应,避免队头阻塞问题)。
头信息压缩(HTTP协议是⽆状态的,因此很多请求都需要带上Cookie、User Agent等重复字段,影响效率。HTTP/2使⽤gzip、compress等算法压缩头信息后,并且在客户端和服务器都维护⼀张头信息表,记录这些字段,从⽽提⾼速度)。
SSL/TLS
由于HTTP通信是全明⽂传输的,很多敏感信息容易被窃取。⽹景公司(Netspace),发明了SSL协议,⽤于对HTTP传输的内容进⾏安全加密。后来互联⽹标准化组织IETF将SSL推⼴并重新命名为TLS协议,所以SSL和TLS基本是⼀个东西。
HTTPS
HTTPS = HTTP + SSL/TLS,可进⾏加密传输、⾝份认证,默认443端⼝,需要使⽤CA证书,免费证书较少,需交费。HTTPS有以下⼏个特点:
(1)所有信息都是加密传播,⿊客⽆法窃听。
(2)具有校验机制,⼀旦被篡改,通信双⽅会⽴刻发现。
(3)配备⾝份证书,防⽌⾝份被冒充。
QUIC
由⾕歌制定的基于UDP的⼀种传输层协议,QUIC协议集成了TCP可靠传输机制、TLS安全加密、HTTP /2 多路并发流量复⽤技术。
协议特点
由于⽬前HTTP/2还没有⼴泛使⽤,HTTP/1.1仍旧是⽬前使⽤最⼴泛的版本,所以后⾯主要介绍HTTP/1.1版本的基本知识。没有特指的情况下HTTP即为HTTP/1.1版本。
HTTP的主要特点有以下⼏点:
1. 基于TCP协议:HTTP协议⽬的是规定客户端和服务端数据传输的格式和数据交互⾏为,并不负责数据传输的细节。底层是基于TCP
实现的。
2. ⽆状态连接:HTTP协议本⾝不对请求和响应之间的通信状态进⾏保存。
3. 多次请求:由于管道机制可实现⼀次TCP连接同时多个HTTP请求。客户端请求服务器时先响应HTML,再请求加载CSS,JS,图⽚等
资源。
4. 持久连接:当TCP连接建⽴后,只要任意⼀端没有明确提出断开连接,则保持TCP连接状态。减少TCP重复建⽴和断开的开销及服务
器端的负载。
5. 使⽤Cookie和Session机制管理状态:为了实现保存通信状态,引⼊了Cookie和Session技术。⽐如⽤户登录⽹站跳转到其他页⾯能够
保存⽤户状态,⽽不需要重新登录。
6. 全明⽂传输: 报⽂数据不加密(这⼀⽅⾯从某种意义上也⽅便了开发⼈员调试bug),敏感信息易泄露。可通过在代码上使⽤SSL/TLS
协议改造系统,加密请求响应报⽂,需调试可将报⽂解密后保存到⽇志中进⾏问题排查。
7. 内容编码: 由于某些报⽂的内容过⼤,因此在传输时,为了减少传输的时间,会采取⼀些压缩的措施。
8. 范围请求: 当客户端请求的数据内容过⼤时,⽐如请求⼀张很⼤的图⽚,会发现有时候图⽚是⼀块⼀块加载的。这就是因为设置了http
请求的长度,这样就可以分块的加载资源⽂件。在请求报⽂中使⽤Range属性,在响应报⽂中使⽤Content-Type属性都可以指定⼀定字节范围的http请求。
9. 多部分对象集合: 报⽂传输的内容,不仅仅是⼀些字符串,还有可能是⼀些图⽚,字符,⾳乐⼆进制等混杂的内容。这就需要使⽤多部
分对象集合,multipart。默认的情况下form使⽤的编码格式是:applicatin/x-www-form-urlencoded,这种编码格式会把所有的内容进⾏编码,不适合上传⽂件这种情况。multipart/form-data 会以控件为基准,编码form中的内容。application/x-www-form-urlencoded 会把form中的内容编码成键值对的形式。
HTTP报⽂
HTTP报⽂可以分为请求报⽂、响应报⽂。每个报⽂⼜包含三个部分⾸⾏、头部和主体。报⽂主体可有
可⽆。
GET www.baidu HTTP/1.1
请求报⽂的⾸⾏叫请求⾏,包括请求⽅法、URL和HTTP版本。
HTTP/1.1 200 OK
响应报⽂的⾸⾏叫状态⾏,包括HTTP版本,状态码和简短原因,其中原因可有可⽆。
头部的各种协议字段通过键值对来保存,主体保存具体内容。⾸⾏、头部和主体以及头部的各项字段⽤回车换⾏(\r\n)分割,另外头部和主体之间多⼀个空⾏,也就是有两个连续的回车换⾏。
请求⽅法
请求⽅法是客户端⽤来告知服务端其操作意图的⼀个命令。常⽤的主要有GET、POST⽅法。其他⽅法不常⽤了解⼀下即可。下⾯是⼏种⽅法的说明:
1. GET:⽤于获取资源。
2. POST:⽤于传输实体主体。
3. PUT:⽤于传输⽂件。PUT⽅法⽤来传输⽂件。类似FTP协议,⽂件内容包含在请求报⽂的实体中,然后请求保存到URL指定的服务
器位置。
4. HEAD:获取报⽂⾸部。HEAD⽅法类似GET⽅法,但是不同的是HEAD⽅法不要求返回数据。⽤于确认URI的有效性及资源更新时间
等。
5. DELETE:⽤于删除⽂件。DELETE⽅法⽤来删除⽂件,是与PUT相反的⽅法。DELETE是要求返回URL指定的资源。
6. OPTIONS:⽤于询问服务器⽀持的请求⽅法。OPTIONS ⽅法⽤来查询针对请求 URI 指定的资源⽀持的⽅法。有些服务器为了安全考
虑会将PUT、DELETE⽅法禁⽤,这时可以先⽤OPTIONS查询⽀持的⽅法。
7. TRACE:追踪路径。TRACE⽅法是让Web服务器将之前的请求通信环回给客户端的⽅法。这个⽅法并不常⽤。
8. CONNECT:要求⽤隧道协议连接代理。CONNECT⽅法要求在与代理服务器通信时建⽴隧道,实现⽤隧道协议进⾏TCP通信。主要
使⽤SSL/TLS协议对通信内容加密后传输。
响应状态码
状态码是服务器⽤来告知客户端处理请求的结果。凭借状态码⽤户可以知道服务器是请求处理成功、失败或者是被转发;这样出现了错误也好定位。状态码是由3位数字加原因短语组成。3位数字中的第⼀位是⽤来指定状态的类别。共有5种类型:
状态码⼀共有60多种,经常使⽤的⼤概就是16种,其中加粗为最常见的情况:
200: OK 表⽰请求处理成功。
204: No Content 表⽰请求处理成功,但没有数据实体返回。
206: Partial Content 表⽰客户端指定请求范围,服务器成功执⾏了这部分的GET请求。响应报⽂中包含由请求头Content-Range指定
范围的实体内容。
301: Moved Permanently 代表永久性定向。该状态码表⽰请求的资源已经被分配了新的URL,以后应
该使⽤资源现在指定的URL。也就是说如果已经把资源对应的URL保存为书签了,这是应该按照Location⾸部字段提⽰的URL重新保存。
url编码处理302: Found 代表临时重定向。该状态码表⽰请求的资源已经被分配了新的URL,但是和301的区别是302代表的不是永久性的移动,只是临时的。就是说这个URL还可能会发⽣改变。如果保存成书签了也不会更新。
303: See Other 和302的区别是303明确规定客户端应当使⽤GET⽅法。当 301、302、303 响应状态码返回时,⼏乎所有的浏览器都会把
POST 改成 GET,并删除请求报⽂内的主体,之后请求会⾃动再次
发送。301、302 标准是禁⽌将 POST ⽅法改变成 GET ⽅法的,但实际使
⽤时⼤家都会这么做。
304: Not Modified 表⽰客户端发送附带条件请求时,服务器端允许请求访问资源,但是没有满⾜条件。304状态码返回时不包含任何数据实体。304虽然被划分在3XX中但是和重定向没有关系。
307: Temporary Redirect 临时重定向,与302 Found相同,但是302会把POST改成GET,⽽307就不会。
400: Bad Request 表⽰请求报⽂中存在语法错误。需要修改后再次发送。
401: Unauthorized 表⽰发⽣的请求需要有通过HTTP认证的认证信息。
403: Forbidden 表⽰请求访问资源被拒绝了。没有获得服务器的访问权限,IP被禁⽌等。
404: Not Found 表⽰请求的资源在服务器上不到。当然也可以在服务器拒绝请求且不想说明理由时使⽤。
408: Request Timeout 表⽰客户端请求超时。就是在客户端和服务器建⽴连接后服务器在⼀定时间内没有收到客户端的请求。
500: Internal Server Error 表明服务器端在执⾏请求时发⽣了错误,很有可能是服务端程序的Bug或者临时故障。
503: Service Unavaliable 表明服务器暂时处于超负载或正在进⾏停机维护,现在⽆法处理请求。如果事先得知解除以上状况需要的时间,最好写⼊Retry-After字段再返回给客户端。
504: Gateway Timeout 表⽰⽹关超时,是代理服务器等待应⽤服务器响应时的超时,和408 Request Timeout的却别就是504是服务器的原因⽽不是客户端的原因。
不少返回的状态码响应都是错误的,但是⽤户可能察觉不到这点。
⽐如 Web 应⽤程序内部发⽣错误,状态码依然返回 200 OK,这种
情况也经常遇到。这时可查看相近的⼏次请求信息。
更多状态码的详细介绍请参考:
HTTP⾸部字段
HTTP⾸部字段是构成HTTP报⽂最重要的元素之⼀。在客户端与服务端之前进⾏信息传递的时候请求和响应都会使⽤⾸部字段,会传递⼀些重要的元信息。⾸部字段是以键值对的形式存在的。包含报⽂的主体⼤⼩、语⾔、认证信息等。HTTP⾸部字段包含4种类型:通⽤⾸部字段(General Header Fields)代表请求报⽂和响应报⽂都会使⽤的字段。
请求⾸部字段(Request Header Fields)是客户端向服务端发送请求时使⽤的⾸部字段。包含请求的附加内容、客户端信息、响应内容相关优先级等信息。
响应⾸部字段(Response Header Fields)是服务端向客户端返回响应时使⽤的⾸部字段,包含响应的附加内容,可能也会要求客户端附加额外的内容信息。
实体⾸部字段(Entity Header Fields)是针对请求报⽂和响应报⽂的实体部分使⽤的⾸部。包含资源内容更新时间等和实体有关的信息。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论