讲讲历史
1991年8月6日,在瑞士日内瓦的核子研究中心(CERN)工作的英国物理学家蒂姆·伯纳斯·李(Tim Berners-Lee),正式提出了World Wide Web,也就是如今我们非常熟悉的www。
www是什么?万维网WWW是World Wide Web的简称,也称为Web、3W等。WWW是基于客户机/服务器方式的信息发现技术和超文本的综合技术。
这里个人比较好奇我们天天都在说3w,3w,但是互联网是怎么出现的的书中并没有解释?
这里查了下网上资料根据个人理解解释一波:
实际上网络最开始苗头出现在美苏冷战的时期美国建立的APRA科研部门,被突然扯出来的科研部门一盘散沙不知道干嘛,对付苏联的科研工作也没什么进展,直到一个叫做罗伯特·泰勒的哥们出现,他的突破口是发现小型的通信网络不能兼容不同型号的计算机,我们都知道技术的顶峰就是定规则,毫无疑问他选择构建一套协议让所有的计算机都能遵守这一套规则干活。
于是他找来了几个牛逼的大佬开始捣鼓,中间巴拉巴拉做了很多事绕了很多弯,目的其实就是为了实现上面说的东西,最终在一次失败的“LOGIN”验证中虽然仅仅传输了“LO”两个字母就断开了,但是这次失败是历史性的进步,因为两个不同的设备实实在在的通信了,最终修复之后完成了这五个字母的正常传输。
随后捯饬出的ARPANET(阿帕网) 这个项目,也就是正式的互联网雏形。
课外知识到此结束,现在我们看看第一章主要看点:
- 如何解析网址?
- DNS 服务器如何查询域名对应的 IP 地址?
- DNS服务器如何接力?
- 浏览器如何将消息委托给操作系统发送给 Web 服务器?
核心是理解DNS的角色地位和作用,以及浏览器如何跟DNS交互完成网址(域名)解析为IP这一个操作的,本章最后的委托流程是整个第二章的重点内容,笔记顺其自然的放到了第二章笔记当中,为了方便理解把笔记归纳到第二部分。
如何解析网址
我们从URL开始,什么是URL,URL是Uniform Resource Locator的简称,专业解释叫做统一资源定位符,除开我们常见的http、https协议之外,浏览器还可以进行ftp文件上传,下载文件,发送电子邮件,浏览新文化等操作。
我们把这些行为看作是资源交互,虽然不同的资源交互会存在不同的URL组合,但是不管URL的组合形式如何变化,最终是开头决定一切,开头部分决定对待资源方式。
解析网址我们可以看下面的例子:
碰到省略文件名的情况,通常下面几种:
http://xxxx/dir/
表示/dir/
之后的内容被省略,这时候通常情况下会设置对应这个目录的真实访问路径进行补全。- 对于web中最为经典的
http://localhost:8080/
访问路径,通常情况下Web服务器会访问到/index.html
这个文件,如果没有就会返回404的页面。 - 如果只有域名,比如
www.baidu.com
,那就会直接访问web服务器设置的根路径对应的资源和相关文件。 - 含混不清的路径比如
http://localhost:8080/wishlist
,则会根据先判断是否为文件名,然后判断是否为目录的情况处理,或者看作一个请求映射到另一处资源,或者做一次重定向。
上面的内容不必深究,只需要明白浏览器的第一步工作就是对 URL 进行解析。
Http请求
http请求简单来说可以简单概括为一句话:对什么做了什么样的操作,所谓对什么指的是URL,表示标识了的目标对象,做什么样的操作就是所谓的方法,方法主要是分为两个POST
和GET
方法,其他方法基本没啥用处,个人只在偶尔几个对接文档中遇到过PUT
和HEAD
方法。
GET
方法:通常用于一些可见资源的访问,或者开放资源的访问,通常情况下不需要过多的限制就可以直接向具体的目录寻找需要的资源。
POST
方法:比较常见的是使用表单或者 AJAX的方式访问,并且通常会指向一个WEB的应用程序,获取应用程序的数据需要传递服务器需要的一些有效参数,否则服务端会根据具体情况通知客户端无权访问。
AJAX即“Asynchronous JavaScript and XML”(非同步的JavaScript与XML技术),指的是一套综合了多项技术的浏览器端网页开发技术。Ajax的概念由杰西·詹姆士·贾瑞特所提出[1]。
Http请求消息
知道了 对什么做了什么样的操作,现在来看看Http 具体是怎么做这件事情的。
Http请求消息主要分为下面组织结构:
- 第一行最开头的部分提取URL的内容,原封不动解析,末尾为HTTP版本号主要标记当前HTTP请求版本。
例如:
GET /cgi/sample.cgi?Field1=ABCDEFG&SendButton=SEND HTTP/1.1
- 第二行为消息头,这里列举一些简单的内容:
- Data:请求响应生成日期。
- Pragma:数据是否允许缓存。
- Transfer-Encoding:消息主体编码格式(重要)。
- Via:经过的代理和网关。
- 消息头后面存在一行 完美没有内容的空行。
- 第四行为消息体,但是实验用的是GET方法所以通常内容为空。
我们以访问谷歌为例,下面的内容访问谷歌搜索页面的一次请求参考,这里的内容直接通过谷歌浏览器的F12拷贝,可以看到基本包含了请求行,消息头和消息行(GET通常没有所以下面没有体现)三种。
常规 1. 请求网址:https://www.google.com/ 2. 请求方法:GET 3. 状态代码:200 4. 远程地址:127.0.0.1:7890 5. 引荐来源网址政策:origin 请求标头 1. :authority:www.google.com 2. :method:GET 3. :path:/ 4. :scheme:https 5. accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 6. accept-encoding:gzip, deflate, br 7. accept-language:zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6 8. cache-control:no-cache 9. cookie:SID=KQi0QVpC_wxTynb6H6HjGmVq-9mYvCuIDOMx9EmEUJ8ii7dJzN_1F-ho69FdK6AN9ekOkA.; __Secure-1PSID=KQi0QVpC_wxTynb6H6HjGmVq-9mYvCuIDOMx9EmEUJ8ii7dJaTdIpqSfRfNb-BvF0haitA.; __Secure-3PSID=KQi0QVpC_wxTynb6H6HjGmVq-9mYvCuIDOMx9EmEUJ8ii7dJ6_WQQeEF09oAZ9MQfe21sA.; HSID=AOdmIhuBCutDeMwVS; APISID=ckyVXTB27QMaC2gQ/AVulr1cMnMbpD0e1x; SSID=AL0-0R0Ofsj3zaqrr; SAPISID=dqpTwJeh7bnii2Ki/AfsaDUfE8uMVR1aqv; __Secure-1PAPISID=dqpTwJeh7bnii2Ki/AfsaDUfE8uMVR1aqv; __Secure-3PAPISID=dqpTwJeh7bnii2Ki/AfsaDUfE8uMVR1aqv; SEARCH_SAMESITE=CgQIvJUB; 1P_JAR=2022-05-24-23; AEC=AakniGOKhznRpAD797X4u508i2XHJjEVYQQHANlqaJC2JSZ1F7mAe-vX_rg; NID=511=K-qt_LW-4ad1IYdJgfPLZjJw772wez2L3_FK9hwrrHAaksdhT8bTqz4icJEnJviOb92zcnyfS4h7P8HB_Is0f_FebYTe_5DR3qFEclHS1R9N1P7r9pv7Z4p12341S72RZRfzIlQ3-CVZUqQKBm1Xy1i9fKwejMGHTPMY2hk02sA--ey8nAEyt1_A7SVMe0RvrEkPnVm88fBnyyyFMMSCeSG1oqYKeC2x7iHJ0GwdbEpeGojpMQyQxAn1jAdxyXbC0oko0rCFjYn7eUREz2A9KA; SIDCC=AJi4QfGQeW0y_3pnzuBs7KI-WabF5XR_-dQchpcoNUN_bRVICBknb39qNQhP4IklnPn6kW4M3d8; __Secure-3PSIDCC=AJi4QfFOaoqiWv0mqmOskkIKVYy_-QNOATkPOyhNt9B8BBTMnRqnv-0zdgVgBNmIJRwlzBS4x6U 10. pragma:no-cache 11. sec-ch-dpr:2 12. sec-ch-ua:" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101" 13. sec-ch-ua-arch:"arm" 14. sec-ch-ua-bitness:"64" 15. sec-ch-ua-full-version:"101.0.4951.64" 16. sec-ch-ua-full-version-list:" Not A;Brand";v="99.0.0.0", "Chromium";v="101.0.4951.64", "Google Chrome";v="101.0.4951.64" 17. sec-ch-ua-mobile:?0 18. sec-ch-ua-model:"" 19. sec-ch-ua-platform:"macOS" 20. sec-ch-ua-platform-version:"12.3.1" 21. sec-ch-ua-wow64:?0 22. sec-ch-viewport-width:1440 23. sec-fetch-dest:document 24. sec-fetch-mode:navigate 25. sec-fetch-site:same-origin 26. sec-fetch-user:?1 27. upgrade-insecure-requests:1 28. user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 29. x-client-data:CLG1yQEIkrbJAQijtskBCMS2yQEIqZ3KAQjYjMsBCJShywEI2+/LAQjmhMwBCNupzAEI/qrMAQjDrMwBCKSvzAEYqKnKARirqcoB 30. 已解码:message ClientVariations { // Active client experiment variation IDs. repeated int32 variation_id = [3300017, 3300114, 3300131, 3300164, 3313321, 3327576, 3330196, 3340251, 3342950, 3347675, 3347838, 3348035, 3348388]; // Active client experiment variation IDs that trigger server-side behavior. repeated int32 trigger_variation_id = [3314856, 3314859]; }
响应内容
响应页面也是类似的需要回应请求行需要的内容信息,同时告知自己允许接受什么样的请求,如果目标IP找不到通常会变为404结果。
响应标头 1. accept-ch: Sec-CH-Viewport-Width 2. accept-ch: Sec-CH-Viewport-Height 3. accept-ch: Sec-CH-DPR 4. accept-ch: Sec-CH-UA-Platform 5. accept-ch: Sec-CH-UA-Platform-Version 6. accept-ch: Sec-CH-UA-Full-Version 7. accept-ch: Sec-CH-UA-Arch 8. accept-ch: Sec-CH-UA-Model 9. accept-ch: Sec-CH-UA-Bitness 10. accept-ch: Sec-CH-UA-Full-Version-List 11. accept-ch: Sec-CH-UA-WoW64 12. alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" 13. bfcache-opt-in: unload 14. cache-control: private, max-age=0 15. content-encoding: br 16. content-length: 43734 17. content-type: text/html; charset=UTF-8 18. date: Tue, 24 May 2022 23:24:59 GMT 19. expires: -1 20. server: gws 21. set-cookie: 1P_JAR=2022-05-24-23; expires=Thu, 23-Jun-2022 23:24:59 GMT; path=/; domain=.google.com; Secure; SameSite=none 22. set-cookie: AEC=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com 23. set-cookie: AEC=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com 24. set-cookie: AEC=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com 25. set-cookie: AEC=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com 26. set-cookie: SIDCC=AJi4QfEXTiPm1BcAx1gfQzXOs-hmdcHylOVoSbbpy8cUIlP7hNwwfnfo_E8ZdTY1JZli8AqYYWk; expires=Wed, 24-May-2023 23:24:59 GMT; path=/; domain=.google.com; priority=high 27. set-cookie: __Secure-3PSIDCC=AJi4QfFdxOIbJrwDKltt2sBRVFIcLOCyqQmgTSfYjXTYwqbhh0GPLcR9cxsgyaIh1j_GITbGeHc; expires=Wed, 24-May-2023 23:24:59 GMT; path=/; domain=.google.com; Secure; HttpOnly; priority=high; SameSite=none 28. strict-transport-security: max-age=31536000 29. x-frame-options: SAMEORIGIN 30. x-xss-protection: 0
响应内容相对比较简单,主要关注重点为第一行内容中的状态码和响应短语,请求执行结果是成功还是失败。上面的交互内容需要注意Http请求严格遵循一个请求对应一个响应内容。
注意:1 条请求消息中只能写 1 个 URI。如果需要获取多个文件,必须对每个文件单独发送 1 条请求。
“如何解析网址?”这个问题从头到尾的介绍到这里就完成的,接下来来看看下一个问题"DNS 服务器如何查询域名对应的 IP 地址?"。
IP 和 DNS
首先我们看看IP和DNS是啥,解析网址(域名)和发送请求和响应内容看似是浏览器完成的,实际上它并不具备这些功能, 浏览器收发网络请求实际上需要依托操作系统完成 ,而现代网络基本是TCP/IP
的天下,所以IP
发挥关键作用,而DNS
存储IP
和域名映射的仓库。
- IP:可以类比做我们现实的具体位置,比如XX路XX号,XX路(网络号)对应的的是分配给整个子网的号码,而XX号(IP地址)的号码则分配给子网中的计算机,获得到IP地址之后就相当于锁定了当前计算机所在的具体位置,自然也可以可以找到了。
- DNS:直白来讲就是存储了域名和IP映射的记录的站点,浏览器要获取真实安排需要找DNS才能知道,因为域名放任用户自由定义将会出现同一个域名映射多个IP。
下面我们先观察XX路XX号的号也就是IP地址是如何被找到的。
发送网络的一方通过子网首先需要经过集线器,把内容转发到最近的路由器上,然后路由器会不断跨越找到离接受者更近的下一个路由器,最后再找到集线器然后在转发到接收者的路由器上,路由器在这里是方向盘的角色,而DNS寻址就像是导航。
集线器和路由器是什么? A 路由器:一种对包进行转发的设备。 B 集线器:一种对包进行转发的设备, 分为中继式集线器和交换式集线器两种.