网络协议
网络协议模型
- 分层
物理层-网络基石
- 连接不同的物理设备,传输比特流。为上层协议提供了一个传输数据的可靠的物理介质。
数据链路层-确保数据的完整性
- 通过以太网协议将物理层的数据包封装成帧,根据帧上的mac地址将数据传输到另一个节点,为下一层网络层提供可靠的传输
网络层-数据的路由
- 物理设备通过使用网络层的IP协议,屏蔽了物理网络之间的差异;当网络中主机使用IP协议连接时,无需关注网络细节,于是形成了虚拟网络
传输层-确保数据的可靠传输
- 传输层就像是一个快递分拣中心,它负责将数据分割成合适的大小(称为段),并为每个段添加端口号等信息,确保数据能够准确地交付到目标设备上的正确应用程序。
应用层-提供网络服务
- 应用层就像是各种网络应用的 “门面”,它包含了我们日常使用的各种网络应用程序,如网页浏览器、电子邮件客户端、即时通讯软件等。当数据到达应用层后,会被相应的应用程序解析和处理
三次握手
TCP的三次握手(建立连接)
三次握手是 TCP 建立连接的过程,目的是确保客户端和服务器双方都能正常发送和接收数据。
- 第一次握手(SYN) :
- 客户端向服务器发送一个 SYN(Synchronize)报文,表示请求建立连接。
- 报文中包含一个随机生成的序列号(Seq = x)。
- 客户端进入
SYN_SENT
状态。
- 第二次握手(SYN+ACK) :
- 服务器收到 SYN 报文后,向客户端发送一个 SYN + ACK(Acknowledge)报文,表示同意建立连接。
- 报文中包含:
- 服务器生成的序列号(Seq = y)。
- 确认号(Ack = x + 1),表示已收到客户端的 SYN 报文。
- 服务器进入
SYN_RECEIVED
状态。
- 第三次握手(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 断开连接的过程,目的是确保双方都能正常关闭连接,并且数据能够完整传输。
- 第一次挥手(FIN):
- 客户端向服务器发送一个 FIN(Finish)报文,表示请求关闭连接。
- 客户端进入 FIN_WAIT_1 状态。
- 第二次挥手(ACK):
- 服务器收到 FIN 报文后,向客户端发送一个 ACK 报文,表示已收到关闭请求。
- 服务器进入 CLOSE_WAIT 状态。
- 客户端收到 ACK 报文后,进入 FIN_WAIT_2 状态。
- 第三次挥手(FIN):
- 服务器完成数据发送后,向客户端发送一个 FIN 报文,表示服务器也准备关闭连接。
- 服务器进入 LAST_ACK 状态。
- 第四次挥手(ACK):
- 客户端收到 FIN 报文后,向服务器发送一个 ACK 报文,表示已收到服务器的关闭请求。
- 客户端进入 TIME_WAIT 状态,等待一段时间(2MSL)后关闭连接。
- 服务器收到 ACK 报文后,关闭连接。
Java
客户端 服务器
| |
| FIN (Seq=u) |
| -----------------------------> |
| |
| ACK (Ack=u+1) |
| <----------------------------- |
| |
| FIN (Seq=w) |
| <----------------------------- |
| |
| ACK (Ack=w+1) |
| -----------------------------> |
| |
HTTP传输过程
HTTPS加密原理
HTTPS 通过 SSL/TLS 协议实现了数据的加密、身份验证和完整性保护。其核心原理是在握手阶段使用非对称加密协商对称加密密钥,然后在数据传输阶段使用对称加密保护数据。 以下是 HTTPS 的详细工作流程:
- 客户端发起请求(Client Hello)
- 客户端向服务器发送一个 Client Hello 消息,包含以下信息:
- 支持的 SSL/TLS 版本。
- 支持的加密算法列表(Cipher Suites)。
- 一个随机数(Client Random),用于后续密钥生成。
- 服务器响应(Server Hello)
- 服务器向客户端发送一个 Server Hello 消息,包含以下信息:
- 选择的 SSL/TLS 版本。
- 选择的加密算法。
- 一个随机数(Server Random),用于后续密钥生成。
- 服务器还会发送自己的数字证书,证书中包含服务器的公钥和域名信息。
- 客户端验证证书
- 客户端验证服务器的数字证书:
- 检查证书是否由受信任的证书颁发机构(CA)签发。
- 检查证书是否在有效期内。
- 检查证书中的域名是否与访问的域名一致。
- 如果验证通过,客户端会生成一个随机数(Pre-Master Secret),并使用服务器的公钥加密后发送给服务器。
- 服务器解密 Pre-Master Secret
- 服务器使用自己的私钥解密客户端发送的 Pre-Master Secret。
- 生成对称加密密钥
- 客户端和服务器使用 Client Random、Server Random 和 Pre-Master Secret 生成相同的对称加密密钥(Master Secret)。
- 该密钥将用于后续的数据加密和解密。
- 完成握手
- 客户端和服务器互相发送 Finished 消息,验证握手过程是否成功。
- 握手完成后,双方开始使用对称加密密钥进行数据传输。
- 数据传输
- 客户端和服务器使用对称加密密钥加密和解密数据,确保数据传输的隐私性和完整性。
各层问题排查工具
- 应用层,Chrome浏览器, 开发者工具,可以查看当前连接的服务端IP(remote address),以及查看请求耗时,清除Cookie(Application 页, Storage -> Cookie)等
- 表示层和会话层,主要是TLS协议,可以在浏览器查看TLS证书,TLS握手,密钥交换,密文传输等还需tcpdump或wireshark
- 传输层
- 路径可达性,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丢包和延迟等