Skip to content

网络协议

参考:从铜线到云端:网络技术的跨越与未来趋势

网络协议模型

  • 分层

1744802393438

1744802427001

1744802481509

1744802491462

物理层-网络基石

  • 连接不同的物理设备,传输比特流。为上层协议提供了一个传输数据的可靠的物理介质。
  • 1744802528838

数据链路层-确保数据的完整性

  • 通过以太网协议将物理层的数据包封装成帧,根据帧上的mac地址将数据传输到另一个节点,为下一层网络层提供可靠的传输

1744802566104

网络层-数据的路由

  • 物理设备通过使用网络层的IP协议,屏蔽了物理网络之间的差异;当网络中主机使用IP协议连接时,无需关注网络细节,于是形成了虚拟网络

1744802592698

传输层-确保数据的可靠传输

  • 传输层就像是一个快递分拣中心,它负责将数据分割成合适的大小(称为段),并为每个段添加端口号等信息,确保数据能够准确地交付到目标设备上的正确应用程序。

应用层-提供网络服务

  • 应用层就像是各种网络应用的 “门面”,它包含了我们日常使用的各种网络应用程序,如网页浏览器、电子邮件客户端、即时通讯软件等。当数据到达应用层后,会被相应的应用程序解析和处理

三次握手

TCP的三次握手(建立连接)

三次握手是 TCP 建立连接的过程,目的是确保客户端和服务器双方都能正常发送和接收数据。

  1. 第一次握手(SYN)
  • 客户端向服务器发送一个 SYN(Synchronize)报文,表示请求建立连接。
  • 报文中包含一个随机生成的序列号(Seq = x)。
  • 客户端进入 SYN_SENT 状态。
  1. 第二次握手(SYN+ACK)
  • 服务器收到 SYN 报文后,向客户端发送一个 SYN + ACK(Acknowledge)报文,表示同意建立连接。
  • 报文中包含:
    • 服务器生成的序列号(Seq = y)。
    • 确认号(Ack = x + 1),表示已收到客户端的 SYN 报文。
  • 服务器进入 SYN_RECEIVED 状态。
  1. 第三次握手(ACK)
  • 客户端收到 SYN + ACK 报文后,向服务器发送一个 ACK 报文,表示连接已建立。
  • 报文中包含:
    • 确认号(Ack = y + 1),表示已收到服务器的 SYN 报文。
  • 客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。
Java
客户端                           服务器
  |                                |
  |          SYN (Seq=x)           |
  | -----------------------------> |
  |                                |
  |     SYN + ACK (Seq=y, Ack=x+1) |
  | <----------------------------- |
  |                                |
  |          ACK (Ack=y+1)         |
  | -----------------------------> |
  |                                |

TCP 的四次挥手(断开连接) 四次挥手是 TCP 断开连接的过程,目的是确保双方都能正常关闭连接,并且数据能够完整传输。

  1. 第一次挥手(FIN):
  • 客户端向服务器发送一个 FIN(Finish)报文,表示请求关闭连接。
  • 客户端进入 FIN_WAIT_1 状态。
  1. 第二次挥手(ACK):
  • 服务器收到 FIN 报文后,向客户端发送一个 ACK 报文,表示已收到关闭请求。
  • 服务器进入 CLOSE_WAIT 状态。
  • 客户端收到 ACK 报文后,进入 FIN_WAIT_2 状态。
  1. 第三次挥手(FIN):
  • 服务器完成数据发送后,向客户端发送一个 FIN 报文,表示服务器也准备关闭连接。
  • 服务器进入 LAST_ACK 状态。
  1. 第四次挥手(ACK):
  • 客户端收到 FIN 报文后,向服务器发送一个 ACK 报文,表示已收到服务器的关闭请求。
  • 客户端进入 TIME_WAIT 状态,等待一段时间(2MSL)后关闭连接。
  • 服务器收到 ACK 报文后,关闭连接。
Java
客户端                           服务器
  |                                |
  |          FIN (Seq=u)           |
  | -----------------------------> |
  |                                |
  |          ACK (Ack=u+1)         |
  | <----------------------------- |
  |                                |
  |          FIN (Seq=w)           |
  | <----------------------------- |
  |                                |
  |          ACK (Ack=w+1)         |
  | -----------------------------> |
  |                                |

HTTP传输过程

1744802833238

HTTPS加密原理

HTTPS 通过 SSL/TLS 协议实现了数据的加密、身份验证和完整性保护。其核心原理是在握手阶段使用非对称加密协商对称加密密钥,然后在数据传输阶段使用对称加密保护数据。 以下是 HTTPS 的详细工作流程:

  1. 客户端发起请求(Client Hello)
  • 客户端向服务器发送一个 Client Hello 消息,包含以下信息:
    • 支持的 SSL/TLS 版本。
    • 支持的加密算法列表(Cipher Suites)。
    • 一个随机数(Client Random),用于后续密钥生成。
  1. 服务器响应(Server Hello)
  • 服务器向客户端发送一个 Server Hello 消息,包含以下信息:
    • 选择的 SSL/TLS 版本。
    • 选择的加密算法。
    • 一个随机数(Server Random),用于后续密钥生成。
  • 服务器还会发送自己的数字证书,证书中包含服务器的公钥和域名信息。
  1. 客户端验证证书
  • 客户端验证服务器的数字证书:
    • 检查证书是否由受信任的证书颁发机构(CA)签发。
    • 检查证书是否在有效期内。
    • 检查证书中的域名是否与访问的域名一致。
  • 如果验证通过,客户端会生成一个随机数(Pre-Master Secret),并使用服务器的公钥加密后发送给服务器。
  1. 服务器解密 Pre-Master Secret
  • 服务器使用自己的私钥解密客户端发送的 Pre-Master Secret。
  1. 生成对称加密密钥
  • 客户端和服务器使用 Client Random、Server Random 和 Pre-Master Secret 生成相同的对称加密密钥(Master Secret)。
  • 该密钥将用于后续的数据加密和解密。
  1. 完成握手
  • 客户端和服务器互相发送 Finished 消息,验证握手过程是否成功。
  • 握手完成后,双方开始使用对称加密密钥进行数据传输。
  1. 数据传输
  • 客户端和服务器使用对称加密密钥加密和解密数据,确保数据传输的隐私性和完整性。

各层问题排查工具

  • 应用层,Chrome浏览器, 开发者工具,可以查看当前连接的服务端IP(remote address),以及查看请求耗时,清除Cookie(Application 页, Storage -> Cookie)等
  • 表示层和会话层,主要是TLS协议,可以在浏览器查看TLS证书,TLS握手,密钥交换,密文传输等还需tcpdump或wireshark 1744802899263
  • 传输层
    • 路径可达性,telnet, nc
    • 查看当前连接状况,netstat -ant
    • 查看当前连接的传输速率,iftop
    • 查看丢包和乱序等统计, netstat -s/watch --diff netstat -s/ss -s
Java
root@LAPTOP-XINZHANG:~# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 10.255.255.254:53       0.0.0.0:*               LISTEN
  • 网络层
    • 查看网络路径状况: traceroute, mtr
    • 查看路由: route, netstat -r, ip route -数据链路层和物理层: 一般由专职的网络团队负责, 这一层的问题会直接体现在网络层表现上, 如IP丢包和延迟等 1744802971146