这里写目录标题
- [OSI 的七层模型](#OSI 的七层模型)
- TCP/IP模型
- [HTTP 是什么?](#HTTP 是什么?)
- HTTP状态码
- [HTTP 常见字段](#HTTP 常见字段)
- [GET 和 POST 有什么区别?](#GET 和 POST 有什么区别?)
- [GET 和 POST 方法都是安全和幂等的吗?](#GET 和 POST 方法都是安全和幂等的吗?)
- [HTTP 缓存](#HTTP 缓存)
- [HTTP 优缺点](#HTTP 优缺点)
- [HTTP 性能](#HTTP 性能)
- [HTTP 与 HTTPS](#HTTP 与 HTTPS)
- HTTPS
- HTTPS连接过程与一定可靠吗
- HTTP演进版本
-
- [HTTP/1.1 与 HTTP/1.0](#HTTP/1.1 与 HTTP/1.0)
- [HTTP/2 与 HTTP/1.1](#HTTP/2 与 HTTP/1.1)
- http2缺陷
- http3
OSI 的七层模型
OSI是Open System Interconnect,也就是开放式系统互联,它是国际标准化组织ISO在80年代发布的一个网络互连模型。它把通信协议中必要的部分分成了 7 层,由下到上分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。它们的每一层向下使用服务,向上提供服务。不同节点的对等层按照协议来实现它们之间的通信。OSI七层模型最大的优点就是把服务、接口还有协议这三个概念明确的区分开了,通过模型可以让不同系统的网络之间实现可靠的数据传输.
1、物理层
物理层是模型的最底层,它的主要功能是利用传输介质为数据链路层提供物理连接,实现相邻计算机节点之间比特流的透明传输。
我的理解:它是用光缆、双绞线、无线电波等方式把电脑连接起来的一种物理手段,它负责传送0和1组成的电信号。
此时传输的数据是比特流。
2、数据链路层
数据链路层是OSI模型的第二层,它负责建立和管理节点间的链路。比如从物理层过来的0和1没有意义,必须要指定解读的方式。还有就是把从网络层接到的数据分割成能被物理层传输的帧。也就是提供可靠的通过物理介质传输数据的方法。
此时传输的数据是帧。
3、网络层
网络层是OSI模型的第三层,它在下两层的基础上向上面的资源子网提供服务。它的主要功能是在数据链路层提供的数据帧传送功能上,控制数据链路层和传输层之间的信息转发,然后建立、维护网络的连接,把数据从源端经过若干个中间节点安全传送到目的端,从而向传输层提供最基本的端到端的数据传输服务。
数据链路层的目的是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。
大白话来说网络层其实就是建立了主机到主机的通信。
此时传输的数据是包。
4、传输层
传输层是OSI模型的第4层,模型下3层的任务是数据通信,上3层的任务是数据处理。传输层主要起承上启下的作用,它向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输,同时向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。
我的理解就是我们现在已经有了MAC地址和IP地址,但是还需要一个参数来表示这个数据包到底是这个节点的哪个进程在使用,那这个参数其实就是端口了,那有了这个端口,我们就能实现端到端通信了。
此时传输的数据是tcp报文段 、udp用户数据报。
5、会话层
会话层是OSI模型的第5层,它的主要功能是组织协调两个会话进程之间的通信 ,并对数据交换进行管理。
我的理解是,经过下面几层,我们已经能够建立主机端到端的通信了,但是还需要明确什么时候来建立连接、建立后要保持多久的连接、什么时候断开连接这些问题,那会话层其实就是做了这个工作。
6、表示层
表示层是OSI模型的第六层,它的主要功能是充当应用程序和网络之间的翻译角色,它要处理用户信息的表示问题,如数据的编码、数据格式转换、加密解密等问题。
7、应用层
应用层是OSI参考模型的最高层,它是用户和网络的直接接口,它会提供各种应用层协议来让用户能够与网络进行交互式联系。也就是为应用软件提供接口,让应用程序能够使用网络服务。
TCP/IP模型
TCP/IP模型分为4层结构,从下到上分别依次是网络接口层、网络层、传输层、应用层、
对于同一台设备上的进程来说,它们之间通信有很多种方式,比如有管道、消息队列、共享内存等等,而对于不同设备上的进程间通信,就需要网络通信,因为设备是多样性的有很多种,为了要兼容各种设备上的进程进行通信,就协商出了一套通用的网络协议。这个网络协议是分层的,每一层都有各自的作用和职责。
应用层
首先最上层是我们能直接接触到的就是应用层,我们电脑或手机使用的各种软件和app都是在应用层实现的。它专注于为我们用户来提供应用功能,比如 HTTP、FTP、Telnet等。
应用层是不会去关心数据是如何传输的,当两个不同设备的应用需要通信的时候,应用就把数据传给下一层的传输层。就类似我们寄快递的时候,只需要把包裹交给快递员,由他负责运输快递,我们不需要关心快递是如何被运输的。
传输层
传输层是为应用层提供网络支持的,它会接收来自用户层的数据包。
在传输层会有两个比较重要的传输协议,分别是 TCP 和 UDP。
TCP 的全称叫传输控制协议,大部分应用使用的正是 TCP 传输层协议,比如 HTTP协议。TCP 相比 UDP 有很多特性,比如流量控制、拥塞控制、超时重传等,这些都是为了保证数据包能可靠地传输给对方。
而UDP 相对来说就简单一些,它只负责发送数据包,而不保证数据包是否成功能抵达接收方。它的实时性和传输效率比较高,但不能保证可靠性。
网络层
传输层主要是用来服务应用的,也就是实现应用到应用间的通信,而实际的传输功能是由网络层来负责的。网络层里面使用比较多的是 IP 协议,IP 协议会把传输层的报文加上 IP 包头组装成 IP 报文,然后进行路由寻址发往这个包的目的地。
网络接口层
网络接口层主要工作在网卡这个层次,它负责在以太网、WiFi 这样的底层网络上发送原始数据包,使用 MAC 地址来标识网络上的设备。网络接口层会在数据包的最前面,也就是IP 头部之前加上 MAC 头部,并封装成数据帧发送到网络上。
HTTP 是什么?
HTTP 超文本传输协议,也就是HyperText Transfer Protocol。
关于超文本传输协议,可以这么来看,首先它是一个在计算机世界里两点之间传输数据的约定和规范。只不过它传输的是超文本数据,那所谓超文本数据指的是它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本。所以概括性地来讲,HTTP超文本传输协议是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
HTTP状态码
http状态码可以分为五类:
1xx 类状态码是临时性响应,它属于提示信息,实际用到的比较少。
2xx 类状态码表示服务器成功处理了客户端的请求。
比如常见的[200 OK」表示一切正常。
[204 No Content」它和200 OK 基本相同,但响应头里面没有 body 数据。
3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,其实通常就是重定向。
比如「301」永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次来访问,浏览器会自动重定向到新的 URL。
「302」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
「304」表示资源没有被改过,客户端可以继续使用缓存资源。
4xx 类状态码表示客户端发送的报文有误,服务器无法处理,这就已经是错误码了。
比如「403 Forbidden」表示服务器禁止访问这个资源,并不是客户端的请求出错。
还要最常见的「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以服务器给不了我们。
5xx 类状态码表示客户端请求的报文没问题,但是服务器处理时内部发生了错误,属于服务器端的错误码。
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似"网络服务正忙,请稍后重试"的意思。
HTTP 常见字段
host字段,客户端发送请求时,用host来指定服务器的域名。
Content-Type 字段,用于服务器响应时告诉客户端,本次响应的数据是什么格式。
Content-Length 字段,服务器返回数据时,用 Content-Length 来表明本次响应的数据长度。
GET 和 POST 有什么区别?
GET 和 POST 其实都是 HTTP 的请求方法。
get请求一般用来请求获取资源,这个资源可以是静态文本、页面、图片视频等等。
post请求一般是根据请求对指定资源做出处理,比如提交数据、创建数据。
get请求的参数会显示在地址栏,安全性低,而且浏览器可能也会对参数长度进行限制post请求则是将传递的参数放在请求体里面,不会在地址栏显示,安全性比get请求高,参数没有长度限制。
get请求刷新服务器或者回退没有影响post请求回退时会重新提交数据请求。
GET 和 POST 方法都是安全和幂等的吗?
在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。
所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。
那GET 方法是安全而且幂等的,因为它是「只读」操作,无论读多少次,服务器上的数据都是安全而且不会变的。
POST 的语义是根据请求对指定的资源做出处理。POST 不安全,不幂等。
而且从另外一个角度讲,get请求的参数会显示在地址栏上,这的确可能会导致安全性低,但是HTTP 传输的内容都是明文的,虽然在浏览器地址拦看不到 POST 提交的 body 数据,但是只要抓个包就都能看到了。
所以,要避免传输过程中数据被窃取,就要使用 HTTPS 协议,这样所有 HTTP 的数据都会被加密传输。
HTTP 缓存
HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存。
强缓存 指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。
强缓存是利用Cache-Control和Expires这两个 HTTP 响应头部字段实现的,Cache-Control 的优先级高于 Expires。
当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control并设置过期时间大小;
浏览器第二次访问这个资源时,会先通过请求资源的时间和 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。
协商缓存 一般是在没有命中强制缓存的时候,才会进行协商缓存。我们有些请求的响应码是 304,这个就是服务器告诉浏览器可以使用本地缓存的资源,这种其实就是协商缓存。协商缓存由 Last-Modified / IfModified-Since, Etag /If-None-Match实现,每次请求需要让服务器判断一下资源是否更新过,从而决定浏览器是否使用缓存,如果是,则返回 304,否则重新完整响应。
HTTP 优缺点
HTTP 最突出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」。HTTP 基本的报文格式是 header + body,头部信息也是 key-value 的形式,易于理解。
HTTP 协议里有两个重要的特性分别是无状态和明文传输。
无状态
无状态的好处就是服务器不会去存 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担。但缺点是,由于服务器没有记忆能力,那它在完成有关联性的操作时会比较麻烦。
比如电商登录、下单、结算这系列操作都需要知道用户的身份,但服务器不知道这些请求是有关联的,每次都要验证身份,那这肯定不行。对于无状态的问题,简单的解决方法就是 Cookie。
明文传输
明文意味着在传输过程中的信息比较方便阅读,这就为我们调试带了极大的便利性。缺点就是信息都暴露了。在传输的过程中,信息可能会被窃取。
HTTP 性能
HTTP的性能主要是看连接、请求和应答的这个过程。
早期 HTTP/1.0版本时有一个很大的问题,就是每发起一个请求,都要新建一次 TCP 连接,这会增加许多开销。
在1.1 版本里新增了长连接 的通信方式,只要任意一端没有明确提出断开连接,就保持 TCP 连接状态。这种方式的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
还有就是管道网络传输。然后因为1.1 版本采用了长连接的方式,也改进了请求的模式,早先的请求的方式是在同一个 TCP 连接里面,发送了 A 请求,只有收到服务器的会应后才能再发出 B 请求。那现在是可以连续发多个请求,不用再请求阻塞了,可以减少整体的响应时间。但也有个问题就是服务器的响应问题,如果服务面器在处理前面的请求时耗时比较长,那么后面请求的处理都会被阻塞住。
HTTP 与 HTTPS
HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。
HTTPS 在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
HTTPS 协议需要向证书权威机构申请数字证书,来保证服务器的身份是可信的
HTTPS
HTTP 由于是明文传输,所以安全上存在三个风险:
1、窃听风险,比如通信链路上可以获取通信内容,用户信息泄漏。
2、篡改风险,比如改变网站,强制植入垃圾广告。
3、冒充风险,比如冒充支付网站,骗取用户钱财。
HTTPS主要使用三个方法来解决安全问题。
1、信息混合加密
HTTPS 的混合加密指的是对称加密和非对称加密结合方式,主要是为了保证信息的机密性,它会在通信建立前采用非对称加密的方式来交换「会话秘钥」。之后的通信过程中全部使用对称加密的「会话秘钥」方式来加密明文数据。
2、摘要算法 + 数字签名
为了保证传输的内容不被篡改,计算机会用摘要算法来计算出内容的唯一哈希值,然后同内容一起传输给对方。对方收到后,也会对内容计算出哈希值,只有这两个哈希值相同才说明内容没有被篡改,否则就判断出内容被篡改了。
通过哈希算法可以确保内容不会被篡改,但是并不能保证「内容 + 哈希值」不会被中间人替换,因为这里缺少对客户端收到的消息是否来源于服务端的证明 。那为了避免这种情况,计算机里会用非对称加密算法来解决,私钥由服务端保管,私钥加密对内容的哈希值加密,然后服务端会向客户端颁发对应的公钥。如果客户端收到的信息,能被公钥解密,就说明该消息是由服务器发送的。
3、数字证书
数字证书指的是服务器把自己的公钥注册到数字证书认证机构CA里,CA用自己的私钥为服务器的公钥数字签名然后颁发数字证书。客户端拿到服务器的数字证书之后用CA的公钥检查这个数字证书的真实性。如果确认无误,就从数字证书里拿出来服务器的公钥,用公钥对报文加密然后发出去,最后服务器用自己的私钥来解密。
HTTPS连接过程与一定可靠吗
HTTP演进版本
HTTP/1.1 与 HTTP/1.0
1.1使用长连接的方式改善了 1.0 短连接造成的性能开销。
支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
服务器是按请求的顺序响应的,如果服务器响应慢,会导致客户端一直请求不到数据,也就是队头阻塞;1.1请求和响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
没有请求优先级控制;
请求只能从客户端开始,服务器只能被动响应。
HTTP/2 与 HTTP/1.1
头部压缩
HTTP/2 会压缩Header,同时发出多个请求,它们的Healer是相似的,那么协议会自动消除重复的部分。
二进制格式HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且叫做头部帧和数据帧。因为计算机只懂二进制,那么在收到报文后,就无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。
并发传输在 HTTP/1.1 里的同一个连接中,HTTP 只有完成一个请求响应,才能处理下一个请求响应,这就容易造成队头阻塞的问题。
而 HTTP/2 引出了 Stream 概念, 1 个 TCP 连接会包含多个 Stream,每个Stream 里可以包含 n个Message,Message 对应 HTTP/1 中的请求或响应。Message 里有n个 Frame,Frame 是 HTTP/2 最小单位,以二进制压缩格式存放 HTTP/1 中的内容(头部和包体)。不同的 HTTP 请求它们的 Stream ID 也不一样,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,可以并发不同的 Stream ,所以 HTTP/2 可以并行交错地发送请求和响应。
服务器推送HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务端不再是被动地响应,可以主动向客户端发送消息。客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。