作为一个前端开发者,http应该说是我们最熟悉的陌生人。熟悉是因为我们每天都在用,浏览器地址栏输入的一个地址最开始的四个字母基本上都是http,可是尽管可能除了我们在吃饭睡觉的时间外都在接触http这四个字母,但是我们对于他背后的故事却又是非常的陌生。那我们就来说说这http背后的故事。在说http之前,我还是想先说说tcp/Ip协议族.
tcp/Ip协议是internet的最基本协议,http只是其一个子集。TCP/IP协议族按层次分为以下四层,即应用层、传输层、网络层和链路层。
应用层:应用层规定了向用户提供应用服务时通信的协议,TCP/IP 协议族内预存了各类通用的应用服务协议。比如说FTP,HTTP等。
传输层:传输层对接上层应用层,提供处于网络连接中两台计算机之间的数据传输所使用的协议。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
网络层:网络层规定了数据通过什么样的方式来传输到对方的计算机。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的所用就是在众多的选项内选择一条传输路线。就跟携程提供的回家路线图作用一样。
链路层: 用来处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
所以一般web网络传输的过程应该是这样的:
发送端在层与层之间传输数据时,每经过一层时会被打上一个该层所属的首部信息。反之,接收端在层与层之间传输数据时,每经过一层时会把对应的首部信息去除。
理解了tcp/ip协议层后,我们就来说说http协议。
http协议,是一种超文本的传输规范。HTTP最初的目的是为了让研究者共享知识信息,所以它的主要作用就是文档传输,它是一种用于传输文档的协议。HTTP是不保存状态的协议,既无状态协议,协议本身对于请求或响应之间的通信状态不进行保存,因此连接双方不能知晓对方当前的身份和状态。这也是Cookie技术产生的重要原因之一:客户端的状态管理。浏览器会根据从服务器端发送的响应报文内 Set-Cookie 首部字段信息自动保持 Cookie。而每次客户端发送 HTTP 请求,都会在请求报文中携带 Cookie,作为服务端识别客户端身份状态的标识。
串行连接、持久连接、管道化持久连接、http/2.0多路复用简介
所以三种请求的区别也就明显了:
串行链接:每次请求都要创建都要创建一个tcp/ip链接。
持久链接:只创建了一个tcp链接,但是每次都需要上一次请求完成才能发起下一次请求。
管道链接:管道化持久连接也可以复用同一个tcp连接,并且可以不用等待发出多个http请求,但是响应必须按顺序返回。
URI:HTTP协议使用 URI 定位互联网上的资源。
http版本:从http发展的历程,现在应该是到了3.0.那么我们来看看这些版本的发展过程。
http1.0:最早的http只是使用在一些较为简单的网页上和网络请求上,所以比较简单,每次请求都打开一个新的TCP链接,收到响应之后立即断开连接。
http1.1:在http1.1的时候,有了较多的更新,主要有以下几点:
Range
头部Host
头部,以区分同一个物理主机中的不同虚拟主机的域名http2.0:这时候出现了俩个非常重要的概念就是帧和流。帧代表数据传输的最小的单位,每个帧都有序列标识表明该帧属于哪个流,流也就是多个帧组成的数据流,每个流表示一个请求。
http3.0:HTTP/2.0 使用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。但当这个连接中出现了丢包的情况,那就会导致整个 TCP 都要开始等待重传,也就导致了后面的所有数据都被阻塞了。反而对于 HTTP/1.0 来说,可以开启多个 TCP 连接,出现丢包反倒只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。 出现包阻塞的原因是因为底层TCP协议导致的问题,但是修改TCP协议是不现实的问题,就像typeof null === 'object'
一样,修改这个问题会导致出现更多的问题。既然不能修改你,那就另起一个协议取代你。Google 基于 UDP 协议推出了一个的 QUIC 协议,并且使用在了 HTTP/3 上。QUIC 基于 UDP,但是UDP本身存在不稳定性等诸多问题,所以QUIC在UDP的基础上新增了很多功能,比如多路复用、0-RTT、使用 TLS1.3 加密、流量控制、有序交付、重传等等功能。
http报文:用于HTTP协议交互的信息被称为HTTP报文。客户端的HTTP报文叫请求报文,服务端的HTTP报文叫响应报文。
http状态码。。。。
http请求方法:
http请求头
通用首部 | 作用(请求报文和响应报文都可能使用) |
---|---|
Cache-Control | 控制缓存的行为:no-cache (强制向服务器再次验证)、no-store (不做任何缓存)、max-age=111111 (资源可缓存最大时间 秒)、public (客户端、代理服务器都可利用缓存)、private (代理服务器不可用缓存) |
Connection | 浏览器想要优先使用的连接类型: keep-alive close (开启和关闭持久连接) |
Date | 创建报文时间 |
Pragma | 只用于请求报文,客户端要求中间服务器不返回缓存的资源 |
Via | 代理服务器相关信息,每经过一个代理服务器就会添加相关信息,用逗号分割 |
Transfer-Encoding | 传输编码方式:chunked 分块传输 |
Upgrade | 要求客户端使用的升级协议,需配合Connection: Upgrade 一起使用:websocket |
Warning | 缓存相关问题的警告 |
请求首部 | 作用(请求报文专用) |
---|---|
Accept | 能正确接收的媒体类型:application/json text/plain |
Accept-Charset | 能正确接收的字符集: unicode-1-1 |
Accept-Encoding | 能正确接收的编码格式列表:gzip deflate |
Accept-Language | 能正确接收的语言列表:zh-cn,zh;1=0.9,en,1=0.8 |
Authorization | 客户端认证信息:Bearer dSdSdFFlsfdjasd123 ,一般存token用 |
Cookie | 发送给服务器的Cookie信息 |
Expect | 期待服务端的指定行为 |
From | 请求方邮箱地址 |
Host | 服务器的域名,用于区分单台服务器多个域名的虚拟主机,是HTTP/1.1唯一必须包含的字段。 |
If-Match | 两端资源标记比较,只有判断条件为真服务端才会接受请求:If-Mach: "123456 ,和服务端文件标记比较 |
If-Modified-Since | 本地资源未修改返回 304(比较时间) |
If-None-Match | 本地资源未修改返回 304(比较标记) |
User-Agent | 客户端信息 |
Max-Forwards | 限制可被代理及网关转发的次数 |
Proxy-Authorization | 向代理服务器发送验证信息 |
Range | 请求某个内容的一部分,配合If-Range 使用 |
Referer | 请求发起页面的原始URI |
TE | 传输编码方式 |
响应首部 | 作用(响应报文专用) |
---|---|
Accept-Ranges | 告知客户端服务器是否可接受范围请求,是bytes ,否none |
Age | 资源在代理缓存中存在的时间 |
ETag | 资源标识,资源发生变化时标识也会发生改变 |
Location | 客户端重定向到某个 URL |
Proxy-Authenticate | 向代理服务器发送验证信息 |
Server | 服务器名字:Apache Nginx |
WWW-Authenticate | 获取资源需要的认证方案 |
Set-Cookie | 需要存在客户端的信息,一般用于识别用户身份 |
实体首部 | 作用(补充请求报文或响应报文相关信息) |
---|---|
Allow | 资源的正确请求方式:GET HEAD POST |
Content-Encoding | 内容的编码格式:gzip deflate |
Content-Language | 内容使用的语言:zh-CN |
Content-Length | request body 长度(即实体主体的大小): |
Content-Location | 返回数据的备用地址 |
Content-MD5 | Base64加密格式的内容 MD5检验值 |
Content-Range | 响应主体的内容范围 |
Content-Type | 内容的媒体类型(如'application/json;charset=UTF-8'则会发送预检请求) |
Expires | 内容的过期时间 |
Last_modified | 内容的最后修改时间 |
web服务器:其实我们并不需要关系是阿帕奇服务器,还是nginx等别的服务器,我们只要关心服务器的功能就好。一台服务器可以作为源服务器,也可以作为中转服务器,甚至可以在一台服务器上搭建多个不同域名的网站。
虚拟主机:代理服务器就是客户端和服务端之间的“中间商”,即HTTP请求通过代理服务器转发给服务器,再将服务器的响应返回给客户端的行为。代理服务器可以用来作为缓存服务器,也可以用来隐藏用户身份(正向代理)或者服务器身份(反向代理)增加安全性。
https: 因为http的传输方式是明文传输,所以,传输的数据就是以一种裸奔的方式来传输的,这样极其不安全,那么就出现了https加密传输协议。
key1
并传给服务端,最后利用加密进行通话。至于安全性,由于私钥是机构的,可以避免第三方伪造证书。并且就算得到了服务端公钥,也无法解密出公钥加密过的对称加密密钥。HTTPS基于HTTP协议,通过SSL或TLS(可以看作SSL3.0)提供加密处理数据、验证对方身份以及数据完整性保护。特点如下:
http和https的区别:
尽管有https但是也并不是就不能被攻击,所以还要有安全方法的意识,请看安全防范的原理。