ldquo三次握手rdquo这道

白癜风能治了吗 https://m-mip.39.net/baidianfeng/mipso_4755379.html

面试中,一道经典的问题就是TCP三次握手和SSL/TLS握手协议过程,这道题巧妙的地方在于,可以考察最基础的网络通信知识,还可以要求候选人白板画出具体的交互图,并且可以再次扩展到网络通信性能优化和安全相关领域知识。今天我们的常见的HTTP协议从1.1已经进化到QUIC和HTTP/3,而加密通信也从SSLv2(加密套接字协议层)发展到TLSv1.3,未来已来,今天我们一起来“旧知新解”。

-1-TCP连接为啥要“三次握手建立”和“四次握手断开”?

引用网友有一段通俗的解释,三次握手是不可靠的通信双方为了就某一个问题(连接或协商密钥)达成一致所需要的最小数量的沟通次数。

而TCP/IP网络通信的基础是套接字(Socket)接口,它抽象出通信所需要的5元组(协议,本机IP地址,本地协议端口,远程主机IP地址,远程主机协议端口);Socket支持传输层TCP和UDP协议,当使用TCP协议时,我们就把该Socket连接成为TCP连接;通常的HTTP请求都是基于TCP协议进行通信。

TCP协议的头部,跟三次握手相关的有如下字段:

SequenceNumber(图上缩写为seq):用来标注数据流序号(发送端)

AcknowledgmentNumber(图上缩写为ack):确认序列号包含发送确认的一端所期望收到的下一个序号,应当是上次已成功收到数据字节序号加1;

TCPFlag(标志位)

ACK:响应标志,建立连接后,所有的有效报文都必须为1;

SYN:同步序号,用来建立连接;

FIN:表示数据传输完成;

不同的SYN和ACK组合,在建立连接时,表示不同含义:(SYN=1,ACK=0)表示请求连接,(SYN=1,ACK=1)响应同意连接请求;

通过图示,我们一起来理解下经典的TCP建立连接的三次握手和断开时的四次握手:

建立连接如果不采取三次握手,而是两次,就A发起,B确认响应就建立连接,会出现什么问题呢?比如A本意只想建一个连接,但发送第一个建立连接请求R1后,迟迟没得到响应,就又发送了一次建立连接请求R2,R2请求顺利得到响应并建立连接,但R1后来也到达B端,B端还以为A又想建立一个新请求,所以,就响应并一直等待A发送数据(此时B是有资源消耗的),但A早就丢弃了R1,那B端资源就在浪费空跑,所以引入第三次握手A再次确认,避免B会错意导致资源浪费。

四次握手断开连接,放在TCP全双工的上下文就比较好理解,A和B都可以主动发送数据给到对方(全双工),A主动断开,一个请求,一个确认,但也要等待B确认它的数据已经发送完毕,因此,也需要两次握手来确认断开连接。

超文本传输协议(HTTP)存在非常大的安全隐患,由于明文方式发送信息,易遭受窃听、篡改、劫持等攻击,而HTTPS则在传输层(TCP)和应用层(HTTP)之间加入了一个SSL/TLS加密协议,通过证书来验证身份,并加密数据传输,保障数据通信过程中的保密性(第三方无法窃听)、完整性(防止篡改)和身份认证(防止冒充)。

-2-SSL/TLS发展历史

SSL(SecureSocketsLayers)安全套接层/TLS(TransportLayerSecurity)安全传输层协议都是一种加密协议,满足网络上服务器之间、应用和服务器之间应用之间认证和数据加密需求,如下图示发展历史所示,目前只建议使用TLSv1.2和TLSv1.3,其他版本都有安全问题或过渡版本,不建议启用,参考IETF(InternetEngineeringTaskForce)说明;

那TLS和SSL有什么区别吗?

“ThedifferencesbetweenthisprotocolandSSL3.0arenotdramatic,buttheyaresignificantenoughthatTLS1.0andSSL3.0donotinteroperate.”

SSL/TLS协议目的包含验证,防篡改,加密,验证支持客户端和服务器端验证;防篡改主要利用哈希算法,保障完整性;加密,体现两个方面,一个是握手过程中的非对称加密建立信道,另外一个信道建立之后的块数据对称加密。

-3-证书不等同于协议

务必注意,证书独立于协议,在升级SSL为TLSv1.3的过程中,没有必要纠结”SSL证书”还是“TLS证书”,在TLS没被广泛认知的情况下,“SSL/TLS证书”是个临时的妥协方案,协议是Web服务器的配置决定的,而不是证书本身。

在每一次安全连接开始,会有一个TLS协议握手过程(后面会具体展开),该过程客户端和服务器端会协商一个都支持的“加密套件(CipherSuite)”,加密套件是一组算法,它们协同工作,证书在握手协商加密套件过程中发挥作用。

经典的加密套件(TLSv1.0~1.2)包含如下三大算法,以TLS_ECDHE_RSA_WITH_AES__GCM_SHA为例:

密钥交换(KeyExchange),例如ECDHE_RSA,非对称加密算法,用于决定客户端与服务器之间在握手时如何身份验证

消息身份认证(MessageAuthentication),例如SHA,用于创建消息摘要,消息流每个数据块的加密散列,用于验证消息完整性

批量加密算法(BulkEncryption)例如AES__GCM,对称加密算法,用于加密消息流。它还包括密钥大小及显式和隐式初始化向量(密码学随机数)的长度

-4-TLS握手协议

TLS协议由三块组成,TLS记录协议(TLSRecord)基于可靠传输层TCP之上,与具体应用无关、TLS握手协议以及警报协议(Alert);为了更好的了解握手协议,我们需要参考TLSv1.2的完整定义RFC和TLSv1.3正式版RFC。

在TLSv1.2协议中,握手协议需要2个往返请求(2-RTT)才能协商好生成一个“会话密钥”,具体握手过程如下描述:

客户端发出请求(ClientHello报文),包含信息如下(TLS版本信息,客户端生成的随机数1,支持的加密套件列表,支持的压缩算法列表,扩展字段)

服务器端回应(ServerHello)

ServerHello报文,包含服务器支持的(确定TLS版本,服务器生成的随机数2,确定一种加密套件,确定一种压缩算法,扩展字段)

服务器端证书消息,按照信任链发送完整的服务器端证书列表,通常建议优化到3KB以内的证书数据传输在如何优化数据传出大小(DataTransferOut)场景下,这块的消耗优化值得

转载请注明地址:http://www.xinxiaoxibao.com/xxxbls/1786809.html


  • 上一篇文章:
  • 下一篇文章: 没有了
  • 网站简介 广告合作 发布优势 服务条款 隐私保护 网站地图 版权声明