由于最近接触到的一个项目数据有些敏感,所以需要通过加密算法保证数据的安全性。由于公司之前有一套自定义传输协议并且有配套的公共代码导致客户端人员不太愿意使用 WWS 协议。且之前的协议没有协议层的数据加密。所以想参考HTTPS的加密机制使用数据加密来保证传输安全性。遂产生本篇博客。
什么是握手?
像两个人沟通一样,握手是表示一个回话的开始。对于SSL/TLS来说,通过握手建立连接,交换客户端与服务器之间的信息从而生成会话秘钥(主秘钥),用来加密之后的消息。
TCP
状态有几种?通常情况下我们说的 TCP
包状态实际上是 TCP
标志位,目前TCP
标志位主要有以下有6种:
名称 | 英文 | 中文 | 详细说明 |
---|---|---|---|
SYN | synchronous | 同步 | 建立连接,同步状态 |
ACK | acknowledgement | 确认 | 确认上一个包已收到(确认收到) |
PSH | push | 推 | 发送数据 |
FIN | finish | 结束 | 连接结束,不需要发送数据了 |
RST | reset | 重置 | 重置连接状态(重新连接) |
URG | urgent | 紧急 | TCP 带外数据相关,基本不会用到 |
其中URG 在实际使用中属于百年一见的类型,所以我们就不与介绍了,主要介绍这些常见的TCP 标志位。 |
|||
# 一次正常的TCP 连接都会发送那些包? |
|||
接下来,我们通过看一个完整的TCP 交互都有哪些流程,对应包又是什么样。 |
|||
1. 建立连接 | |||
客户端操作 | 包 | 方向 | 包 |
:– | :– | :– | :– |
connect | SYN | >>>>>> | |
connect | <<<<<< | SYN,ACK | |
connect_end | ACK | >>>>>> | |
2. 服务器读,客户端写 | |||
客户端操作 | 包 | 方向 | 包 |
:– | :– | :– | :– |
write | PSH | >>>>>> | |
write_end | <<<<<< | ACK | |
3. 客户端读,服务器写 | |||
客户端操作 | 包 | 方向 | 包 |
:– | :– | :– | :– |
<<<<<< | |||
ACK | >>>>>> | ||
read | |||
4. 服务端断开连接 | |||
客户端操作 | 包 | 方向 | 包 |
:– | :– | :– | :– |
<<<<<< | |||
ACK | >>>>>> | ||
6. 客户端断开连接 | |||
客户端操作 | 包 | 方向 | 包 |
:– | :– | :– | :– |
shutdown | FIN | >>>>>> | |
<<<<<< | |||
7. 服务器,客户端双方释放本地资源(内存,句柄等) | |||
客户端操作 | 包 | 方向 | 包 |
:– | :– | :– | :– |
close(释放资源) |