在浏览器地址栏输入一个 URL 后回车,背后发生了什么?面试官想听你说的答案!!!
因为一些个人原因学习的任务鸽了好久了,到了今天实在有点过意不去了,赶快过来赎罪。。。
今天就来谈谈和自己老本行有关的东西吧,也是一个很经典的面试题,是什么呢???
那便是 在浏览器地址栏输入一个 URL 后回车,背后发生了什么!!! 不废话,直入主题:
- 首先浏览器如果已经有该页面的缓存则会直接显示页面内容
- 如果没有缓存浏览器就会发起http/https请求
- http协议是应用层的协议,按照osi七层网络模型由上到下包装数据,先是应用层也就是http协议
- 然后到传输层的tcp协议,tcp协议需要确定源端口和目标端口,源端口是本机的随机可用端口(一般为三万以上的端口)目标端口是url里面指定的(默认为80/443),
- 然后是tcp的三次握手我们先说第一次握手,客户端会准备发送一个带有SYN标记位的请求给服务端
- 再到网络层,ip协议需要明确目标ip和源ip
- 如果输入的url是个域名就得做dns解析
- 先查询本地host文件是否有设置此ip的解析记录,如果有的话直接使用这个设置的ip
- 如果没有的话,则会寻找本机配置的dns服务的地址去发起dns请求获取ip(dns协议也是应用层协议,这里就展开讲了,不然又是一套osi的包装,像套娃一样没完没了了)
- 再到数据链路层需要添加数据帧结构,需要确定源mac地址和目标mac地址(数据帧)
- 然后是查询本机的路由表,检查目标ip和自己是否在同一个网段
- 如果在的话则准备获取目标ip的mac地址,不在的话查询路由表确认一下到该目标ip的路由要怎么走,找到下一跳的网关ip(一般都是走默认路由)
- 知道ip后我们需要用ip去获取mac地址,查询本地arp缓存是否有存这个ip的mac地址缓存,如果没有则发送arp广播索要网关的mac地址,并存在本地arp缓存中
- 包装好数据链路层后就到了物理层,物理层把数据转换为字节流通过网线向外发送到对应的路由器
- 路由器再转到下一个路由器(其中会改变源mac和目标mac),直到到达目标主机
- 到达目标主机后内核会使用本机iptables中prerouting链配置的规则对请求进行匹配符合规则的会被进行目标地址转换后转发出去
- 之后会通过路由表进行路由决策,这也可能会被转发走(前提是开启了系统的转发功能)
- 如果是到本机的流量则会进入到iptables的input链符合规则的会被拦截掉
- 之后就通过osi模型由下往上一层层的解包直到应用层的服务接收到数据
- 接收到数据后服务端就会回SYN ACK ack seq给客户端完成第一次握手,然后客户端会再发送ACK seq给服务端
- 至此tcp的三次握手完成
- 如果使用的是https协议的话服务端会下发通过权威机构颁发的私钥加密过的自己的证书公钥给客户端
- 因为客户端系统都是有预装权威机构的公钥的所以我们能解密出他们的公钥
- 得到公钥后我们本地会生成对称加密的秘钥通过这个公钥加密后发给服务端这样双方就可以通过这对对称秘钥进行加密交互数据了
- 至此https握手流程完成
- 最后就是令人心情愉悦的数据交互环节了
到这里访问网页背后发生的事情差不多就说完啦!没有花里胡哨的图片混淆视听,一口气读下来是不是很爽?嘿嘿~ 爽就对了!和别人的文章相比这篇更像是一份面试的标准答案。在面试中你能这般答出面试官绝对对你另眼相看,不说别的至少在网络基础知识方面肯定是合格的。
这个话题其实可大可小,快的可能三言两语就把这个过程描述完,慢的可能半小时都说不完。因为网络的水实在太深太深了,我谈的也只是皮毛而已,还有很多底层的知识没有涉及,但是对大多数人来说懂得这些足够了。
讲得不好,有什么不当的地方还请大家多多指教哈。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭