ping与http 面试题
上一次听了我同事面试腾讯的录音,里面有一个关于计算机网络的题目,比较有意思,在此说一下个人理解,不一定正确哈,如果有错误请大佬们在留言区,赐教
题目
一台机器ping一台机器,耗时100ms,如果在浏览器中访问这台机器的web服务将会耗时多久,或者至少是多少倍。
一听确实被吓了一跳,还能这样计算时间嘛
分析过程
我第一反应,虽然不知道耗时,扯一扯分析的逻辑总没问题。
首先ping是测试2台机器网络是否连通,属于网络层协议
ping 是基于ICMP协议工作的。ICMP 全称 Internet Control Message Protocol,就是互联网控制报文协议,网络层协议。
一次ping,其实就相当于一次RTT(返时延)。
问题转换一次从浏览器访问服务器的需要多少次RTT。
浏览器访问,一个web服务有哪些过程呢?
首先这个肯定是http,或者https 应用层协议,为了方便假设是http,http下面还有传输层协议tcp协议。
由于第一次tcp连接,那么肯定是要三次握手,这个耗时不能免
tcp
如上提所示建立连接
- 客户端先发送:SYN,seq=x,给服务器
- 随后服务器作出相应:SYN,ack=x+1,seq=y
- 客户端再发送ACK,seq=x+1,ack=y+1
其中的响应阶段对应了,tcp中的状态,当客户端发送了ACK时,他就已经变成了ESTABLISHED,就可以发送数据到服务器去了,所以也就是消耗了一次RTT的时间建立tcp连接。
建立了tcp连接后,就可以发送数据给服务器。
如果是http通信则可以推断一定是大于2倍ping的时间。
但是如果是https,那可就又复杂了
https首次请求
HTTPS首次请求需要的网络耗时解释如下:
三次握手建立TCP连接。耗时一个RTT。
使用HTTP发起GET请求,服务端返回302跳转到https://。需要一个RTT以及302跳转延时。
大部分情况下用户不会手动输入https://来访问HTTPS,服务端只能返回302强制浏览器跳转到HTTPS。
浏览器处理302跳转也需要耗时。
三次握手重新建立TCP连接。耗时一个RTT。
302跳转到HTTPS服务器之后,由于端口和服务器不同,需要重新完成三次握手,建立TCP连接。
TLS完全握手阶段一。耗时至少一个RTT。
这个阶段主要是完成加密套件的协商和证书的身份认证。
服务端和浏览器会协商出相同的密钥交换算法、对称加密算法、内容一致性校验算法、证书签名算法、椭圆曲线(非ECC算法不需要)等。
浏览器获取到证书后需要校验证书的有效性,比如是否过期,是否撤销。
解析CA站点的DNS。耗时一个RTT。
浏览器获取到证书后,有可能需要发起OCSP或者CRL请求,查询证书状态。
浏览器首先获取证书里的CA域名。
如果没有命中缓存,浏览器需要解析CA域名的DNS。
三次握手建立CA站点的TCP连接。耗时一个RTT。
DNS解析到IP后,需要完成三次握手建立TCP连接。
发起OCSP请求,获取响应。耗时一个RTT。
完全握手阶段二,耗时一个RTT及计算时间。
完全握手阶段二主要是密钥协商。
完全握手结束后,浏览器和服务器之间进行应用层(也就是HTTP)数据传输。
取图来自http://blog.itpub.net/31557835/viewspace-2219412/