HTTP协议
超文本传输协议,规定一次请求一次响应后断开连接,体现了协议的无状态,短链接特性
常见的请求头:
user-agent:获取访问网站的浏览器
content:获取请求的数据格式
超文本传输协议:(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP 请求/响应的步骤
-
客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接
-
发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分 组成。
-
服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
-
释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
-
客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
HTTP请求方法
-
GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,
-
HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
-
POST
向指定资源提交数据,请求服务器进行处理。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
-
PUT
向指定资源位置上传其最新内容。
-
DELETE
请求服务器删除Request-URI所标识的资源。
-
TRACE
回显服务器收到的请求,主要用于测试或诊断。
-
OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
-
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
-
注意点
- 方法名称是区分大小写的
- 当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed)
- 当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)
- HTTP服务器至少应该实现GET和HEAD方法
GET和POST
- GET提交的数据会放在url后,以?分割,多个参数以&相连,提交的数据有大小限制
- POST提交的数据会放在HTTP包的请求体中,提交的数据没有限制
状态码
- 1xx:信息状态码,接受的请求正在处理
- 2xx:成功状态码,请求正常处理完毕
- 3xx:重定向状态码,需要后续操作完成该请求
- 4xx:客户端错误状态码,请求含有词法错误或者无法被执行
- 5xx:服务器错误状态码,服务器在处理某个正确请求时发生错误
URL
基本元素
- 传输协议
- 层级URL标记符(//,固定不变)
- 服务器(域名或ip地址)
- 端口号(HTTP的默认值80可以省略)
- 路径(以/区分路径中的目录名称)
- 查询(GET模式的窗体参数,以?为起点,以&隔开参数,以=分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
- 片段(以#为起点)
HTTP请求格式
HTTP响应格式
缓存机制
缓存的目 的是减少相应延迟 和 减少网络带宽消耗, 比如 css、 js、图片这类静态资源应该进行缓存。
实际项目 一般使用反向代理服务器(如 nginx、 apache 等) 进行缓存。缓存的相关规则会放在header中。
类型
http缓存类型有两种,分别是强缓存和协商缓存,两种缓存分别通过Http报文头部不同的字段进行控制。
强缓存
在http缓存中总共有三个参与角色:浏览器、缓存数据库、服务器,强缓存就是当向服务器请求数据时,如果缓存数据库有这个数据且未过期,就直接使用这个缓存中的数据,不再向服务器发送请求。
当缓存数据库中没有这个数据的缓存或者缓存已过期时,则向服务器发送请求获得数据和缓存规则
强缓存的过期时间由以下两个规则字段控制
Expire:
这个字段指定一个时间,超出这个时间则该缓存会被认定是超时的,但是它本身是一个HTTP1.0标准下的字段,所以如果请求中还有一个置了 max-age 或者 s-max-age”指令的Cache-Control响应头,那么 Expires 就会被忽略。
Cache-Control:
通用消息头用于在http 请求和响应中通过指定指令来实现缓存机制。其常用的几个取值有:
- rivate:客户端可以缓存
- public:客户端和代理服务器都可以缓存
- max-age:缓存有效时间,缓存的内容将在x秒后失效
- s-max-age:同max-age,仅适用于共享缓存,并且私有缓存中忽略。
- no-cache:需要使用协商缓存来验证缓存数据
- no-store:所有内容都不会缓存,强缓存和协商缓存都不会触发
- must-revalidate:缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源。
协商缓存
如果强缓存已过期,或含有must-revalidate标识,就会使用协商缓存的方式去处理缓存文件。
协商缓存会从缓存数据库中取出缓存标识,然后向浏览器发送请求验证缓存数据是否已更新,如果未更新依然使用缓存数据库中的数据,如果已更新则返回更新后的数据
当服务器接收到一个资源请求服务器返回资源的同时,还会发送一个last-modified的http响应头, last-modified响应头的内容值是该资源在服务器上最后修改的时间,另一个etag则为所请求的数据在服务器中的唯一标识。
当第二发送资源请求(缓存已过期), 浏览器在缓存数据库找到了这个资源,但是不能确定服务器是否变更过资源,此时浏览器发送请求的时候,请求头内会附带if-none-match的请求头,这个头部的内容对应上一次etag返回的值,除了这个请求头外还会附带一个if-modified-since的请求头, 这个头部的内容就是上一次last-modified返回的值, 服务器获得这个两个值后会以优先级if-none-match > if-modifind-since的顺序进行判断:
-
如果的etag和if-none-match相等,即所请求的资源没有变化,此时浏览器即可以使用缓存数据库中的数据,此时http的请求状态码为304,请求的资源未变化。
-
如果请求字段中没有if-none-match,就使用if-modified-since来判断。如果if-modified-since的值和所请求的资源时间一致,即所请求的资源相同,浏览器即可以使用缓存数据库中的数据。http状态码304。
-
如果验证文件已修改,则返回修改后的数据,http状态码200。
HTTPS协议
HTTP请求过程中,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,“裸奔”在互联网上,所以很容易遭到黑客的攻击。
由于 HTTP 协议通信的不安全性,所以人们为了防止信息在传输过程中遭到泄漏或者篡改,就想出来对传输通道进行加密的方式 https。https 是一种加密的超文本传输协议,它与 HTTP 在协议差异在于对数据传输的过程中,https 对数据做了完全加密。
原理
1.服务器将自己的公钥签名算法、域名等信息发送给CA机构生成SSL证书这个证书包含:证书的发布机构CA、证书的有效期、公钥、证书所有者、签名等信息。
2.客户端在接受到服务端发来的SSL证书时,会对证书的真伪进行校验:
- 首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验
- 浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
- 验证通过浏览器会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密
- 浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做验证
- 验证通过,则证明服务器发来的证书合法
- 浏览器读取证书中的公钥,用于后续加密了
通过发送SSL证书的形式,既解决了公钥获取问题,又解决了黑客冒充问题,HTTPS加密过程也就此形成