【巩固基础】前端必备的Http相关知识点总结

1,405 阅读19分钟

一. 复习OSI七层模型

                                                                                                                                                                                                                                                                                                                                           
OSI七层模型tcp/ip概念层模型功能tcp/ip协议族
应用层应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层数据格式化,代码转换,数据加密没有协议
会话层解除或建立与别的接点的联系没有协议
传输层传输层提供端对端的接口TCP,UDP
网络层网络层为数据包选择路由IP,ICMP,RIP,OSPF,BCP,ICMP
数据链路层链路层 (用来处理连接网络的硬件部分)传输有地址的域以及错误检测功能SMIP,CSLIP,PPP,ARP,RARP,RIU
物理层以二进制数据形式在物理媒体上传输数据IS02210,IEEEE802,IEEE802.2
  • 表示层:主要为异种机通信提供一种公共语言,便于交互(因为不同计算机体系结构使用的数据表示法不同),为应用层传递过来的数据提供语法转换、语法协商、连接管理(与会话层建立表示连接),只关心信息发出的语法和语义。

  • 会话层:控制两个节点之间的建立、维护和释放的连接,并对会话进行管理和控制,来保证数据的可靠传送。

  • 传输层:提供处于网络连接中的两台计算机之间的数据传输,端对端的连接,大致分为TCP传输控制协议(可靠地)和UDP用户数据报协议(不可靠的)

  • 网络层:通过路由选择算法为IP分组从源主机到目的主机选择一条合适的传输路径,为传输层端到端的数据传输提供服务【用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的传输路径到达对方计算机,并把数据包传送给对方。】

  • 数据链路层:物理层的设备为终端设备之间提供媒介及连接,但通讯之间的传输只在通讯时连接的,每次通讯都会建立连接和拆除连接两个过程,这种建立起来的数据收发关系称为数据链路(用来处理连接网络的硬件部分)

  • 物理层:利用传输介质为通讯的主机之间建立、管理和释放物理连接,实现比特流的传输,保证比特流在传输介质上正确传输。

二.TCP的三次握手与四次挥手

1.三次握手

简单来说,三次握手的过程是:

  • 第一次握手: 你在吗?(客户端->服务端,服务端角度:客户端的发送功能、服务端接收功能正常)

客户端发送SYN包并进入SYN_SEND状态,等待服务端确认。

  • 第二次握手:我在,你还在吗?(服务端->客户端,客户端角度:服务端接收、发送功能正常,客户端发送、接收功能正常。服务端此时不清楚客户端的接收功能及自己的发送功能是否正常,于是有了第三次握手。)

服务端收到syn包,必须确认客户的SYN(ack=x+1)(为了确认客户端的SYN,将x+1作为ACK的数值,每发送一个SYN,序列号就+1,丢失就会重传),同时自己也发送一个SYN包(seq=y)作为应答,发送SYN+ACK包到客户端,服务端进入SYN_RECV状态

  • 第三次握手:我还在。(客户端->服务端)

客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 经过三次握手,客户端和服务端都确认了自己的接收、发送功能正常,可以正常通信了。

2.四次挥手

TCP是双向传输模式,双方可以同时向对方发送或接收数据。当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。这时对方会回一个ACK,此时一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,等到发送完了所有的数据后,会发送一个FIN段来关闭此方向上的连接。接收方发送ACK确认关闭连接。

  • 第一次挥手:我要走了。(主动方->被动方,主动方告知被动方要关闭连接。此时主动方数据已全部发送完毕,如果被动方还有数据没发送完,可以继续发送,主动方还可以接收数据。)

主动方发送FIN包,并包含自己的序列号K,同时还有一个ACK表示确认对方最近一次发送的数据。主动方进入FIN_WAIT_1状态。

  • 第二次挥手:好的。(被动方->主动方,被动方进入关闭等待状态,tcp处于半关闭状态。)

被动方收到FIN包,发动一个ACK并将K+1作为序号值,表明收到上一个包。主动方进入FIN_WAIT_2 状态。

  • 第三次挥手:再见。(被动方->主动方,被动方确认数据已全部发送完成,关闭被动方到主动方的数据传送。)

被动方确认数据发送完成后,向主动方发送FIN=N报文,被动方进入LAST_ACK状态。

  • 第四次挥手:再见。(主动方->被动方,主动方告诉被动方要断开连接,在等待2MSL后未收到回复,证明被动方已正常关闭,主动方也关闭连接。)

主动方收到后,发送ack=N+1后进入TIME_WAIT状态。 经过四次挥手后,连接通道关闭。

三.TCP的长连接与短连接

默认为长连接,响应头中的connection: keep-alive就代表是一个长连接,通过设置connection:close来关闭长连接。

1.长连接

HTTP 发送请求时,要先创建一个 TCP 连接,并在 TCP 连接上把 HTTP 请求的内容发送并且接收完返回,这是一次请求完成,浏览器与服务器进行协商是否关闭 TCP 链接,若不关闭 TCP 连接会有一定的消耗,好处是如果还有请求可以直接在这个 TCP 连接上发送,不需要经过创建时三次握手的消耗。

长连接在没有数据传输的情况下,需要定时发送数据心跳包来维持连接。

减少tcp建立关闭的操作,节省时间,适用于频繁请求的场景

2.短连接

若关闭 TCP 连接,下次请求需要重新创建,这时会有网络延迟的开销,好处是每次请求完关闭 TCP 连接,减少客户端和服务端连接的并发数。

四.HTTPS

对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全。

1.HTTP与HTTPS的区别

  • HTTPS需要CA证书
  • HTTP是明文传输,HTTPS通过SSL(安全套接层)/TLS(安全传输层)协议进行加密,密文传输。
  • HTTPS可以有效的防止运行商劫持,解决了防劫持的问题

2.HTTPS的工作流程

  • 客户端发起HTTPS请求,根据RFC2818规定,客户端需要连接服务端的443(默认)端口。
  • 服务端把公钥证书返回给客户端
  • 客户端解析证书,这部分由客户端的TLS完成,首先验证公钥是否有效,比如颁发机构、过期时间等,如果发现异常,会弹出警告框,提示证书存在问题,如果没有问题,会使用伪随机数生成加密所使用的对称密钥(随机值),然后用证书的公钥加密,发给服务端。
  • 服务端用自己的私钥解密,得到对称密钥(随机值),之后客户端和服务端就可以通过这个随机值来进行加密解密了。

3.CA安全证书

  • 解决通信方身份可能被伪装的问题。
  • CA证书由CA证书授权中心发行,可以用来识别身份,证书中包含发布机构、证书有效期、公钥、证书所有者、签名使用的算法、指纹及指纹算法等。
  • 客户端向服务器发出请求,服务器返回证书文件,客户端读取证书中相关的明文信息,采用相同的散列函数计算得到信息摘要,利用对应的CS公钥解密签名数据,对比证书的信息摘要,如果一致,就可以确认证书的合法性。
  • 客户端还会验证证书相关的域名信息、有效时间等信息,客户端会内置信息CA的证书信息(包含公钥),如果CA不被信任,则找不到对应的CA证书,也会判定为非法。

4.SSL与TLS

  • SSL(位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持)
    • 由两层组成:SSL记录协议和SSL握手协议。
    • SSL提供的服务:认证用户和服务器,确保数据发送到正确的客户机和服务器。加密数据以防止数据中途被窃取。维护数据的完整性,确保数据在传输过程中不被改变。
  • TLS(用于在两个通信应用程序之间提供保密性和数据完整性)
    • 由两层组成:TLS记录协议和TLS握手协议。

5.加密算法

  • 对称加密:加密和解密都用同一个秘钥加密,因为对称加密需要将加密数据和秘钥同时传递,因此对称加密是不安全的。
  • 非对称加密:非对称加密有公钥与私钥,公钥加密、私钥解密,反之同理。

五.HTTP协议版本

1.HTTP1.0

  • 短连接:每次发送请求都要重写建立TCP连接,性能较差
  • 无HOST头域:每个服务器对应一个IP地址,请求消息中不会带有主机名。
  • 不允许断点续传:不支持断点续传功能,会浪费带宽(不能传输对象的一部分,要求传输整个对象)
  • 缓存处理:主要使用header中的If-Modified-Since,Expires做缓存的标准

2.HTTP1.1

  • 长连接:默认开启长连接,支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭的消耗和延迟。
  • HOST头域:支持HOST头域,没有会报404,随着虚拟主机的发展,一台物理服务器上可以存在多个虚拟机,它们共享一个IP地址。
  • 带宽优化:在请求头中引入了range,它语序只请求资源的某个部分,返回码是206,充分利用了带宽和连接
  • 缓存处理:引入了更多缓存策略,如:Entity tag, If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

3.HTTP2.0

  • HTTP1.X基于文本解析,HTTP2.0基于二进制格式解析
  • 多路复用:(多个请求可同时在一个连接上并行执行)即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
  • header压缩:HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
  • 服务端推送:(服务端可以主动连接客户端来推送资源)同SPDY协议一样。

4.SPDY协议

  • SPDY协议是由Google开发的基于TCP的会话层协议,是对HTTP的增强。

  • HTTP2.0是基于SPDY协议的,大部分特性与HTTP2保持一致,包括服务端推送、多路复用和帧作为传输的最小单位。

  • SPDY的头部压缩算法是DEFLATE算法,HTTP2使用的是HPACK算法,压缩率更高。

  • 基于HTTPS的加密协议传输,提高了传输数据的可靠性。

  • 针对HTTP高延迟的问题,SPDY采取了多路复用,通过多个请求共享一个TCP连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率,多路复用会出现关键请求被阻塞的现象,SPDY允许给每个请求设置优先级,这样重要的请求会有限得到响应。

5.HTTP3.0

基于google的QUIC协议,quic协议是使用UDP实现的,减少了tcp三次握手的时间,以及tls(安全传输层协议,用在两个通信应用程序之间提供保密性和数据完整性)握手时间。

  • 解决了HTTP2中的队头阻塞问题
  • 优化了重传策略
  • 切换网络时的连接保持

六.HTTP基础

1.HTTP报文结构

image.png

  • 请求报文
    • 请求行---- 请求方法,请求地址,http协议及版本
    • 请求头/响应头----(具体看第6点)
    • 空行----用来让服务端区分请求头与请求体,在遇到空行后的下一个就是请求体了
    • 请求体----请求的参数,可以没有
  • 响应报文
    • 状态行----包括http协议及版本、状态码等
    • 响应头
    • 空行
    • 响应体---- 服务端返回的数据
  • URI(统一资源标识符,包含URN与URL两部分) 通用格式: scheme:[// [user:password @] host [:port]] [/] path [?查询] [#片段]\

Scheme(方案):该方案列出了具体语法和URI的任何相关协议。
权限组件:权限组件由多个部分组成:可选的身份验证部分,主机(由注册名称或IP地址组成) , 以及可选的端口号。身份验证部分包含用户名和密码,用冒号分隔,后跟at(@)符号。在@之后是主机名,然后是冒号,然后是一个端口号。请务必注意,IPv4地址必须采用点十进制表示法,并且IPv6地址必须括在括号中。
查询(可选):查询包含一串非分层数据。虽然语法没有明确定义,但通常是由分隔符分隔的属性值对序列,例如&符号或分号。查询通过问号与前一部分分开。
片段(可选):片段包含片段标识符,该标识符为辅助资源提供方向。

2.HTTP状态码

  • 分类
    • 1xx 服务器收到请求
    • 2xx 请求成功, 如200
    • 3xx 请求被重定向,如302(给浏览器一个网址,自动跳转)
    • 4xx 客户端错误,如404
    • 5xx 服务端错误,如500
  • 常见状态码
    • 200 请求成功
    • 301 永久重定向(配合location,浏览器自动处理)
    • 302 临时重定向(配合location,浏览器自动处理)
    • 304 资源未被修改
    • 404 资源未找到
    • 403 没有权限
    • 500 服务器错误
    • 504 网关超时

3.HTTP请求方法

  • 部分请求方法
    • get  获取数据
    • post 新建数据
    • patch/put  更新数据
    • delete  删除数据
    • patch 对资源应用部分修改
  • get与post的区别
    • GET在浏览器回退不会再次请求,POST会再次提交请求
    • GET请求会被浏览器主动缓存,POST不会,要手动设置
    • GET请求参数会被完整保留在浏览器历史记录里,POST中的参数不会
    • GET请求在URL中传送的参数是有长度限制的,而POST没有限制
    • GET参数通过URL传递,POST放在请求体中
    • GET一般用于查询信息,POST一般用于提交某种信息进行某些修改操作
    • GET产生一个TCP数据包;POST产生两个TCP数据包(get请求:浏览器会把http header和data一起发送出去,服务器响应200。post请求:会先发送header,服务器响应100,再发送data,服务器响应200)

6.http headers

  • Request Headers
    • Accept浏览器可接收的数据格式
    • Accept-Encoding浏览器可接收的压缩算法,如gzip
    • Accept-Lanuange 浏览器可接收的语言
    • Connection:keep-alive 一次TCP连接重复使用
    • cookie 同域的情况下,浏览器每请求一次资源都会带上cookie
    • Host  请求的域名
    • User-Agent (简称UA)浏览器信息
    • Content-type 发送数据的格式,如application/json
  • Response Headers
    • Content-type  返回数据的格式,如application/json
    • Content-length  返回数据的大小,多少字节
    • Content-Encoding  返回数据的压缩算法,如gzip
    • Set-Cookie  服务端要改cookie的时候使用
  • 缓存相关的headers
    • Cache-Control  Expires
    • Last-Modified   If-Modified-Since
    • Etag   If-None-Match

5.HTTP缓存策略

可以通过缓存减少网络请求的数量和体积(静态资源(js css img)可以被缓存),可以减轻服务器的负担
强缓存是在发送http请求时,如果有缓存,判断这个缓存是否过期,如果没有过期,就直接读取。 协商缓存是如果缓存过期了,会判断是否有Etag和LastModified,如果有就向服务端发送http请求,带If-None-Match,If-Modified-Since字段,服务器判定缓存是否可用,如果可以用的话就返回304状态码,然后读取缓存,最后呈现页面。 如果header中没ETtag和LastModified字段,就像服务端发送http请求,服务器返回资源,然后呈现页面 如果在协商缓存中,服务器判定缓存不可以用,会返回一个200的状态码,服务器返回请求资源,最后呈现页面

  • 强缓存
    • Cache-Control----在Response Headers中,控制强制缓存的逻辑
      • max-age  设置缓存的最大过期时间
      • no-cache  不用强制缓存,到服务端请求
      • no-store  不用强制缓存,让服务端再返回一次
      • private  只允许最终用户做缓存
      • public  允许中间的路由或代理做缓存
    • Expires---- 在Response Headers中,同为控制缓存过期,已被Cache-Control代替了
  • 协商缓存(服务端缓存策略,服务器判断客户端资源,是否和服务器端资源一样,一致则返回304,否则返回200和最新的资源)
    • Last-Modified资源的最后修改时间(只能精确到秒级)
    • Etag资源的唯一标识(一个字符串)
    • 会优先使用Etag
    • 如果资源被重复生成,而内容不变,则Etag更精确

5.HTTP内容压缩

一般是进行编码压缩的,压缩方式体现再来发送方的Content-Encoding字段上,接受的压缩方式体现在Accept-Encoding字段上, 通过content-length来指定压缩后文件大小。
原理:为了提高网页在网络上的传输速度,服务器对主体信息进行压缩。
过程:发送http请求到服务器,请求中包含压缩格式字段,服务器收到后,生成原始的response,通过压缩格式,对response进行编码,编码后headers中包含content-type与content-length字段,并增加了Content-Encoding字段,之后把response发送到客户端,客户端接收到压缩后进行解压,再渲染页面。

几种常用的压缩格式:

  • gzip: 表明实体采用GNU zip编码
  • compress:表明实体采用Unix的文件压缩程序
  • deflate:表明实体是用zlib的格式压缩的
  • br: 一种专门为HTTP发明的压缩算法
  • identity:表明没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况

问:压缩时为什么要指定文件类型进行压缩?

答:因为压缩也是会消耗CPU资源的,图片、视频等文件压缩效果也不好。一般压缩文本格式的文件,压缩效果好(从xxM压缩到xxk)。

七.跨域问题

同源策略:协议、域名、端口号必须一致, ajax请求时,浏览器要求当前网页与服务端必须同源。

1.JSONP

<script>标签没有跨域限制

  • 通过动态创建script,再请求一个带参网址实现跨域通信
  • 原理:通过<script>标签的跨域特性来绕过同源策略(创建一个回调函数,然后再调用这个函数并且将json数据形式作为参数传递,完成回调)
  • 服务端不用修改,需要改前端,发送jsonp请求,只能发get请求
  • 可能会受到XSS攻击

2.CORS

  • 服务端设置响应头,使浏览器允许跨域请求(设置Access-Control-Allow-Origin 开启CROS, 该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。)
  • 使用cros解决跨域时,会在发送请求时分为简单请求和复杂请求。
    • 简单请求(同时满足以下两个条件时为简单请求)
      • 请求方式: GET、HEAD、POST
      • 请求头Content-Type为:text/plain、multipart/form-data、application/x-www-form-urlencoded
    • 复杂请求的CORS请求, 会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求,该请求是 option 方法的,通过该请求来知道服务端是否允许跨域请求。

3.websocket

websocket是支持跨域的。
websocket是H5的一个持久化协议,它实现了浏览器和服务器的全双工通信。
WebSocket 是一种双向通信协议,在建立连接之后,WebSocket 的 server 与 client 都能主动向对方发送或接收数据。

4.Node中间件代理

同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略。

5.nginx反向代理

类似于node中间件代理,需要搭建一个中转nginx服务器,用于转发请求