一、OSI 参考模型 与 TCP/IP 五层模型
我们主要关注于 TCP/IP 五层模型的应用层和传输层就足够了。
应用层:
- 作用:为应用程序提供服务。
- 常见协议:HTTP、HTTPS、FTP、POP3、SMTP等。
传输层:
- 作用:实现应用程序之间的数据传输。
- 协议:UDP、TCP
二、UDP 与 TCP
1. UDP
UDP 是面向无连接的协议,它只会把数据传递给接收端,但不会关注接收端是否已经正确接收了数据,所以有时候 UDP 会被认为是不可靠的数据报协议。但这种特性反而适合多播,实时的视频和音频传输。
优点:
- 无需建立连接(减少了延迟)
- 实现简单(效率高)
- 头部开销小( 8 字节)
- 没有拥塞控制(更好的控制发送时间和速率)
缺点:
- 没有建立连接(数据想发就发,不可靠)
- 没有拥塞控制(网络条件不好时会导致丢包)
2. TCP
TCP 是面向有连接的协议,在使用 TCP 协议 传输数据之前一定需要在发送方和接收方之间建立连接。建立连接三次握手,断开连接四次挥手~
(1) 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 状态。此时连接建立成功。
这个过程可以用以下三句形象表示:
- (客户端):我想建立连接了,服务端你准备好没有呀?
- (服务端):我准备好了,你准备好没有?
- (客户端):我也准备好了,开始吧~
(2) TCP 关闭连接四次挥手
这个过程可以用以下四句句形象表示:
- (客户端):我想关闭连接了。
- (服务端):我知道了。
- (服务端):我现在准备关闭连接了,ok 吗?
- (客户端):ok,你关闭吧。
3. UDP 与 TCP 的区别
- UDP 协议是面向无连接的,它不能保证数据有序且不丢失的传到对端,但是 UDP 比 TCP 更高效。
- TCP 协议是面向有连接的,建立和断开连接都需要握手,在传输数据的过程中,通过滑动窗口(流量控制)、拥塞处理(慢开始,拥塞避免,快速重传,快速恢复),能够正确处理丢包问题,保证接收方能够收到数据,与此同时还能够有效利用网络带宽。
三、HTTP
HTTP (HyperText Transfer Protocol) 超文本传输协议 是一个基于 TCP (传输层) 的应用层协议,是客户端与服务端之间请求和响应的标准。
主要特点:
- 简单快速:客户端向服务器请求服务时,只需请求方法和请求路径。
- 无状态:客户端再次向服务器请求服务时,服务器并不知道客户端之前是否请求过。
- 无连接:每次请求都会建立一个 TCP 连接,请求处理完成后连接断开。
HTTP 报文:
(1)请求行:GET https://www.baidu.com/ HTTP/1.1 由请求方法、URL、协议版本组成
(2)响应行:
- 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