HTTP基础知识
一:HTTP简介
HTTP(Hyper Text Transfer Protocol):超文本传输协议
是基于TCP的一种应用层协议,用于客户端(一般为浏览器)和服务器端之间的通信
超文本:是一种文档系统,可将文档中任意位置的信息与其他信息(文本或图片等)建立关联,即超链接文本
1,HTTP版本介绍:
HTTP/1.0:公布于1996年5月;记载于RFC1945
HTTP/1.1:公布于1997年1月;最初标准是RFC2068,最新修订版为RFC2616(1999年) ,是目前主流的版本
HTTP/2.0:未来的标准,正在制定中
2,URI与URL:
URI:Uniform Resource Identifier 统一资源标识符
URI 就是由某个协议方案表示的资源的定位标识符,即在某一规则下能把一个资源独一无二地标识出来(如用ID或路径等)
协议方案是指访问资源所使用的协议类型名称(如http,ftp)
URL:Uniform Resource Locator 统一资源定位符
URL表示资源的地点(路径)
URL 是 URI 的子集
https://docs.python.org/3/library/socket.html?highlight=socket#socket-objects
https | docs.python.org | 80(不写默认为80) | /3/library/socket.html | ?highlight=socket | #socket-objects |
协议方案名 | 服务器地址 | 服务器端口号 | 带层次的文件路径 | 查询字符串 | 片段标识符 |
3,HTTP与Cookie:
HTTP是一种不保存状态,即无状态协议;该协议自身不对请求和响应之间的通信状态进行保存,即不具备保存之前发送过的请求或响应的功能
为了实现保存状态的功能,引入了Cookie技术
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie;当下次客户端再往服务器发送请求时,客户端会自动在请求报文中加入Cookie值发送出去
4,HTTP持久连接:
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接
持久连接:减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载;同时也提高了web页面的显示速度
在HTTP/1.1中,所有的连接默认都是持久连接,Connection: keep-alive
管线化:持久连接使得多数请求以管线化方式发送成为可能;以前发送请求后需等待并收到响应,才能发送下一个请求;管线化技术出现后,不用等待响应亦可直接发送下一个请求,即能够做到同时并行发送多个请求
5,HTTP瓶颈:
例子:当需要推送实时更新内容,此时需要客户端不断向服务器发送确认更新情况的请求,而服务器不管是否有更新,都要把数据全部再发送一次
Ajax的解决方法:只更新局部页面;服务器不需要把数据全部再发送一次,减少了发送的数据量
Comet的解决方法:先将响应置于挂起状态,当服务器有内容更新时,再返回该响应;客户端无需频繁向服务器发送确认更新情况的请求了
SPDY:Google 2010年发布的,其开发目标旨在解决HTTP的性能瓶颈,缩短Web页面的加载时间(50%)
6,HTTP请求方法:
方法名区分大小写,注意要用大写字母
GET | 获取资源,用来请求访问已被URL识别的资源;数据以明文的方式放入URL中,URL的长度有限制 |
HEAD | 获得报文首部;HEAD方法和GET方法一样,只是不返回报文主体部分 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件);数据被包含在请求主体中 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
二:HTTPS
HTTPS:HTTP + SSL 超文本传输安全协议
HTTPS = HTTP + 加密 + 认证 + 完整性保护
SSL:secure socket layer 安全套接层
通信过程:先用SSL建立安全通信线路,然后就可以在这条线路上进行HTTP通信了
和HTTP通信比较,SSL通信部分消耗网络资源,对通信进行加密等处理还会消耗CPU及内存等资源
HTTPS比HTTP要慢2到100倍
因此,非敏感信息使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信
三:HTTP报文
1,报文结构与格式
HTTP报文本身是由多行数据构成的字符串文本
HTTP报文大致可分为报文首部和报文主体两块
请求报文的格式:
响应报文的格式:
2,状态码
状态码告知从服务器端返回的请求结果;可能会出现状态码和状况不一致的情况
2XX 成功
200 OK:请求已成功处理
204 No Content:请求已成功处理,但在返回的响应报文中不含实体的主体部分
206 Partial Content:表示客户端进行了范围请求
3XX 重定向
301 Moved Permanently:永久性重定向,即表示请求的资源已被分配了新的URL
302 Found:临时性重定向
303 See Other:表示由于请求对应的资源存在着另一个URL,应使用GET 方法定向获取请求的资源
304 Not Modified:资源已找到,但未符合条件请求
当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送
4XX 客户端错误
400 Bad Request:表示请求报文中存在语法错误
401 Unauthorized:表示发送的请求需要有通过HTTP认证的认证信息
403 Forbidden:表明对请求资源的访问被服务器拒绝了
404 Not Found:表明服务器上无法找到请求的资源
5XX 服务器错误
500 Internal Server Error:表明服务器端在执行请求时发生了错误
503 Service Unavailable:表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
3,首部字段
HTTP首部字段:是构成HTTP报文的要素之一;起着传递重要信息的作用
4种HTTP首部字段类型:
3.1,通用首部字段
Cache-Control:其指令能操作缓存的工作机制
指令的参数是可选的,多个指令之间通过‘,’分隔
Pragma:是HTTP/1.1之前版本的历史遗留字段;只用在客户端发送的请求中,要求所有的中间服务器不返回缓存的资源
Pragma:no-cache
Connection:控制不再转发给代理的首部字段;管理持久连接
Connection:不再转发的首部字段名 #代理服务器会把该首部字段删除后再转发
管理持久连接:Connection:Keep-Alive;Connection:Close
Date:表明创建HTTP报文的日期和时间
Date: Thu, 24 May 2018 03:06:26 GMT (东八区在此时间上加上8小时)
Trailer:事先说明在报文主体后记录了哪些首部字段;可应用在HTTP/1.1版本分块传输编码时
Transfer-Encoding:规定了传输报文主体时采用的编码方式
Transfer-Encoding:chunked
Upgrade:用于检测HTTP协议及其他协议是否可使用更高的版本进行通信
Via:为了追踪客户端与服务器之间的请求和响应报文的传输路径
报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发
3.2,请求首部字段
Accept:通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
使用type/subtype形式,可一次指定多种媒体类型,用逗号分隔
使用q值来表示权重值,q的范围(0-1),1为最大值;不指定值时默认权重为q=1;用分号进行分隔
Accept-Charset:用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。
可一次性指定多种字符集,可用q值来表示相对优先级
Accept-Encoding:用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序
可一次性指定多种内容编码
gzip、compress、deflate、identity
采用权重q值来表示相对优先级;也可使用星号作为通配符,指定任意的编码格式
Accept-Language:用来告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级
可一次性指定多种自然语言集,采用权重q值来表示相对优先级
Authorization:用来告知服务器,用户代理的认证信息
Expect:告知服务器,期望出现的某种特定行为Host:告知服务器,请求的资源所处的互联网主机名和端口号。
Host首部字段在HTTP/1.1规范内是唯一一个必须包含在请求内的首部字段
If-Match:形如If-xxx这种样式的请求首部字段,都可称为条件请求;服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求If-Match 字段值和 资源ETag值一致时,服务器才会执行请求
If-None-Match:字段值和 资源ETag值不一致时,服务器才会执行请求
If-Modified-Since:用于确认代理或客户端拥有的本地资源的有效性
如果在此字段指定的日期时间后,资源发生了更新,服务器会接受请求
Range:只需获取部分资源的范围请求无法处理该范围请求时,则会返回状态码200 OK的响应及全部资源
Referer:会告知服务器请求的原始资源的URL
User-Agent:会将创建请求的浏览器和用户代理名称等信息传达给服务器
3.3,响应首部字段
Accept-Ranges:告知客户端服务器是否能处理范围请求
Accept-Ranges:bytes; Accept-Ranges:none
Age:告知客户端,源服务器在多久前创建了响应;字段值的单位为妙
代理创建响应时必须加上首部字段Age
ETag:能告知客户端实体标识;是一种可将资源以字符串形式做唯一性标识的方式
当资源更新时,ETag值也会更新
Location:可以将响应接收方引导至某个与请求URL位置不同的资源
配合3xx响应,提供重定向的URL
3.4,实体首部字段
Allow:通知客户端能够支持Request-URL指定资源的所有HTTP方法
Content-Encoding:告知客户端服务器对实体的主体部分选用的内容编码方式。
内容编码是指在不丢失实体信息的前提下所进行的压缩
Content-Language:实体主体使用的自然语言
Content-Length:表明实体主体部分的大小;单位是字节
对实体主体进行内容编码传输时,不能再使用Content-Length首部字段
Content-MD5:是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达
Content-Type:说明了实体主体内对象的媒体类型
Expires:将资源失效的日期告知客户端
Last-Modified:指明资源最终修改的时间
非HTTP/1.1首部字段:Cookie、Set-Cookie、Content-Disposition等