共计 2436 个字符,预计需要花费 7 分钟才能阅读完成。
前端主要关注于应用层的 HTTP 协议,传输层的 TCP 协议, 断舍离一下,就主要总结这两种协议了。
OSI 参考模型 与 TCP/IP 五层模型
我们主要关注于 TCP/IP 五层模型 的 应用层 和 传输层 就足够了。
应用层:
作用:为应用程序提供服务。
常见协议:HTTP、HTTPS、FTP、POP3、SMTP 等。
传输层:
作用:实现应用程序之间的数据传输。
协议:UDP、TCP
UDP 与 TCP
UDP
UDP 是面向无连接的协议,它只会把数据传递给接收端,但不会关注接收端是否已经正确接收了数据,所以有时候 UDP 会被认为是不可靠的数据报协议。但这种特性反而适合多播,实时的视频和音频传输。
优点:
无需建立连接(减少了延迟)
实现简单(效率高)
头部开销小(8 字节)
没有拥塞控制(更好的控制发送时间和速率)
缺点:
没有建立连接(数据想发就发,不可靠)
没有拥塞控制(网络条件不好时会导致丢包)
TCP
TCP 是面向有连接的协议,在使用 TCP 协议 传输数据之前一定需要在发送方和接收方之间建立连接。建立连接三次握手,断开连接四次挥手~
TCP 建立连接三次握手
第一次握手:
客户端向服务端发送一个 SYN(Seq=X)包,客户端进入 SYN-SENT 状态,等待服务端的 ACK(Ack=X+1)回复。ps: Seq 是序号,Ack 是确认序号。
第二次握手:
服务端根据接收到客户端发来的 SYN(Seq=X)包后返回一个 ACK(Ack=X+1)以及 SYN(Seq=Y)包给客户端,服务端进入 SYN-RECIVED 状态,等待客户端的 ACK(Ack=Y+1)回复。
第三次握手:
客户端接收到 ACK(X+1)后,进入 ESTABLISHED 状态。根据服务端发来的 SYN(Y)返回一个 ACK(Y+1)包给服务端。服务端 接收 ACK(Y+1)后进入 ESTABLISHED 状态。此时连接建立成功。
这个过程可以用以下三句形象表示:
(客户端):我想建立连接了,服务端你准备好没有呀?
(服务端):我准备好了,你准备好没有?
(客户端):我也准备好了,开始吧~
TCP 关闭连接四次挥手
这个过程可以用以下四句句形象表示:
(客户端):我想关闭连接了。
(服务端):我知道了。
(服务端):我现在准备关闭连接了,ok 吗?
(客户端):ok,你关闭吧。
UDP 与 TCP 的区别
UDP 协议是面向无连接的,它不能保证数据有序且不丢失的传到对端,但是 UDP 比 TCP 更高效。
TCP 协议是面向有连接的,建立和断开连接都需要握手,在传输数据的过程中,通过滑动窗口(流量控制)、拥塞处理(慢开始,拥塞避免,快速重传,快速恢复),能够正确处理丢包问题,保证接收方能够收到数据,与此同时还能够有效利用网络带宽。
HTTP
HTTP (HyperText Transfer Protocol) 超文本传输协议 是一个基于 TCP (传输层) 的应用层协议,是客户端与服务端之间请求和响应的标准。
主要特点
简单快速
客户端向服务器请求服务时,只需请求方法和请求路径。
无状态
客户端再次向服务器请求服务时,服务器并不知道客户端之前是否请求过。
无连接
每次请求都会建立一个 TCP 连接,请求处理完成后连接断开。
HTTP 报文
请求行:
GET https://www.baidu.com/ HTTP/1.1 由请求方法、URL、协议版本组成
响应行:
HTTP/1.1 200 OK 协议版本、状态码、状态信息组成
HTTP 请求方法
请求方法分为很多种,最常用的也就是 GET 和 POST 了。虽然请求方法很多,但更多的是为了传达语义。更多的方法的语义描述可以阅读 文档。
GET 和 POST 的区别
GET
能缓存、请求长度限制、有历史记录 GET 多用于 无副作用 (不修改资源)、幂等(请求次数与资源无关) 的场景。
POST
POST 相对 GET 安全一点点,因为 GET 请求发送的数据包含在 URL 里。
两者详细对比:![GET 与 POST](https://inknight.cn/pic/note/…)
状态码
状态码表示了响应的状态,可以让我们知道这一次的请求是成功还是失败,如果失败,是什么原因导致的。
2XX 成功
200 OK,请求成功并返回数据
204 No Content,成功但无内容
206 Partial Content , 范围请求
3XX 重定向
301 永久重定向,表示资源已被分配了新的 URL
302 临时重定向,资源临时被分配新的 URL
304 资源未修改,可使用缓存
4XX 客户端错误
400 请求语法错误
401 要求身份认证
403 请求被服务器拒绝
404 资源不存在
5XX 服务器错误
500 服务器错误
503 服务器超负载或停机维护
HTTPS
更安全的网络传输协议
需要安装证书(公钥)
经过 SSL/TLS 协议 加密,传输的内容是经过加密的
使用 443 端口
HTTP/2
多路复用
在同一个 TCP 连接上传输所有的请求数据,避免 队头阻塞 (浏览器限制同一个域名下的连接数) 问题
Header 压缩
使用了 HPACK 压缩格式对传输的 header 进行编码,减少了 header 的大小。并在两端维护了索引表,用于记录出现过的 header,避免 header 重复传输。
二进制传输
在之前的 HTTP 版本中,我们是通过文本的方式传输数据。在 HTTP/2 中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。
服务端推送
服务端可以在客户端的某个请求后,主动推送其他客户端在之后会用到的资源。省去了客户端重复请求的步骤,降低了延迟。
参考资料:
https://juejin.im/post/5c64d15d6fb9a049d37f9c20#heading-49
https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A?
http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/
https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5bdc72b151882516f039fce3