跳至主要內容

常见网络协议

pptg大约 5 分钟

1. HTTP

1.1 浏览器展示页面过程

一个经典问题:从输入URL到页面展示发生了什么?

dns.png
dns.png
  1. 浏览器输入网址
  2. DNS进行解析
  • 首先尝试在浏览器和本机器hosts中读取缓存
  • 若不存在则访问本地DNS服务器
  • DNS服务器若不存在则以迭代的方式分别访问根服务器(.)、顶级服务器(.com/.cn...)、权限服务器(xxx.com)
  1. 浏览器根据协议头、IP和端口发起连接
  2. 传输层、网络层等继续封装、转发、路由,最后传输完成

1.2 HTTP状态码

状态码类别描述
1XXInformational正在处理
2XXSuccess成功
3XXRedirection重定向
4XXClient Error客户端错误
5XXServer Error服务器错误

1.3 HTTP和HTTPS的区别

HTTPS = HTTP + TLS

HTTPHTTPS
端口80443
协议头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的区别

TCPUDP
是否面向连接
是否可靠
是否有状态
传输效率
传输形式字节流数据报文段
首部开销20-60bytes8bytes
广播或多播服务否(点对点)是(多对多)

2.2 TCP三次握手和四次挥手

2.2.1 建立连接-三次握手

三次握手.png
三次握手.png
  • 一次握手:客户端发送带有 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 断开连接-四次挥手

四次挥手.png
四次挥手.png
  • 一次挥手:客户端发送一个 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如何保证传输的可靠性

  1. 失序重排及去重:TCP每个包都有一个序列号,并将接受的包根据序列号排序和去重
  2. 校验和:TCP保持首部和数据的检验和,如果出错则不对此报文进行确认
  3. 重传机制:超时重传、快速重传、SACK(在快速重传的基础上,返回最近收到的报文段的序列号范围,这样客户端就知道,哪些数据包已经到达服务器了)、D-SACK(重复 SACK,在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了)等
  4. 流量控制:TCP有固定大小的缓冲区,如果来不及处理发送端的数据,则提示对方降低速率,防止丢包
  5. 拥塞控制:当网络拥塞时,减少数据的发送。TCP 在发送数据的时候,需要考虑两个因素:一是接收方的接收能力(滑动窗口),表示接收方还有多少缓冲区可以用来接收数据。二是网络的拥塞程度(拥塞窗口),它是发送方根据网络状况自己维护的一个值,表示发送方认为可以在网络中传输的数据量。发送方发送数据的大小是滑动窗口和拥塞窗口的最小值,这样可以保证发送方既不会超过接收方的接收能力,也不会造成网络的过度拥塞。