WebSocke
1. DNS 解析2. 建立 TCP 连接客户端服务器3. 网卡处理4. WebSocket 握手(Handshake)客户端服务器5. WebSocket 数据传输客户端和服务器6. 消息收发客户端服务器7. 关闭连接客户端和服务器详细的 TCP 通信流程
1. DNS 解析
- 客户端:根据 WebSocket URL 解析出服务器的 IP 地址。
2. 建立 TCP 连接
客户端
- 创建套接字:调用
socket()
创建一个 TCP 套接字。
- 连接服务器:调用
connect()
方法连接到服务器的 IP 地址和端口。
服务器
- 创建套接字:调用
socket()
创建一个 TCP 套接字。
- 绑定地址和端口:调用
bind()
方法将套接字绑定到特定的 IP 地址和端口。
- 监听连接:调用
listen()
方法,使套接字进入监听模式,等待客户端连接。
- 接受连接:调用
accept()
方法接受客户端连接,生成一个新的套接字用于通信。
3. 网卡处理
- 客户端和服务器的网卡:在建立连接时,网卡会根据 IP 地址和端口号在网络上发送和接收数据包。
4. WebSocket 握手(Handshake)
客户端
- 发送握手请求:通过 TCP 连接发送包含特定头部信息的 HTTP 请求,如
Upgrade: websocket
,Connection: Upgrade
,Sec-WebSocket-Key
等。
服务器
- 接收握手请求:通过 TCP 连接接收客户端的 HTTP 请求。
- 验证请求并生成响应:验证请求头信息并生成包含
101 Switching Protocols
状态码的响应,添加Sec-WebSocket-Accept
头部信息。
- 发送握手响应:通过 TCP 连接发送握手响应。
5. WebSocket 数据传输
客户端和服务器
- 建立连接后:客户端和服务器可以开始通过 WebSocket 协议发送和接收数据帧。
- 封装和解析数据帧:每个数据帧包含控制信息和数据负载,双方通过解析帧头来获取数据。
6. 消息收发
客户端
- 发送消息:调用 WebSocket API 将消息封装成帧并通过 TCP 连接发送。
- 接收消息:监听 TCP 连接,解析接收到的帧获取消息。
服务器
- 发送消息:将消息封装成帧并通过 TCP 连接发送。
- 接收消息:监听 TCP 连接,解析接收到的帧获取消息。
7. 关闭连接
客户端和服务器
- 发送关闭帧:当某一方决定关闭连接时,发送一个特殊的 WebSocket 关闭帧。
- 接收关闭帧并响应:接收方收到关闭帧后,发送一个关闭帧作为响应。
- 关闭 TCP 连接:双方调用
close()
方法关闭 TCP 套接字。
详细的 TCP 通信流程
- TCP 三次握手:
- 客户端发送 SYN 包到服务器。
- 服务器接收 SYN 包并返回 SYN-ACK 包。
- 客户端接收 SYN-ACK 包并发送 ACK 包,完成连接建立。
- 数据传输:
- 数据通过 TCP 连接传输,TCP 协议负责数据包的分段、传输、重组和确认。
- 网卡处理传输过程中的数据包物理传输。
- TCP 四次挥手:
- 一方发送 FIN 包请求关闭连接。
- 另一方接收 FIN 包并返回 ACK 包。
- 另一方发送 FIN 包请求关闭连接。
- 初始方接收 FIN 包并返回 ACK 包,完成连接关闭。
通过这些步骤,WebSocket 可以在 TCP 的基础上建立和维持高效的双向通信连接。
Loading...