作者: 疯狂的技术宅
正文共: 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 命令得到的结果:
- > dig fex.baidu.com +trace
- ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> fex.baidu.com +trace
- ;; global options: +cmd
- 11950 IN NS f.root-servers.NET.
- 11950 IN NS k.root-servers.NET.
- 11950 IN NS l.root-servers.NET.
- 11950 IN NS m.root-servers.NET.
- 11950 IN NS b.root-servers.NET.
- 11950 IN NS c.root-servers.NET.
- 11950 IN NS e.root-servers.NET.
- 11950 IN NS a.root-servers.NET.
- 11950 IN NS g.root-servers.NET.
- 11950 IN NS d.root-servers.NET.
- 11950 IN NS i.root-servers.NET.
- 11950 IN NS h.root-servers.NET.
- 11950 IN NS j.root-servers.NET.
- ;; Received 251 bytes from 192.168.0.1#53(192.168.0.1) in 12 ms
- com. 172800 IN NS a.gtld-servers.NET.
- com. 172800 IN NS b.gtld-servers.NET.
- com. 172800 IN NS c.gtld-servers.NET.
- com. 172800 IN NS d.gtld-servers.NET.
- com. 172800 IN NS e.gtld-servers.NET.
- com. 172800 IN NS f.gtld-servers.NET.
- com. 172800 IN NS g.gtld-servers.NET.
- com. 172800 IN NS h.gtld-servers.NET.
- com. 172800 IN NS i.gtld-servers.NET.
- com. 172800 IN NS j.gtld-servers.NET.
- com. 172800 IN NS k.gtld-servers.NET.
- com. 172800 IN NS l.gtld-servers.NET.
- com. 172800 IN NS m.gtld-servers.NET.
- com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
- com. 86400 IN RRSIG DS 8 1 86400 20200625050000 20200612040000 48903 . OwfRn9tBOE2btL/z3HG5PQVyTXu2OUcZGLi9svkHFV0tomeI1p9bHhqr GF/UDjf5a8VXNRoaSsSEQfgqwJT3UAOANK1vb3e+5jH2bV3Hg6/MAGG0 SuBfKv8Y1fjGgiLNC3NKmTWJ28WABHngymnGDpuqoC6xKmkVoD14ON7E uHbBGxC0Uxt6D5R3WfbAAfbzZXzyPcD3WK1OpGaL6ASMB2xvdAZIkp/Z l8QDmqZd86RX7haiVhxVG0mMrWxsN7XL2jVyRRFFl9UkApMk9/thPwNK Rgkd4BPCvMPZTvsb+mPZA4InLxP6oPliZQm5sIWH8fEiyS+LgEReROzG sqrpyw==
- ;; Received 1173 bytes from 198.97.190.53#53(h.root-servers.NET) in 206 ms
- baidu.com. 172800 IN NS ns2.baidu.com.
- baidu.com. 172800 IN NS ns3.baidu.com.
- baidu.com. 172800 IN NS ns4.baidu.com.
- baidu.com. 172800 IN NS ns1.baidu.com.
- baidu.com. 172800 IN NS ns7.baidu.com.
- CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM
- CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20200618045106 20200611034106 39844 com. nL7GSwad11x22Ff4/a3sjIA27DplTa0SZWNb9jnTs0+PYEehVKCT4a2g TWgi5YHeqolDbwsK9oy7Hy1ZO3yhlhWUUAIyE5DE+iKuJCnD6fIvmXdq lXsBBvUHK6wtHzIAPJ8PbCAl/PwSNjpZUZvv4YcEtLWU14yTsPPAM/wB BxatwSt88sQrwYrLKqjnojEsmKVX1yi98pdT87BI/zKxzQ==
- HPVU6NQB275TGI2CDHPDMVDOJC9LNG86.com. 86400 IN NSEC3 1 1 0 - HPVVN3Q5E5GOQP2QFE2LEM4SVB9C0SJ6 NS DS RRSIG
- HPVU6NQB275TGI2CDHPDMVDOJC9LNG86.com. 86400 IN RRSIG NSEC3 8 2 86400 20200619061821 20200612050821 39844 com. Iz4sOw47dg/aDbs/T9JSAXDiE88bqoj/kYbDQW5dO9NnQicyC5ZqEj0o l1hxJHirVmJtCIXevkSy3eH1rrOH/Ni+oLlWZEBzQnucFK1C4WdBylF2 0OsgaG/AyHSD+9tWgMcQY+i28WBpxmxXvDLHY0oWb89UHMpcduqCh5+n YXnbOHzjvaER/hX1ljveDo0z+HJIBtgY6/0NeFFY0ZWkcA==
- ;; Received 761 bytes from 192.43.172.30#53(i.gtld-servers.NET) in 248 ms
- fex.baidu.com. 600 IN CNAME sugar.n.shifen.com.
- n.shifen.com. 86400 IN NS ns5.n.shifen.com.
- n.shifen.com. 86400 IN NS ns2.n.shifen.com.
- n.shifen.com. 86400 IN NS ns4.n.shifen.com.
- n.shifen.com. 86400 IN NS ns3.n.shifen.com.
- n.shifen.com. 86400 IN NS ns1.n.shifen.com.
- ;; Received 241 bytes from 112.80.248.64#53(ns3.baidu.com) in 32 ms
可以看到这是一个逐步缩小范围的查找过程, 首先由本机所设置的 DNS 服务器 ( 192.168.0.1 ) 向 DNS 根节点查询负责 .com 区域的域务器, 然后通过其中一个负责 .com 的服务器查询负责 baidu.com 的服务器, 最后由其中一个 baidu.com 的域名服务器查询 www.baidu.com 域名的地址.
你在查询某些域名的时会可能会发现和上面不一样, 最后将会看到有个奇怪的服务器抢先返回结果...
这里为了方便描述, 忽略了很多不同的情况, 比如 127.0.0.1 其实走的是 loopback, 和网卡设备没关系; 比如 Chrome 会在浏览器启动的时预先查询 10 个你有可能访问的域名; 还有 Hosts 文件, 缓存时间 TTL(Time to live)的影响等.
通过 Socket 发送数据
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Source Port | Destination Port |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Sequence Number |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Acknowledgment Number |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Data | |U|A|E|R|S|F| |
- | Offset| Reserved |R|C|O|S|Y|I| Windows |
- | | |G|K|L|T|N|N| |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Checksum | Urgent Pointer |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Options | Padding |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | data |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
来源: https://www.qcloud.com/developer/article/1647792