输入一个URL

前几天看到一个题目,问在浏览器中输入一个URL会发生神马,这好像是网上比较流行的面试题,并且也被回答烂了,仔细想下来,要是本身遇到这个题目能不能答上来,后来一想,这个题目要彻底答出来能够把大学开始的几乎全部知识都用上。呵呵,为了模拟面试,因此都凭印象说的,没有查网络资料,因此估计不少地方都不对,欢迎来拍。
后续能够总结一个很是很是详细的版本,我的感受真的能够把大学开始的全部的东西都用上,包括连数电模电(所有流程都跑不掉),信息论(gzip压缩),密码学(HTTPS),通信原理(网络基带传输)这种均可以,本文仍是以软件处理过程为主。html

硬件层---键盘到CPU

输入网址嘛,那就是键盘输入了,键盘通常用usb或者PS/2口链接电脑,如今见过PS/2口的人很少了吧,咱们就看看usb吧,usb分为主从模式,通常的键盘自己的usb是一个从设备,相应的还有u盘啊,鼠标啊都是从设备,对应的主机端的USBcontroller是一个主设备,这个主设备挂在CPU上,在X86结构的机器上是挂在主板的南桥(好像是的,反正是低速的那个)芯片上,若是是ARM这类嵌入式设备的话,那么就是挂在APB总线上,对这个我熟悉一些,就按ARM这种SoC来讲吧,当是在手机上输入URL吧,呵呵。nginx

键盘输入字符之后,经过USB协议(USB协议简单的来讲就是一个串行协议,靠一个时钟电信号和一个数据电信号传输数据)将数据传输到APB总线上的USB控制器上。而后这个控制器开始抢总线,总线的APB桥接收到信号之后也开始经过APB总线上的时钟和数据线发送一个中断信号APB桥中,APB桥同时链接在AHP高速总线上,接收完数据之后,它开始抢高速总线,高速总线上有个Arbiter(总线仲裁器),由于高速总线上接的都是内存啊这种家伙,你一个小小的USB不见得抢得过他们,等仲裁器给你时间之后,APB桥开始把中断信号发给CPU。web

CPU接收到这个中断之后,要是没有其余更高级的中断须要处理的话就会调用内核中的中断处理函数开始处理中断,中断处理函数又分为底半部和顶半部,首先会是底半部处理,把中断放处处理队列中就返回了,而后顶半部从队列根据注册的的中断号拿到本身对应的中断号进行处理,这时候中断处理函数就算收到这个信号了,至关于硬件的电信号已经传递到软件层了,中断处理函数会调用USB的驱动程序去USB控制器上读取这个输入的字符,这个字符仍是经过两条总线(APB和AHB)以独占的方式传递到软件层上,其实呢,是软件控制这个信号写到了内存的某个空间上。面试

整个流程是这样的算法

发出中断 :键盘--->usb控制器 ---> APB桥 ---> CPU硬件中断 ---> 中断处理底部 ---> 中断处理函数顶部 ---> 驱动程序 ---> 读取数据 ---> CPU寻址 ---> 写入内存后端

内核层到应用层

假设咱们输入的url以C语言的scanf函数为例,scanf函数会一直在内核态阻塞着,直到中断处理函数接收到了全部的字符而且接受到了一个回车符,这时scanf语句会经过操做系统的read调用把缓冲区的全部字符从内核态拷贝到用户态,这时这些个字符就从电信号传递到了应用程序(浏览器)的软件层了。浏览器

整个流程是服务器

scanf ---> 系统调用read ---> 内核态阻塞等待 ---> 读取拷贝数据 ---> 用户态接收数据微信

由于软件层也不是一个实体层次,其实全部的操做最后都变成了硬件的电信号,全部没办法把流程写得很明白,大概就是这么个意思吧。网络

网络请求

应用程序(浏览器)接收到这个URL之后,就开始走网络层来获取数据了,这里咱们就不深刻到底层的电信号了,就按网络这一套来讲吧。

DNS解析

首先就要解析域名了,浏览器会先看一下本地的host文件,看有没有url域名对应的ip地址,若是没有的话,会经过DNS协议发送数据包给DNS服务器询问域名的ip地址,DNS服务本身没有对应的ip的话会继续往上寻找,而后把ip地址发回给浏览器。DNS协议是UDP的,但好像有特殊状况是TCP链接,好像是各个DNS服务器之间传输用的TCP吧,无论了,反正经过UDP这个传输层协议之上的DNS应用层协议把url对应的ip地址获得了。

传输数据准备

拿到ip地址之后,假设咱们输入的网址是https://www.baidu.com/,百度的服务器在北京,而咱们在上海,浏览器就经过connect开始链接这个这个北京的ip地址了,链接跑到tcp/ip协议栈之后,协议栈一看这个IP和本地IP根本就不在一个段上啊,那ARP也不发了,直接把数据包转发到网关上,也就是家里的路由器上了,路由器拿到地址,查一下本地的路由表,呀,我这小路由表上没这个网段的啊,那我无论了,给个人上级路由吧(也许是小区的大路由器了),小区路由一看,我这也没有啊,这样一级一级传递到了上海的城际路由上,而后到了北京的城际路由,这么一层一层下来终于传到了百度的服务器上。

在这里看上去简单,可是路由的算法是很复杂的,这一块我也不太懂没弄过,可是Dijkstra选路算法仍是明白的,别问我为何记得这个单词,大学计算机网络课的课程做业啊,就是实现这个Dijkstra啊,经过路由算法,终于把第一个数据包发送给百度的服务器了。

创建链接

这个数据包是神马呢,就是咱们熟悉的TCP三次握手的第一握了,SYN=1的那个数据包,关于三次握手就很少说了,你们都知道,关键是我不记得细节了,反正就是你们都懂的,握手完了链接就创建完了。为何创建链接须要三次握手,关闭链接须要四次握手,呵呵,写不动了。

同时,在百度服务器这边,有个web服务器的应用程序(好比Nginx),一直在监听着80端口,收到这个数据包之后也同时和客户端创建起了链接了。

传输数据

链接创建好之后,是TCP链接创建了,这时经过更上层的HTTP协议开始传输数据,HTTP协议自己很复杂,这里咱们简单的来讲,就是浏览器发送了一个GET / HTTP/1.1 \n\r字符串给了服务器,服务器接受到这个字符串之后,经过协议栈传递给了上层的Nginx应用程序。

应用程序一看这个地址是/,而后对照一下本身的配置文件nginx.conf,有个配置告诉他碰到这种请求,直接把本地的index.html吐出去,因而Nginx读取index.html并把数据经过这条TCP链接回复给了客户端。

因为http协议是无状态的,因此本次传输完数据之后,这个连接就关闭了。

完成显示

好了,后面的就是接受到数据的显示了,关于webkit内核的细节就真不清楚了,就是解DOM树,执行JS代码,从新请求CSS和图片,而后把页面画出来吧。

哦了,题目作完了,其实还有不少细节没有说的,好比网络寻址的时候的ARP协议啊,路由器寻路的其余不少算法啊,Nginx处理请求的时候的几个阶段解读啊,是否须要反向代理到后端的服务器上啊,最后显示的时候还须要操做显卡进行显存的操做,若是页面中有复杂的图形效果还须要GPU参与运算之类的,要写就写不完了。


若是你以为不错,欢迎转发给更多人看到,也欢迎关注个人公众号,主要聊聊搜索,推荐,广告技术,还有瞎扯。。文章会在这里首先发出来:)扫描或者搜索微信号XJJ267或者搜索西加加语言就行

图片描述

相关文章
相关标签/搜索