最近一直在跟踪http请求丢包的问题,在排查问题中多闪抓包分析。所以,决定把Http协议的理解重新梳理,从以下几个方面进行分析:
HTTP( Hyper Text Transfer Protocol超文本传输协议的缩写)是一个客户端和服务器端请求和应答的标准。HTTP协议承载于TCP协议之上。如下图:
所以,在建立Http之前需要先建立TCP连接,然后在其上进行跑Http协议。从下面的抓包过程来看,首先建立了TCP连接:
1、 首先通过三步握手建立TCP连接;
2、 客户端开始发送http文本包;
3、 服务端给回http回包;
4、 客户端通知断开TCP连接;
Http的每一次请求是否新建?
在客户端(手机、PC)与服务器端进行通信时,一般情况下是按上面的步骤重复。如果在客户端端请求服务端服务过程中,存在大量请求,每次都新建TCP --> HTTP发送-->HTTP返回 -->断开链接这个过程,将会耗费大量的时间在建立TCP连接上。为了解决这个问题,HTTP提出了复用TCP连接的方式,在前一次请求结束之后,不断开而继续用原链接发送新请求,避免了重复建立,称此为HTTP持久连接。
HTTP/1.1的时候,通过请求头的connection字段用来申明,作用就是减少TCP握手次数,开始的三次握手后就可以进行多次HTTP正文请求,可以长时间的保持,也就是多次Http请求只用进行一次握手,这样就大大的减少了传输量了。keep-alive就表示之前已经进行过握手,可以直接进行HTTP正文传输,close表示结束,我接下来没有东西了,可以进行四次挥手结束这个TCP连接。
Https如何建立连接?
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 [1] 。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 与 HTTP之间区别在于有加密/身份验证层(在 HTTP与 TCP 之间)
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤:
- 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
- Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。在客户端收到证书后,对证书的证书所有者、有效期等信息进行一一校验。
- 客户端根据双方同意的安全等级选择加密算法和密钥,然后利用公钥将会话密钥加密,并传送给服务端。
- Web服务器利用自己的私钥解密出会话密钥。
- 客户端以对称加密的方与向Web服务器发送请求;
- 服务端收到后,利用对称密钥给客户端回复请求内容;
TLS连接建立过程中的信令:
? Client Hello: 第一条消息,将客户端的功能和首选项告诉服务器
? Server Hello: ?当服务器收到客户端的hello消息的时候,服务器会将服务器选择的参数传送回客户端。
? Certificate: 发送证书,用于携带X.509证书链
? Server Key Exchange:携带密钥交换的额外数据
? ServerHelloDone:服务器将所有预计的握手消息发送完毕
? Client Key Exchange:携带客户端为密钥交换提供的所有信息,客户端使用公钥将密码和算法送给Server
? Change Cipher Spec:已经取得用以生成连接参数的足够信息
? Encrpted Handshake Message:客户端服务器之间协商的算法和密钥保护的第一个消息,意味着握手已经完成。
? Application Data:发送数据。
? Encrypted Alert:此连接不再安全,将停止此次加密传输;