从解决 Github TimeOut 到经典面试题:从输入 URL 到浏览器显示页面发生了什么?
问题描述
在Windows
操作系统上,push
代码到git
的时候,出现了Failed to connect to github.com port 443: Timed out
的错误。一脸懵逼,浏览器网页也访问不了。
思路以及解决方案
一开始,我以为自己代理网络出现了问题,关掉之后,还是一样的问题。首先我们可以使用以下的命令,删除代理配置:
然后打开ipaddress.com
,查询以下的域名,记录其 ip:
github.com
github.global.ssl.fastly.net
然后打开C:\Windows\System32\drivers\etc\hosts
文件,把两个 ip 配置进去:
保存之后,打开CMD
,刷新DNS
,重新push
:
以上做法可以解决部分连接github
慢的问题,主要是超时的问题,如果不是超时的问题,上面的做法是不会起作用的,这个只是把对应的域名和ip
的对应关系直接映射在DNS
配置上,不用去查找了,直接找到ip
地址。
为什么刷新 DNS 就生效了呢?
这就涉及到一个面试经常问的一个问题了,先把问题变成:在浏览器输入一个www.baidu.com
,会发生什么?间不固定。
为什么刷新DNS
就生效了呢?这就涉及到一个面试经常问的一个问题了,先把问题变成:在浏览器输入一个www.baidu.com
,会发生什么?
解析域名:首先需要根据域名去查找该域名的
ip
地址,解析前会先查看浏览器的缓存,浏览器会保存一段时间访问的网址的DNS
地址,根据浏览器不同时间不固定(在chrome
浏览器中输入:chrome://dns/
,可以看到chrome
浏览器的DNS
缓存。)。
如果浏览器的缓存没有这个记录,那么就回去查找系统的缓存,系统缓存没有的情况会去查找
hosts
文件里面的ip
地址(如果存在的话)。
如果本地的
hosts
文件里面没有该域名对应的ip
地址,那么就会发送一个DNS
请求到本地DNS
服务器,一般是由网络接入服务器商提供(譬如中国移动)。
请求到达本地
DNS
服务器之后,也会先查询缓存,缓存有则直接返回,没有则递归查询,本地DNS
服务器需要向根服务器查询。
根服务器不记录具体的域名和
ip
对应关系,会告诉DNS
服务器,到域服务器(给出地址)上查询。
继续往域服务器查询,譬如
“baidu.com”
,.
->.com
->baidu.com.
->www.baidu.com.
,查询到之后,写入缓存并且返回 ip。
拿到
ip
之后,会建立TCP
链接,也就是三次握手。
三次握手成功之后,浏览器发起
HTTP
请求,请求包括三部分:请求方法URI
协议/版本,请求头,正文。
服务器处理请求,返回。
关闭
TCP
链接,四次握手(或称四次挥手)。
浏览器解析报文或者资源,渲染。
上述只是一个概述,具体的细节很多,这个下次具体聊聊,但是我们可以看出,在这个过程中确实涉及到了DNS
的服务器以及缓存,所以我们刷新缓存之后,访问github
就可以请求到对应的 ip 上去。
【刷题笔记】
Github 仓库地址:https://github.com/Damaer/codeSolution
笔记地址:https://damaer.github.io/codeSolution/
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java 源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指 Offer,LeetCode 等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。
平日时间宝贵,只能使用晚上以及周末时间学习写作,关注我,我们一起成长吧~
版权声明: 本文为 InfoQ 作者【秦怀杂货店】的原创文章。
原文链接:【http://xie.infoq.cn/article/aa6f890d6ce4c5deece88edae】。文章转载请联系作者。
评论