问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

通信协议详解:三次握手、七次握手、四次挥手

创作时间:
作者:
@小白创作中心

通信协议详解:三次握手、七次握手、四次挥手

引用
CSDN
1.
https://blog.csdn.net/weixin_45264425/article/details/140423413

在计算机网络中,TCP/IP协议是数据传输的基础。其中,TCP协议通过三次握手建立连接,四次挥手断开连接,而HTTPS协议则需要额外的TLS握手来确保数据传输的安全性。本文将详细介绍这些握手过程的原理和实现机制。

TCP/IP传输协议的TCP协议是面向连接的,也就是传输数据之前,必须建立可靠的连接。建立连接的过程中,需交换信息(如选取哪种协议、协议版本等),这个过程称为握手 handshaking。
握手过程中会协商后续通信使用的参数,如传输速率、编码方式、校验,以及其他协议选取、硬件支持的功能等。握手是两个实体之间的通信,但在TCP/IP中握手常指TCP的三次握手。

1. 三次握手

TCP中的数据传输、连接建立与终止都由特定控制参数管理,控制参数有以下这些:

参数
用途
SYN
用于启动和建立连接时,同步设备之间的序列号。0到2^32 - 1的随机数。
ACK
向另一端确认已经收到SYN,数值为收到SYN增一。
SYN-ACK
确认之前收到了SYN,数值为自定义值。
FIN
终止连接。
RST
重置连接。

建立TCP连接需要三次握手:

  1. 客户端想要连接服务端时,向服务端发送SYN message。Message还包含sequence number(32位的随机数),ACK为0,window size、最大segment大小。例如,如果window size是2000 bits,最大segment大小是200 bits,则最大可传输segments是10 data。

  2. 服务端收到客户端synchronization request后,回复客户端SYN和ACK。ACK数值是收到的SYN加一。例如客户端发送的SYN是1000,则服务端回复的ACK是1001。如果服务端也想建立连接,回复中还会包括一个SYN,这里的SYN是另一随机数,与客服端的SYN不相同。这一阶段完成时,客户端与服务端的连接已经建立。

  3. 收到服务端的SYN后,客户端回复ACK,ACK值是SYN值加一。这一过程完成后,服务端与客户端的连接也建立了起来。

TCP连接的双方通过三次握手确定TCP连接的初始序列号、窗口大小以及最大数据段,这样通信双方就能利用连接中的初始序列号保证双方数据段的不重不漏,通过窗口大小控制流量,并使用最大数据段避免IP协议对数据包分片。

换个角度看为什么需要三次握手?客户端和服务端通信前要进行连接,三次握手就是为了确保自己和对方的收发能力是正常的。

  1. 第一次握手:客户端发送、服务端接收网络包,服务端可以得出:客户端发送能力、服务端接收能力是正常的。

  2. 第二次握手:服务端发送、客户端接收网络包。从客户端的视角来看,我接收到了服务端发送的响应数据包,说明服务端收到了第一次握手时我发出的网络包,且收到请求后进行了响应,这说明服务端的接收、发送能力正常,我的发送、接收能力正常。

  3. 第三次握手:客户端发送、服务端接收网络包,这样服务端就能得出结论:客户端的接收、发送能力正常,服务端的发送、接收能力正常。第一次、二次握手后,服务端并不知道客户端的接收能力,以及自己的发送能力是否正常。第三次握手后,这些能力才得以确认。

三次握手后,客户端、服务端才确认了自己的接收、发送能力均是正常的。

2. 七次握手

HTTP协议中的数据是明文传输的,任何中间人(man-in-the-middle)都可以读取传输的数据,因此HTTP是一种不安全的协议。

2.1 SSL/TLS预览

HTTPS是HyperText Transfer Protocol Secure的缩写。但HTTPS协议自身不能加密数据,它需要借助SSL或TLS协议层进行加密。

后面会介绍SSL、TLS协议的区别,目前使用TLS指代加密协议。

HTTP协议和TLS协议都位于application layer。TCP三次握手建立连接后,使用TLS握手建立安全连接,后续使用协商的加密算法先对数据进行加密,再通过HTTP传输。

数据加密后,中间人即使获得了数据,也无法读取数据内容,进而避免了中间人攻击(man-in-the-middle-attack)。

HTTP协议和TLS协议一起使用时,称为HTTPS协议。App想要使用TLS加密通信,只需网址使用https://前缀即可。

要了解TLS工作原理,需先了解加密的工作原理,以及各种加密算法。加密就是将数据从一种格式编码为另一种格式,编码时使用一些数学算法、秘密参数。使用相同算法、参数,可以解密数据,这个过程中的参数称为密钥(key)。

2.2 非对称加密算法Asymmetric Key Algorithm

非对称加密算法有两个key:

  • 公钥(public key):公开可见,用于加密数据。
  • 私钥(private key):只自己可见,用于解密。

最流行的非对称加密算法是RSA加密算法,广泛用于密钥交换和数字签名验证。但现在正逐步迁移至更安全高效的Diffie-Hellman(缩写为D-H)算法。

RSA的private key也可以用于加密数据,使用public key解密。生成和验证数字签名时就是用的这种方式。

非对称加密算法通常速度慢,更耗费CPU,且key、数据越长,加密、解密耗费时间也越长。因此,数据量大时不要使用非对称加密,而应使用对称加密(symmetric key cryptography),对称加密速度更快、性能更高。非对称加密用于传输对称加密密钥。

2.3 对称加密算法Symmetric Key Algorithm

对称加密算法也称为共享密钥加密(shared key),它使用相同的key加密、解密。

对称加密算法主要用于受信任两者之间建立加密通道。因为第三方无法获取对称密钥,因此只有建立通道的双方才可以解密数据。

最流行的对称加密算法是AES(Advanced Encryption Standard的缩写,即高级加密标准),

2.4 SSL(Secure Sockets Layer)协议

SSL协议由Netscape团队设计,于1995年发布SSL 2.0版本,之后发布了SSL 3.0版本,IETF已于2015年不推荐使用SSL 3.0。

目前,TLS协议已经替代了SSL协议,SSL协议已不再使用。

当我们说SSL时,事实上说的是TLS。SSL证书实质上是TLS证书,SSL v3.1、SSL v4是TLS 1.0+的别称。

2.5 TLS(Transport Security Layer)协议

TLS是旨在提供安全通信的加密协议,使用TLS可以加密与服务器的所有通信。当前使用最广的是TLS 1.2、TLS 1.3。

TLS 1.3发布于2018年,是对TLS 1.2的全面修订,在性能和安全性方面都有很大提升,并且减少了建立安全连接所需的握手次数。

TLS 1.3只支持Diffie-Hellman非对称加密算法,移除了RSA算法。

2.6 使用TLS 1.2握手

使用HTTPS发送HTTP请求时,首先使用三次握手建立可靠的TCP连接,之后就通过TLS四次握手交换双方的密钥。

下面介绍TLS 1.2连接建立过程:

  1. 客户端向服务端发送Client Hello消息。消息携带客户端支持的协议版本、加密算法、压缩算法,以及客户端生成的随机数。

  2. 服务端收到客户端消息后:

  • 向客户端发送Server Hello消息,并携带选取的协议版本、加密方法、session id,以及服务端生成的随机数。
  • 向客户端发送Certificate消息,即服务端的证书链,其中包含证书支持的域名、发行方和有效期等信息。
  • 向客户端发送Server Key Exchange消息,传递公钥、签名等信息。
  • 向客户端发送可选的CertificateRequest消息,验证客户端证书。
  • 向客户端发送Server Hello Done消息,通知已经发送了全部的信息。
  1. 客户端收到服务端的协议版本、加密方法、session id和证书等信息后,验证服务端证书。
  • 向服务端发送Client Key Exchange消息,包含使用服务端公钥加密的随机字符串,即预主密钥(Pre Master Secret)。
  • 向服务端发送Change Cipher Spec消息,通知服务端后续数据会加密传输。
  • 向服务端发送Finished消息,其中包含加密后的握手信息。
  1. 服务端收到Change Cipher Spec和Finished消息后:
  • 向客户端发送Change Cipher Spec消息,通知客户端后续数据会加密传输。
  • 向客户端发送Finished消息,验证客户端的Finished消息并完成TLS握手。

TLS握手的关键在于利用通信双方生成的随机字符串和服务端的公钥生成一个双方经过协商后的密钥,通信双方后续使用这个对称密钥加密数据,防止中间人监听和攻击,保障通信安全。

在TLS 1.2中,需要2-RTT(Round-Trip Time,往返延迟)才能建立TLS连接。在TLS 1.3中,客户端不仅发送ClientHello、支持的协议、加密算法,还尝试猜测服务器将选择哪种密钥协商算法,并为此发送共享密钥。这样服务端选取加密算法后,因为已经有了client key,可以立即生成key,进而减少一次RTT。

3. 四次挥手

建立连接时需要发送三个packet,但终止连接时需要四个packet,也称为四次挥手。因为TCP连接是全双工的,每个方向都必须独立终止。

终止TCP连接的四次挥手:

  1. 第一次挥手:客户端想要终止连接时,向服务端发送FIN。该segment有两个功能:
  • FIN用于告诉服务端不会再向其发送数据。
  • FIN中的ACK标记要终止的连接。
  1. 第二次挥手:服务端收到客户端终止请求后,回复ACK确认FIN。

  2. 第三次挥手:TCP的连接是相互独立的。因此,服务端也需要向客户端发送FIN。

  3. 第四次挥手:客户端收到服务端的FIN后,回复ACK确认,序列号增一。

在第二次挥手时,如果服务端也想终止连接,可以为FIN设置不同于客户端FIN的序列号。客户端收到FIN后,发送ACK,它的acknowledgement number为FIN sequence number加一。这一过程结束后,服务端与客户端的连接也终止了,这样的话整个过程进行了三次挥手。

总结

客户端想要通过HTTP请求访问服务端时,需要经过三次握手;通过HTTPS访问服务端时,需要额外增加四次握手。

总结一下HTTP建立连接、终止连接:

  • TCP协议需要通过三次握手建立可靠连接。
  • 想要建立HTTPS安全连接,需要在TCP可靠连接基础上使用TLS协议。TLS协议需要四次握手才能建立安全连接。
  • 终止TCP可靠连接时需要四次挥手。

需要注意的是,本文所说的三次握手、七次握手、四次挥手都是基于特定版本的协议,不同版本的协议所需握手次数可能不同。HTTP/3就是一个例子,它使用基于UDP的QUIC协议进行握手,将TCP和TLS握手过程结合起来,握手次数从七次减少到了三次。

参考资料:

  1. “三次握手,四次挥手”你真的懂吗?
  2. 什么是TLS握手?
  3. 为什么HTTPS需要7次握手以及9倍时延
  4. TCP 3-way Handshake Process
  5. What is a TCP 3-way handshake process?
  6. Explanation of the three-way handshake via TCP/IP
  7. Handshaking
  8. An overview of TLS 1.3 and Q&A
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号