【计算机网络】你真的了解HTTP(HTTPS)协议的这12个知识点吗

HTTP协议

1. 介绍一下OSI七层参考模型和TCP/IP五层模型

1.1 OSI七层模型

OSI七层参考模型

1.2 TCP/IP五层模型

TCP/IP五层模型

1.3 各层的设备

[各层设备]php

1.4 各层对应协议

各层协议

2. HTTP协议和特色

2.1 基本概念

[!NOTE]
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。html

2.2 数据包结构

数据包

数据包细节web

详细信息

2.3 协议的特色

  1. 无链接(重点理解)
  • 限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。
  1. 无状态
  • 协议对于事务处理没有记忆能力。
  1. 简单快速
  • 客户向服务器请求服务时,只需传送请求方法和路径。
  1. 灵活
  • HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

2.4 请求报文

  • 请求行
    • 请求类型
    • 要访问的资源
    • HTTP协议版本号
  • 请求头
    • 用来讲明服务器要使用的附加信息(一些键值对)
    • 例如:User-Agent、 Accept、Content-Type、Connection
  • 空行
    • 分割请求头与请求体
  • 请求体
    • 能够添加任意的其余数据

2.5 响应报文

  • 状态行
    • 状态码
    • 状态消息
    • HTTP协议版本号
  • 消息报头
    • 说明客户端要使用的一些附加信息
    • 如:Content-Type、charset、响应的时间
  • 响应正文
    • 返回给客户端的文本信息

2.6 HTTP 方法

  • GET
    • 获取资源
  • POST
    • 传输资源
  • PUT
    • 更新资源
  • DELETE
    • 删除资源
  • HEAD
    • 获取报文首部

2.6.1 Post 和 Get 的区别

  • GET在浏览器回退时是无害的,而POST会再次提交
  • 重点Get请求能缓存,Post不能
  • Post相对Get相对安全一些,由于Get请求都包含在URL中,并且会被浏览器保存记录,Post不会。可是再抓包的状况下都是同样的。
  • Post 能够经过 request body来传输比 Get 更多的数据
  • URL有长度限制,会影响 Get 请求,可是这个长度限制是浏览器规定的
  • Post 支持更多的编码类型且不对数据类型限制
  • 重点POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
  • 补充:100状态码表示(继续)请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其他部分。

反作用和幂等的概念面试

[!NOTE]ajax

  1. 反作用:指对服务器上的资源作改变,搜索是无反作用的,注册是反作用的。
  2. 幂等:指发送 M 和 N 次请求(二者不相同且都大于 1),服务器上资源的状态一致,好比注册 10 个和 11 个账号是不幂等的,对文章进行更改 10 次和 11 次是幂等的。

[!NOTE]
在规范的应用场景上说,Get 多用于无反作用,幂等的场景,例如搜索关键字。Post 多用于反作用,不幂等的场景,例如注册。浏览器

2.7 常见状态码

2.7.1 1XX 指示信息(面试考点)

表示请求已接收,继续处理缓存

2.7.2 2XX 成功

  • 200 OK
  • 204 No content,表示请求成功,但响应报文不含实体的主体部分
  • 205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,可是与 204 响应不一样在于要求请求方重置内容
  • 206 Partial Content,进行范围请求

2.7.3 3XX 重定向

  • 301 永久性重定向,表示资源已被分配了新的 URL
  • 302 临时性重定向,表示资源临时被分配了新的 URL
  • 303 表示资源存在着另外一个 URL,应使用 GET 方法获取资源
  • 304 未修改,重定位到浏览器。自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。若是网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器能够告诉 Googlebot 自从上次抓取后网页没有变动,进而节省带宽和开销。
  • 307 临时重定向,和302含义相似,可是指望客户端保持请求方法不变向新的地址发出请求

2.7.4 4XX 客户端错误

  • 404 在服务器上没有找到请求的资源
  • 403 forbidden,表示对请求资源的访问被服务器拒绝
  • 400 请求报文存在语法错误
  • 401 表示发送的请求须要有经过 HTTP 认证的认证信息

2.7.5 5XX 服务器错误

  • 500 表示服务器端在执行请求时发生了错误
  • 501 表示服务器不支持当前请求所须要的某个功能
  • 503 代表服务器暂时处于超负载或正在停机维护,没法处理请求

2.8 HTTP持久链接(HTTP1.1支持)

[!NOTE]
HTTP协议采用“请求-应答”模式,而且HTTP是基于TCP进行链接的。普通模式(非keep-alive)时,每一个请求或应答都须要创建一个链接,完成以后当即断开。安全

当使用Conection: keep-alive模式(又称持久链接、链接重用)时,keep-alive使客户端道服务器端链接持续有效,即不关闭底层的TCP链接,当出现对服务器的后继请求时,keep-alive功能避免从新创建链接。服务器

2.9 HTTP管线化 (HTTP1.1支持)

pipe

管线化后,请求和响应再也不是依次交替的了。他能够支持一次性发送多个请求,并一次性接收多个响应。cookie

  • 只有get与head请求能够进行管线化,POST有限制
  • 初次建立链接时不该该启动管线机制,由于服务器不必定支持该协议

2.10 HTTP数据协商

在客户端向服务端发送请求的时候,客户端会申明能够接受的数据格式和数据相关的一些限制是什么样的;服务端在接受到这个请求时他会根据这个信息进行判断到底返回怎样的数据。

2.10.1 请求

  • cookie
  • Host
  • Connection
  • Accept
    • 在请求中使用Accept可申明想要的数据格式(image/webp,image/apng,image/)
  • Accept-Encoding
    • 告诉服务端使用什么的方式来进行压缩
    • 例如:gzip、deflate、br
  • Accept-Language
    • 描述语言信息(zh-CN)
  • User-Agent(Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.15 Safari/537.36)
    • 用来描述客户端浏览器相关信息
    • 能够用来区分PC端页面和移动端页面

2.10.2 响应

  • Content-Type
    • 对应Accept,从请求中的Accept支持的数据格式中选一种来返回
  • Content-Encoding
    • 对应 Accept-Encoding,指服务端到底使用的是那种压缩方式
  • Content-Language
    • 对应Accept-Language

2.10.3 form 表单中enctype数据类型

  • application/x-www-form-urlencoded
    • key=value&key=value 格式
  • multipart/form-data
    • 用于提交文件
    • multipart表示请求是由多个部分组成(由于上传文件的时候文件不能以字符串形式提交,须要单独分出来)
    • boundary 用来分隔不一样部分
  • text/plain
// 原生ajax 方式对get的url,使用POST请求方式进行发送
document.querySelector("#btnAjax").onclick = function () {
     var ajax = new XMLHttpRequest();

     // 使用post请求
     ajax.open('post','ajax_post.php');

     // 若是 使用post发送数据 必须 设置 以下内容
     // 修改了 发送给 服务器的 请求报文的 内容
     // 若是须要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。而后在 send() 方法中规定您但愿发送的数据:
     ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
     // 发送
     // post请求 发送的数据 写在 send方法中
     // 格式 name=jack&age=18 字符串的格式
     ajax.send('name=jack&age=998');

     // 注册事件
     ajax.onreadystatechange = function () {
         if (ajax.readyState==4&&ajax.status==200) {
             console.log(ajax.responseText);
         }
     }
 }

2.11 HTTP Redirect 重定向

  • 302 暂时重定向
    • 浏览器每次访问都要先去目标网址访问,再重定向到新的网址
  • 301 永久重定向
    • 当浏览器收到的HTTP状态码为301时,下次访问对应网址就直接调整到新的网址,不会再访问原网址

2.12 HTTP CSP 内容安全策略

HTTP CSP 内容安全策略

CSP Content-Security-Policy

  • 限制资源获取
  • 报告资源获取越权

例子:

  • Content-Security-Policy: default-src http: https: 表示只容许经过http、https的方式加载资源
  • 'Content -Security-Policy': 'default-src' \'self\'; form-action\'self\' ' 表示只能加载本域下的资源,只能向本域发送表单请求

2.12.1 TLS 握手过程以下图

TLS

  1. 客户端发送一个随机值,须要的协议和加密方式
  2. 服务端收到客户端的随机值,本身也产生一个随机值,并根据客户端需求的协议和加密方式来使用对应的方式,发送本身的证书(若是须要验证客户端证书须要说明)
  3. 客户端收到服务端的证书并验证是否有效,验证经过会再生成一个随机值,经过服务端证书的公钥去加密这个随机值并发送给服务端,若是服务端须要验证客户端证书的话会附带证书
  4. 服务端收到加密过的随机值并使用私钥解密得到第三个随机值,这时候两端都拥有了三个随机值,能够经过这三个随机值按照以前约定的加密方式生成密钥,接下来的通讯就能够经过该密钥来加密解密.

经过以上步骤可知,在 TLS 握手阶段,两端使用非对称加密的方式来通讯,可是由于非对称加密损耗的性能比对称加密大,因此在正式传输数据时,两端使用对称加密的方式通讯。

3. HTTP2(面试重点)

[!NOTE]
HTTP 2.0 相比于 HTTP 1.X,能够说是大幅度提升了 web 的性能。

在 HTTP 1.X 中,为了性能考虑,咱们会引入雪碧图、将小图内联、使用多个域名等等的方式。这一切都是由于浏览器限制了同一个域名下的请求数量,当页面中须要请求不少资源的时候,队头阻塞(Head of line blocking)会致使在达到最大请求数量时,剩余的资源须要等待其余资源请求完成后才能发起请求。

3.1 二进制传输

HTTP 2.0 中全部增强性能的核心点在于此。在以前的 HTTP 版本中,咱们是经过文本的方式传输数据。在 HTTP 2.0 中引入了新的编码机制,全部传输的数据都会被分割,并采用二进制格式编码。

3.2 多路复用

在 HTTP 2.0 中,有两个很是重要的概念,分别是帧(frame)和流(stream)。

帧表明着最小的数据单位,每一个帧会标识出该帧属于哪一个流,流也就是多个帧组成的数据流。

多路复用,就是在一个 TCP 链接中能够存在多条流。换句话说,也就是能够发送多个请求,对端能够经过帧中的标识知道属于哪一个请求。经过这个技术,能够避免 HTTP 旧版本中的队头阻塞问题,极大的提升传输性能。

http2

3.3 Header 压缩

在 HTTP 1.X 中,咱们使用文本的形式传输 header,在 header 携带 cookie 的状况下,可能每次都须要重复传输几百到几千的字节。

在 HTTP 2.0 中,使用了 HPACK 压缩格式对传输的 header 进行编码,减小了 header 的大小。并在两端维护了索引表,用于记录出现过的 header ,后面在传输过程当中就能够传输已经记录过的 header 的键名,对端收到数据后就能够经过键名找到对应的值。

3.4 服务端 Push

在 HTTP 2.0 中,服务端能够在客户端某个请求后,主动推送其余资源。

能够想象如下状况,某些资源客户端是必定会请求的,这时就能够采起服务端 push 的技术,提早给客户端推送必要的资源,这样就能够相对减小一点延迟时间。固然在浏览器兼容的状况下你也可使用 prefetch。

4. HTTP首部

通用字段 做用
Cache-Control 控制缓存的行为
Connection 浏览器想要优先使用的链接类型,好比 keep-alive
Date 建立报文时间
Pragma 报文指令
Via 代理服务器相关信息
Transfer-Encoding 传输编码方式
Upgrade 要求客户端升级协议
Warning 在内容中可能存在错误
请求字段 做用
Accept 能正确接收的媒体类型
Accept-Charset 能正确接收的字符集
Accept-Encoding 能正确接收的编码格式列表
Accept-Language 能正确接收的语言列表
Expect 期待服务端的指定行为
From 请求方邮箱地址
Host 服务器的域名
If-Match 两端资源标记比较
If-Modified-Since 本地资源未修改返回 304(比较时间)
If-None-Match 本地资源未修改返回 304(比较标记)
User-Agent 客户端信息
Max-Forwards 限制可被代理及网关转发的次数
Proxy-Authorization 向代理服务器发送验证信息
Range 请求某个内容的一部分
Referer 表示浏览器所访问的前一个页面
TE 传输编码方式
响应字段 做用
Accept-Ranges 是否支持某些种类的范围
Age 资源在代理缓存中存在的时间
ETag 资源标识
Location 客户端重定向到某个 URL
Proxy-Authenticate 向代理服务器发送验证信息
Server 服务器名字
WWW-Authenticate 获取资源须要的验证信息
实体字段 做用
Allow 资源的正确请求方式
Content-Encoding 内容的编码格式
Content-Language 内容使用的语言
Content-Length request body 长度
Content-Location 返回数据的备用地址
Content-MD5 Base64加密格式的内容 MD5检验值
Content-Range 内容的位置范围
Content-Type 内容的媒体类型
Expires 内容的过时时间
Last_modified 内容的最后修改时间

参考文章: http://www.javashuo.com/article/p-mjsgoetv-bt.html

参考连接:https://blog.csdn.net/sinat_21455985/article/details/53508115

相关文章
相关标签/搜索