网络协议相关知识点总结

559 阅读10分钟

HTTP协议

http协议是基于TCP/IP协议之上的应用层协议,HTTP1.0是无状态、无连接的协议。\

  • 特点:
    • 无状态是指HTTP协议 自身不保留通信状态,即不保留之前一切的请求或响应报文的信息;
    • 无连接是指服务器处理完客户的请求,并收到客户的应答后,即断开连接,限制了每次连接只处理一个请求。
  • 缺点:
    • 明文传输:安全性低--->HTTPS

HTTP请求方法

  • GET:向指定的资源发出“显示”请求;使用GET方法应该只用在读取数据
  • POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件),数据被包含在请求文本中
  • HEAD:获得报文首部
  • PUT:传输文件
  • DELETE:删除文件
  • OPTIONS:询问支持的方法(例如:CORS非简单请求会用到)
  • CONNECT:CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。 TRACE:追踪路径,客户端可以对请求消息的传输路径进行追踪
属性GETPOST
缓存请求会被浏览器主动缓存,产生的URL可以作为书签保存不能缓存
编码只能进行URL编码,只接受ASCII字符支持多种编码方式
参数参数放在URL中,直接暴露,不安全数据放在请求体中,更适合传输敏感数据
TCP角度get请求会把请求报文一次性发出post会分为两个TCP包,先发送head部分,服务器响应100,再发body部分
数据大小url的长度是受限制的(url的最大长度是2048个字符)post无限制,form表单提交数据

提交数据 : Nodejs 数据传递GET/POST

HTTP1.1和HTTP1.0的区别

  • HTTP1.1支持长连接
    • HTTP1.1中默认开启Connection: keep-alive,在一个TCP连接上可以传送多个HTTP请求和响应,弥补了1.0每次请求都要建立连接的特点
  • 增加HOST字段
    • 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
  • 新增状态码
    • 例如:100(Continue) Status(节约带宽)
  • 缓存处理
    • 在HTTP1.0中主要使用header里的 Expires 来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如 Etag,If-None-Match 等更多可供选择的缓存头来控制缓存策略

HTTP2.0和HTTP1.1的区别

  • 多路复用:HTTP2.0使用多路复用技术,支持同一个连接并发处理多个请求
  • 头部压缩: HTTP2.0支持头部压缩,数据体积变小,传输更快
  • 服务器推送: HTTP2.0引入server push,它允许服务器推送资源给浏览器
  • 新的二进制格式: HTTP1.x解析是基于文本,HTTP2.0解析采用二进制格式,更方便实用

HTTP 3.0

image.png 由图可以看出,HTTP3和HTTP2的传输层是完全不同的协议,HTTP3的传输层是UDP协议。

  • HTTP2.0的问题:
    • 底层使用TCP协议建立连接,TCP的慢启动;拥塞窗口尺寸设置不合理导致性能急剧下降的问题没有得到解决
    • HTTP2.0多路复用只是减少了连接数,队头阻塞的问题并没有得到完全解决。如果TCP丢包率超过2%,性能会很低
  • HTTP3.0特点
    • 传输层是UDP协议:使用UDP作为传输层进行通信
    • 安全:从协议本身保证了安全性,QUIC在建立连接的握手过程中就完成了TLS加密握手
    • 建立连接快:正常只需要1RTT即可建立连接。如果有缓存之前的secret信息,则直接验证和建立连接,此过程0RTT。建立连接时,也可以带有少量业务数据
    • 使用QPACK进行头部压缩:因为HPACK要求传输过程有序,这会导致队头阻塞。而QPACK不存在这个问题

HTTP3可以看这篇:HTTP协议-HTTP3

HTTPS和HTTP

HTTP + 加密 + 认证 + 完整性保护 = HTTPS;

HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。

  • TLS/SSL工作原理

HTTPS协议的主要功能基本依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数Hash(数字签名过程), 对称加密(AES、DES,主要是位运算,速度快)和非对称加密(RSA、DSA、ECC,算法复杂,慢),其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

  • ssl的大致流程

    • 客户端向服务器发送客户端支持的ssl版本 + 支持的加密方式 + 一个随机数
    • 服务端接收消息并返回 确认ssl版本和加密方式 + 数字证书 + 一个随机数
    • 客户端确认数字证书的可靠性,并发送一个用服务端公钥加密的随机数,同时用前三个随机数通过约定的算法生成对话密钥。
    • 服务器用自己的私钥解密这个随机数,并用前三个随机数通过约定的算法生成对话密钥。
  • 数字证书

    • 签发证书的机构、公钥、证书到期的时间
    • 加密算法、hash算法
  • 证书预置和申请

    • 1:客户端浏览器会预置根证书, 里面包含CA公钥
    • 2:服务器去CA(证书签证机关)申请一个证书
    • 3: CA用自己的签名去签一个证书,指纹信息保存在证书的数字摘要里面, 然后发送给服务器

    image.png

输入一个url到页面显示的过程

可以看这篇:从输入一个url到页面显示的过程

URL的组成

image.png

  • protocol: 协议,常用的协议是http
  • hostname: 主机地址,可以是域名,也可以是IP地址
  • port: 端口 http协议默认端口是:80端口,如果不写默认就是:80端口
  • path: 路径 网络资源在服务器中的指定路径
  • parameter: 参数 如果要向服务器传入参数,在这部分输入
  • query: 查询字符串 如果需要从服务器那里查询内容,在这里编辑
  • fragment: 片段 网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置

获取URL参数:

const getURLParameters = (url) => {
  const urlParamArr = url.match(/([^?=&]+)(=([^&]*))/g) || [];
  const urlParamObj = urlParamArr.reduce(
    (preVal, curVal) => {
      preVal[curVal.slice(0, curVal.indexOf('='))] = curVal.slice(curVal.indexOf('=') + 1);
      return preVal;
    },
    {}
  );
  return urlParamObj;
}

HTTP请求头和响应头

HTTP 请求报文由以下部分组成:

  • 请求行 (请求方法+请求URL+协议版本)

  • 请求头 (User-agent、Accept、Host)

    • Accpet:告诉服务端,客户端接收什么类型的响应(对应服务端返回的Content-Type)
    • Accept-Encoding: 属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式),例如gzip、deflate压缩格式
    • Content-Type:客户端发送出去实体内容的类型
    • Cache-Control:指定请求和响应遵循的缓存机制,如no-Cache
    • Referer:表示这是请求是从哪个URL进来的
    • Host:指定要请求的资源所在的主机和端口
    • Cookie: 有cookie并且同域访问时会自动带上
    • Connection: 当浏览器与服务器通信时对于长连接如何进行处理,如keep-alive
    • User-Agent:告诉服务器,客户端使用的操作系统、浏览器版本和名称
  • 空行

  • 请求体 (可以包括用户提交的查询信息)

HTTP 响应报文由以下部分组成:

  • 状态行 (请求方法+请求URL+协议版本)

  • 消息报头 用来说明客户端需要的一些附加信息

    • Access-Control-Allow-Headers: 服务器端允许的请求Headers
    • Access-Control-Allow-Methods: 服务器端允许的请求方法
    • Access-Control-Allow-Origin: 服务器端允许的请求Origin头部(譬如为*)
    • Date:数据从服务器发送的时间
    • Expires:文档的过期时间
    • Cache-Control: 响应输出到客户端后,服务端通过该属性告诉客户端该怎么控制响应内容的缓存
    • Max-age:客户端的本地资源缓存的最大时间,开启Cache-Control后有效
    • Last-Modified:请求资源的最后修改时间
    • ETag:浏览器请求变量的实体标签的当前值
    • Keep-Alive:如果客户端有keep-alive,服务端也会有响应(如timeout=38)
    • Server:服务器的一些相关信息
    • Location: 在重定向中或者创建新资源时使用
    • Set-Cookie:服务端可以设置客户端的cookie
  • 空行

  • 响应正文 (页面右键F12查看源码的内容)

更多可以看这篇:HTTP请求头和响应头详解

浏览器缓存、HTTP缓存 以及 浏览器缓存和CDN的关系

详细可以看这篇:浏览器缓存、HTTP缓存(强缓存、协商缓存),浏览器缓存和CDN的关系

HTTP通信和Socket通信

客户端与服务器通信的主要方式有两种:

  • HTTP通信
    • Http连接使用的是 “请求-响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务端才能向客户端返回数据
  • Socket通信
    • Socket通信则是在双方建立连接后,可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端向服务器发送请求

socket又称套接字,是一种抽象层,在程序内部提供了与外界通信的端口,即端口通信。应用程序通过它来发送和接受数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信

  • Socket分类:
    • 流套接字:流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务,TCP使用的是的方式发送

    • 数据报嵌套字:数据报嵌套字使用UDP协议,提供数据打包发送数据,UDP是以的形式发送

可以看这篇:Socket通信原理

Websocket

HTTP 协议有一个缺陷:通信只能由客户端发起。WebSocket 协议在2008年诞生,HTTP2.0支持服务端推送,但2013年才诞生。WebSocket 最大的特点是:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是双向平等对话,属于服务器推送技术的一种。

image.png

WebSocket特点:

  • 建立在TCP协议上
  • 与HTTP协议有着良好的兼容性,默认端口也是80和443,握手阶段采用HTTP协议
  • 数据格式比较轻量,性能开销小
  • 可以发送文本,也可以发送二进制数据
  • 没有同源限制,客户端可以与任意服务器通信
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL 更多详细知识可以看阮一峰老师的WebSocket 教程

前端页面间数据传递常用的几种方式

  • url页面路径携带参数传递
  • localStorage方式传递
  • sessionStorage方式传递
  • cookie的方式传递

image.png