Duang~看看浏览器这小子
我胡汉三又回来啦,想念哀家不~
啊哈,编译原理那些视频我在b站上更新啦,微信上传视频太麻烦了 ,点击原文给你们传送过去
某年某月某日的一天 我,傻喵
坐在电脑前,看着键盘发呆,为毛这么黑乎乎的玩意,搭配起来,能让我在虚拟喵界四处撩猫呢?
以浏览器为例子:
当按键的时候,电脑都在干嘛呢?原来当按键盘的时候,浏览器得到消息之后,会触发自动完成机制(浏览器真是个小机灵)。
这家伙还会配合算法那帮小子,根据当前的模式,时刻关注着你的输入,比如你想输github,当你点了g这个键,哟吼,浏览器马上使出浑身解数,叫上算法,在搜索历史,书签里根据g给你各种建议,简直是拍马屁的能手。
话说按下回车键的刹那,电脑在休息么?
不,电脑真的应该拿敬业福,从不怠慢。
回车键被按下去的那一刻,一个回路电流(专门服务回车键大哥)被直接接地或者通过电容器间接的闭合了,使得很少的电流进入键盘的逻辑电路系统(谁都别来打扰我),然后,好家伙,系统大爷开始扫描每个键的状态,到了回车这里,哟,就你了,转换成键盘码值(回车码值13,真会装)。
给你们看看,啥叫专业(大佬提供的),看看就好,我也不懂
经过刚刚一系列复杂的操作(其实就是输了个github.com并且回车)
浏览器开始解析,不过解析之前,这哥们很称职的,也非常贴心,会自动帮忙补全前面的“http://”或者"https://",之前默认是http,但是现在更多的是https,同时也会对输入的域名进行格式检查,是不是很棒棒呢?
终于可以解析了,protocol原来是用的http协议啊,resource/请求的资源是主页,不过,这个github.com有点棘手啊,不是IP地址,TCP/IP 快递公司那帮人是不会送快递的,哎,还是找老兄弟DNS吧。
“喂,是DNS么?帮我查下github.com的IP地址是多少?”
“好的,稍等片刻”
DNS开始在自己的内存(DNS Cache)里看看有木有,哎呀,没有,再看看本地硬盘的host文件,木有,没办法。
DNS就去联系服务器老大哥,服务器大哥地址是8.8.8.8,DNS打包好查询,收件人老大哥,寄件人自己(1.1.1.1)。
这时候联系TCP/IP呢,很快就有人接待了,接待的是UDP,懒散的躺着,刷刷两笔协商收件人地址,发件人地址,马上放下笔,一个字不多。(门牌号是防止收件人是土豪,房子太多,混淆)
UDP给IP打了个电话“P啊,有个快递捎带~”
IP呲溜过来了,把包裹收起来,看了下地址,嗯,确认过,是不认识的,查了下导航(IP路由表),还得出关(gateway),这个关口的mac地址木有,咋整?
不怕,有向导(ARP),“老司机,带带我”
ARP:“网关你MAC地址多少,告诉老夫一下”
网关:“我的mac地址是xx.xx.xx.xx.xx.xx”
IP上路了,上了高速,开始飙车~
到了老大哥8.8.8.8之后,根据门牌号,找到主人,喊老大哥签收快递,老大哥一看,哎哟,这好小子,问的正是时候,github.com对应的IP地址还在老窝呢,于是回复过去。
如果老大哥这里也没有咋整?那只能往上一级,找根服务器了,全球的根域名服务器一共13台,DNS老大哥都知道这些,会一家一家的查询。
折腾一大圈,找到了github.com的IP地址之后,DNS返回给浏览器,浏览器赶紧熄灭了烟,联系TCP/IP快递,这次接待的是TCP阿姨,这个阿姨哟,老负责了,做事特别仔细,知道浏览器想拜访(52.74.223.119),先问问对方在不在,对话如下(三次握手):
老阿姨:“在家么?想去拜访您”
对方:“在的,欢迎”
老阿姨:“马上到~”
这个交流也是IP小青鸟来回传输的,握手之后,老阿姨和对方建立了一个可靠地虚拟通道,浏览器知道后,将http请求消息,打包好给TCP老阿姨,阿姨和UDP一样,填上门牌号。
包裹到了之后,找到地址,联系http server小姐姐,小姐姐说,“哎呀,不好意思,我们公司由于相关政策,刚刚换了地址,需要用https访问”
浏览器知道后,又去找https://github.com的IP地址,找到后呢,这一次不能直接和TCP阿姨联系了,因为是https,需要委托TLS安保大叔全权负责。
TLS安保大叔,首要的任务是确保包裹在运输过程中的安全,即包裹的内容保密,包裹内容不能被篡改、替换。
TLS安保大叔,首要的任务是确保包裹在运输过程中的安全,即包裹的内容保密,包裹内容不能被篡改、替换。
TLS大叔需要先和对方沟通安保措施,沟通的渠道,就是上文三次握手建立的渠道。
TLS大叔先发言:你好,我支持TLS版本1.2,以及我的认证算法、加密算法、数据校验算法,此外还有我的随机码,收到请回复。
TLS服务器回复:你好,我也支持1.2版本,那我们就使用xx认证算法、xx加密算法、xx数据校验算法,我的随机码是xx,来实现安保措施,你看好吗?
TLS大叔:没问题啊,能出示一下你的证件(数字证书)吗?
TLS服务器:okay,这是我的证件,请过目。
TLS大叔发现对方发过来两个证书:
证书1: “*.zhihu.com”,由GeoTrust RSA CA 2018签名并颁发
证书2: “GeoTrust RSA CA 2018”,由DigiCert Global Root CA签名并颁发
2. 用GeoTrust RSA CA 2018的公钥解密证书1的签名
过程和步骤1同样的原理,如果2个步骤都验证成功,就有了github.com的公钥。
TLS大叔还需要检查的证书有效期,再检查证书是否被吊销(CRL),如果一切都没有问题,进入下一个步骤。
TLS大叔用“*.github.com”公钥加密一段随机的字符串,发送给TLS服务器。
TLS服务器用自己的私钥解密,得到明文字符串。
至此,双方分享了这个神秘的字符串,双方还有早前分享的随机码(nonce),双方使用同样的算法,可以推导出相同的master key,进而推导出session key、HMAC key。
Session Key用于加密/解密数据, HMAC Key主要用于保护数据的完整性,以防被第三方篡改。
整个TLS沟通过程就算完成了,TLS大叔把浏览器扔给自己的包裹,外面加了一层保险箱,密码锁(session key)只有TLS大叔、TLS服务器知道。
然后把保险箱再扔给TCP阿姨,TCP阿姨一点也不在乎,运输一个保险箱与一个普通包裹没有任何区别,唯一的区别是收件人的门牌号变了:
收件人门牌号 XXX
然后保险箱就被运走了,很快就到达了目的地,服务器老大爷一看门牌号XXX,知道这是TLS服务器的快递包裹。
TLS服务器用密码打开了保险箱,取出了快递。
在保险箱里还有一个小纸条写着“Application Data =http”, TLS大叔知道这是HTTP Server高富帅的包裹。
然后把包裹转交给高富帅,高富帅将www.github.com 主页返回,并最终到达浏览器。
天气:阴
傻喵
2019.2.11
幕后彩蛋
这么有技术含量的肯定不是我琢磨出来的,参考以下大佬:
https://github.com/skyline75489/what-happens-when-zh_CN#windows-wm-keydown
在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?
给个好看,带你飞
领取专属 10元无门槛券
私享最新 技术干货