从点击到呈现 — 详解一次HTTP请求(2)

上回说道服务器启动了监听服务,准备迎接来自客户机的请求。那么,我们以一次典型的浏览请求来解析:

当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,对于 google chrome 那种变态的浏览器,他甚至会直接从缓存中把网页展示出来,就是说,你还没有按下 enter,页面就出来了,这个过于奇葩,我们不详细讲。

在例如输入了 baidu 或者 qq 之类的域名后,我们可以按下 ctrl + enter ,来自动补全,生成 qq.com 或者 baidu.com 的网址,然后发起请求。请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址,说道这里,大家可能想到,这个地方就存在安全隐患了,如果有病毒把一些常用的域名,修改 hosts  文件,指向一些恶意的 ip,那么浏览器也会不加判断的去连接,是的,这正是很多病毒的惯用手法。

如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会向 dns 域名解析服务器发起域名解析请求,dns 的域名解析是递归的,(还有另外 dns 是迭代的),递归的 dns 首先会查看自己的 dns 缓存,如果缓存能够命中,那么就从缓存中把 ip 地址返回给浏览器,如果找不到对应的域名的 ip 地址,那么就向上转发请求,然后把得到的这个域名对应的 nameserver 的地址取得,再向这个 namserver 去请求域名对应的 ip,最后把这个 ip 地址返回给浏览器,不过怎么说,这个递归查询的过程,对于浏览器来说是透明的,他只要坐等 ip地址送回来就可以了。对于 DNS 的进一步理解,可以看这里,进一步理解 DNS

得到 ip 地址后,浏览器会开始构造一个 http 请求,一个典型的 http request header 一般需要包括请求的方法,例如 GET 或者 POST 等,不常用的还有 PUT 和 DELETE 方法,更加不常用的还有 HEAD 和 OPTION 以及 TRACE 方法,一般的浏览器只能发起 GET 或者 POST 请求,应用层的 http 请求准备好后,浏览器在传输层发起一条到达服务器的 tcp 连接,这个时候应该开始三次握手的过程,tcp 包被封装到网络层的 ip 包里面,ip 包再被封装到数据链路层的数据帧结构中,再通过物理层的比特流送出去,这些分层的意义在于分工合作,数据链路层通过 CSMA/CD 协议保证了相邻两台主机之间的数据报文传递,而网络层的 ip 数据包通过不同子网之间的路由器的路由算法和路由转发,保证了互联网上两台遥远主机之间的点对点的通讯,不过这种传输是不可靠,于是可靠性就由传输层的 tcp 协议来保证,tcp 通过慢开始,乘法减小等手段来进行流量控制和拥塞避免,同时提供了两台遥远主机上进程到进程的通信,最终保证了 http 的请求头能够被远方的服务器上正在监听的 http 服务器进程收到,终于,数据包在跳与跳之间被拆了又封装,在子网与子网之间被转发了又转发,最后进入了服务器的操作系统的缓冲区,服务器的操作系统由此给正在被阻塞住的 accept 函数一个返回,将他唤醒。

8 thoughts on “从点击到呈现 — 详解一次HTTP请求(2)

    • 嗯,dns 这块确实没讲好,不够清晰易懂,不要被我误导了,哈哈,像 chrome 这种的,还有 chrome://dns/,里面还有 prefetch

  1. Pingback: 老生常谈-从输入url到页面展示到底发生了什么 丨 web技术笔记

  2. Pingback: 从输入URL到页面显示发生了什么 | 言曌博客

Leave a Reply

Your email address will not be published. Required fields are marked *