常见网络协议
大约 5 分钟
1. HTTP
1.1 浏览器展示页面过程
一个经典问题:从输入URL到页面展示发生了什么?

- 浏览器输入网址
- DNS进行解析
- 首先尝试在浏览器和本机器hosts中读取缓存
- 若不存在则访问本地DNS服务器
- DNS服务器若不存在则以迭代的方式分别访问根服务器(.)、顶级服务器(.com/.cn...)、权限服务器(xxx.com)
- 浏览器根据协议头、IP和端口发起连接
- 传输层、网络层等继续封装、转发、路由,最后传输完成
1.2 HTTP状态码
状态码 | 类别 | 描述 |
---|---|---|
1XX | Informational | 正在处理 |
2XX | Success | 成功 |
3XX | Redirection | 重定向 |
4XX | Client Error | 客户端错误 |
5XX | Server Error | 服务器错误 |
1.3 HTTP和HTTPS的区别
HTTPS = HTTP + TLS
HTTP | HTTPS | |
---|---|---|
端口 | 80 | 443 |
协议头 | http:// | https:// |
安全性 | 明文 | 加密,同时也带来资源消耗 |
1.4 HTTP 1.0、1.1、2.0和3.0的区别
1.4.1 HTTP/1.0 -> HTTP/1.1
- 连接方式: HTTP/1.0短连接,HTTP/1.1长短连接
- 状态相应码: HTTP/1.0较少,HTTP/1.1增加了很多
- 缓存机制: HTTP/1.0使用
If-Modified-Since、Expires
;HTTP/1.1引入了更多机制Entity tag,If-Unmodified-Since, If-Match, If-None-Match
- 断点续传: HTTP/1.1支持断点续传
- Host头: HTTP/1.1支持同一IP地址上托管多个域名,从而支持虚拟主机的功能
1.4.2 HTTP/1.1 -> HTTP/2.0
grpc底层就是用的HTTP/2.0,性能十分强劲
- 多路复用: HTTP/2.0可在同一连接上同时传输多个请求和相应
- 二进制帧: HTTP/1.1使用文本格式报文、HTTP/2.0使用二进制帧,更加紧凑高效
- 头部压缩: HTTP/2.0使用HPACK算法对Header进行压缩,减小了网络开销
- 服务器推送:HTTP/2.0支持服务器推送,可以在客户端请求资源时,将其他相关资源一并推送给客户端
1.4.3 HTTP/2.0 -> HTTP/3.0
- 传输协议: HTTP/2.0是TCP,HTTP/3.0是QUIC(Quick UDP Internet Connections),QUIC在UDP的基础上实现了加密、重传、可靠传输,相比TLS更安全
- 连接建立: HTTP/2.0三次握手,HTTP/3.0仅需要1-2次
- 队头阻塞: HTTP/2.0多请求复用一个TCP连接,一旦发生丢包,就会阻塞住所有的HTTP请求;HTTP/3.0在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其他数据流不受影响(本质上是多路复用+轮询)
2. TCP和UDP
2.1 TCP和UDP的区别
TCP | UDP | |
---|---|---|
是否面向连接 | 是 | 否 |
是否可靠 | 是 | 否 |
是否有状态 | 是 | 否 |
传输效率 | 慢 | 快 |
传输形式 | 字节流 | 数据报文段 |
首部开销 | 20-60bytes | 8bytes |
广播或多播服务 | 否(点对点) | 是(多对多) |
2.2 TCP三次握手和四次挥手
2.2.1 建立连接-三次握手

- 一次握手:客户端发送带有 SYN(SEQ=x)标志的数据包 -> 服务端,然后客户端进入SYN_SEND状态,等待服务端的确认;Server确认了Client发送正常,自身接受正常
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态;Client确认了双方发送接受都正常;Server确认了自身接受正常、Client发送正常
- 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手;双方确认所有功能正常
注: 第三次握手时可以携带数据传输
2.2.2 断开连接-四次挥手

- 一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务端的数据传送;然后客户端进入 FIN-WAIT-1 状态
- 二次挥手:服务端收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态
- 三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态
- 四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。
注: 只要四次挥手没有结束,客户端和服务端就可以继续传输数据
2.3 TCP如何保证传输的可靠性
- 失序重排及去重:TCP每个包都有一个序列号,并将接受的包根据序列号排序和去重
- 校验和:TCP保持首部和数据的检验和,如果出错则不对此报文进行确认
- 重传机制:超时重传、快速重传、SACK(在快速重传的基础上,返回最近收到的报文段的序列号范围,这样客户端就知道,哪些数据包已经到达服务器了)、D-SACK(重复 SACK,在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了)等
- 流量控制:TCP有固定大小的缓冲区,如果来不及处理发送端的数据,则提示对方降低速率,防止丢包
- 拥塞控制:当网络拥塞时,减少数据的发送。TCP 在发送数据的时候,需要考虑两个因素:一是接收方的接收能力(滑动窗口),表示接收方还有多少缓冲区可以用来接收数据。二是网络的拥塞程度(拥塞窗口),它是发送方根据网络状况自己维护的一个值,表示发送方认为可以在网络中传输的数据量。发送方发送数据的大小是滑动窗口和拥塞窗口的最小值,这样可以保证发送方既不会超过接收方的接收能力,也不会造成网络的过度拥塞。