关于计网的笔记
关于计网的笔记
https
TLS握手过程
- Client Hello:报文中选项字段包含客户端支持的 SSL的指定版本和所使用的加密算法等
- Server Hello: 根据客户端的加密组件筛选自己的加密组件发送, 发送 Certificate 报文。 报文中包含公开密钥证书。服务器同时还提供了一个用作产生密钥的随机数
- Client Key Exchange: 证书可信, 客户端用随机数和 hash 签名生成一串对称密钥, 用 crt 公钥对对称密钥进行加密
- 服务端解密后回应
- 先三次握手建立TCP连接, 再TLS握手
1.2四次握手 1.3两次就可以
HTTPS 中的 TLS 握手过程可以同时进行三次握手必须满足两个条件
- 客户端和服务端都开启了 TCP Fast Open 功能,且 TLS 版本是 1.3;
- 客户端和服务端已经完成过一次通信。
三次握手
SYN洪泛攻击
- 原理: 只有两次握手
- 客户端发送SYN后, 服务器收到后进入半开连接状态, 此时会为这次连接分配资源, 如果没有收到第三次握手, 会等待一段时间才释放资源
- 防止手段: SYN cookie
- 在二次握手时服务器不分配资源, 而是生成一个初始的序列号:该序列号是 “SYN报文段中的源和目的IP地址与端口号以及一个只有服务器自己知道的秘密数 (secret number) ” 的hash值
- 如果没有第三次, 对服务器无影响, 如果有第三次, 服务器根据ip和端口号以及秘密数计算出序列号, 加一后和ACK的确认号对比, 相同才创建连接
两次握手会造成什么
- 在这种情况下, 服务端回复SYN+ACK便认为连接建立, 就会发送数据
- 如果客户端第一次的SYN没有及时得到响应, 便会第二次SYN, 第二次正常传输完成后, 第一次的SYN到达服务器, 这时客户端并不需要连接, 处于CLOSED状态, 对于服务端发来的数据也是直接丢弃(当然客户端发现服务端总是给自己发送, 而自己总是丢弃, 会发送RST终止连接)
- 在三次握手的情况下, 可以在服务端建立连接之前,可以阻止掉了历史连接,从而保证建立的连接不是历史连接。
- TCP 的第一次和第二次握手是不能够携带数据的, 但由于是SYN报文(SYN标志位为1), 会占用一个序列号
- 第三次的ACK, 不占用序列号, 可以携带数据, 如果不携带数据, 客户端发送的下一个seq和第三次的seq相同
四次挥手
冷知识
四次挥手中,不管是程序主动执行close(),还是进程被杀,都有可能发出第一次挥手FIN包。如果机器上FIN-WAIT-2状态特别多,一般是因为对端一直不执行close()方法发出第三次挥手。
Close()会同时关闭发送和接收消息的功能。shutdown() 能单独关闭发送或接受消息。
第二、第三次挥手,是有可能合在一起的(FIN+ACK 或 FIN+ACK+数据)。于是四次挥手就变成三次挥手了。
同一个socket自己连自己,会产生TCP自连接,自连接的挥手是两次挥手。
没有listen,两个客户端之间也能建立连接。这种情况叫TCP同时打开,它由四次握手产生。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.