关于计网的笔记

https

TLS握手过程

  • Client Hello:报文中选项字段包含客户端支持的 SSL的指定版本和所使用的加密算法等
  • Server Hello: 根据客户端的加密组件筛选自己的加密组件发送, 发送 Certificate 报文。 报文中包含公开密钥证书。服务器同时还提供了一个用作产生密钥的随机数
  • Client Key Exchange: 证书可信, 客户端用随机数和 hash 签名生成一串对称密钥, 用 crt 公钥对对称密钥进行加密
  • 服务端解密后回应

  • 先三次握手建立TCP连接, 再TLS握手

image-20220527090052005

  • 1.2四次握手 1.3两次就可以

    image-20220527090234953

  • 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终止连接)
  • 在三次握手的情况下, 可以在服务端建立连接之前,可以阻止掉了历史连接,从而保证建立的连接不是历史连接。
  • image-20220527094123394

  • TCP 的第一次和第二次握手是不能够携带数据的, 但由于是SYN报文(SYN标志位为1), 会占用一个序列号
  • 第三次的ACK, 不占用序列号, 可以携带数据, 如果不携带数据, 客户端发送的下一个seq和第三次的seq相同

四次挥手

冷知识

  • 四次挥手中,不管是程序主动执行close(),还是进程被杀,都有可能发出第一次挥手FIN包。如果机器上FIN-WAIT-2状态特别多,一般是因为对端一直不执行close()方法发出第三次挥手。

  • Close()会同时关闭发送和接收消息的功能。shutdown() 能单独关闭发送或接受消息。

  • 第二、第三次挥手,是有可能合在一起的(FIN+ACK 或 FIN+ACK+数据)。于是四次挥手就变成三次挥手了。

  • 同一个socket自己连自己,会产生TCP自连接,自连接的挥手是两次挥手。

  • 没有listen,两个客户端之间也能建立连接。这种情况叫TCP同时打开,它由四次握手产生。

  • 参考活久见!TCP两次挥手,你见过吗?那四次握手呢?_程序员乔戈里的博客-CSDN博客