作者:疯狂的技术宅
正文共:3400 字
预计阅读时间:10 分钟
从浏览器到浏览器内核
当我们在浏览器的地址栏中输入地址并回车后,浏览器可能会做一些预处理,比如 Chrome 会根据历史统计来预估所输入字符对应的网站,比如输入了“bai”,根据之前的历史发现会有很大的概率会访问 www.baidu.com ,因此就会在输入回车前就马上开始建立 TCP 链接甚至渲染了,这里面还有很多其它策略,感兴趣的同学推荐阅读 High Performance Networking in Chrome(http://aosabook.org/en/posa/high-performance-networking-in-chrome.html)。
接着是输入 URL 后的“回车”,这时浏览器会对 URL 进行检查,首先判断协议,如果是 http 就按照 Web 来处理,另外还会对这个 URL 进行安全检查,然后直接调用浏览器内核中的对应方法,比如 WebView 中的 loadUrl 方法。
在浏览器内核中首先会检查缓存,然后设置 UA 等 HTTP 信息,接着调用不同平台下的网络请求的方法。
浏览器和浏览器内核是两个不同的概念,浏览器指的是 Chrome、Firefox,而浏览器内核则是 Blink、WebKit、Gecko等,浏览器内核只负责渲染,GUI 及网络连接等跨平台工作则是由浏览器实现的
发送HTTP 请求
因为网络的底层实现与内核相关,所以在这里需要针对不同平台进行处理,从应用层角度来看主要是做两件事情:
通过 DNS 查询 IP
通过 Socket 发送数据
接下来就分别介绍这两方面的内容。
DNS 查询
DNS 查询其实是基于 UDP 来实现的,这里我们通过一个具体例子来了解它的查找过程,以下是使用 dig fex.baidu.com +trace
命令得到的结果:
1> dig fex.baidu.com +trace
2
3; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> fex.baidu.com +trace
4;; global options: +cmd
5. 11950 IN NS f.root-servers.net.
6. 11950 IN NS k.root-servers.net.
7. 11950 IN NS l.root-servers.net.
8. 11950 IN NS m.root-servers.net.
9. 11950 IN NS b.root-servers.net.
10. 11950 IN NS c.root-servers.net.
11. 11950 IN NS e.root-servers.net.
12. 11950 IN NS a.root-servers.net.
13. 11950 IN NS g.root-servers.net.
14. 11950 IN NS d.root-servers.net.
15. 11950 IN NS i.root-servers.net.
16. 11950 IN NS h.root-servers.net.
17. 11950 IN NS j.root-servers.net.
18;; Received 251 bytes from 192.168.0.1#53(192.168.0.1) in 12 ms
19
20com. 172800 IN NS a.gtld-servers.net.
21c