共计 1009 个字符,预计需要花费 3 分钟才能阅读完成。
HTTP
TLS,关于安全
三次握手和四次挥手
浏览器输入 url 到页面呈现,经过的过程,
DNS 解析 IP 地址
请求资源
HTTP 三次握手
网页渲染
三次握手
SYN 客户端选择一个随机序列号 x,并发送一个 SYN 分组,其中可能还包括其他 TCP 标志和选项。
SYN ACK 服务器给 x 加 1,并选择自己的一个随机序列号 y,追加自己的标志和选项,然后返回响应。
ACK 客户端给 x 和 y 加 1 并发送握手期间的最后一个 ACK 分组。
四次挥手
TCP 客户端发送一个 FIN,用来关闭客户到服务器的数据传送。
服务器收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1。和 SYN 一样,一个 FIN 将占用一个序号。
服务器关闭客户端的连接,发送一个 FIN 给客户端。
客户端发回 ACK 报文确认,并将确认序号设置为收到序号加 1。
TLS
TLS 协议提供三个基本的服务
加密:通过非对称密钥加密
张三和李四分别生成自己的公钥和私钥;
张三和李四分别隐藏自己的私钥;
张三向李四公开自己的公钥,李四也向张三公开自己的公钥;
张三向李四发送一条新消息,并用自己的私钥签名;
李四使用张三的公钥验证收到的消息签名。
身份验证
数据完整性
三次握手
客户端向服务端发送一个请求 SYN,请求中有随机序列号 X,发送一个 SYN 分组
服务器收到请求,给随机序列号 X 加 1,自己在发送一个随即序列 Y 和 X 给客户端
客户端收到 X 和 Y,Y 加上 1,然后发送一个 ACK 分组给服务器
四次挥手
TCP 给服务器发送一个 FIN
服务器收到 FIN 后,返回一个 ACK
服务器关闭客户端的连接,发送一个 FIN 给客户端
客户端发回 ACK 报文确认
为什么了连接需要三次,关闭却需要四次
对于建链接的 3 次握手,主要是要初始化 Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的 Sequence Number(缩写为 ISN:Inital Sequence Number)——所以叫 SYN,全称 Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP 会用这个序号来拼接数据)。
对于 4 次挥手,其实你仔细看是 2 次,因为 TCP 是全双工的,所以,发送方和接收方都需要 Fin 和 Ack。只不过,有一方是被动的,所以看上去就成了所谓的 4 次挥手。如果两边同时断连接,那就会就进入到 CLOSING 状态,然后到达 TIME_WAIT 状态。
参考
TCP 的那些事儿(上)