0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

输入一个URL

冬至子 来源:西加加语言 作者:吳YH堅 2023-06-05 14:46 次阅读

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

硬件层---键盘到CPU

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

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

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参与运算之类的,要写就写不完了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • USB接口
    +关注

    关注

    9

    文章

    672

    浏览量

    54984
  • USB控制器
    +关注

    关注

    1

    文章

    34

    浏览量

    11791
  • SoC设计
    +关注

    关注

    1

    文章

    141

    浏览量

    18667
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128720
  • URL
    URL
    +关注

    关注

    0

    文章

    134

    浏览量

    14830
收藏 人收藏

    评论

    相关推荐

    URL什么意思

    `在LabVIEW中同OPC数据通信时,使用DataScoket读写OPC服务器,其中这个URL是什么意思?`
    发表于 07-17 16:52

    C语言实现url解析小实例

    编写简单的用于解析url的小例子,最终目标是解析出URL中所有的数据信息。二、库函数用到的几个库函数如下:1. strncasecmp头文件#include<
    发表于 04-12 09:10

    URL,URL是什么意思

    URL,URL是什么意思 URL(Uniform Resoure Locator:统一资源定位器)是WWW页的地址,它从左到右由下述部分组成: &
    发表于 03-22 10:53 8197次阅读

    C#教程之打开Url

    C#教程之打开Url,很好的C#资料,快来学习吧。
    发表于 04-20 10:50 5次下载

    一·从输入url到页面展示到底发生了什么

    第一步·输入地址 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得url了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的
    发表于 01-11 15:35 351次阅读
    一·从<b class='flag-5'>输入</b><b class='flag-5'>url</b>到页面展示到底发生了什么

    检测恶意URL的方法

    提出一种高效的基于段模式的检测恶意URL的方法,该方法首先解析已标注的恶意URL中的域名、路径名和文件名3个语义段,然后通过建立以三元组为词项的倒排索引快速计算恶意URL每个语义段的模式,最后
    发表于 02-27 11:18 1次下载
    检测恶意<b class='flag-5'>URL</b>的方法

    谷歌Chrome地址栏URL将可以完整显示

    据XDA报道,Chrome 76精简了地址栏URL显示样式,将“HTTPS/WWW”等自动隐藏,但未来新的flag标志可以将完整显示URL的特性带回。
    的头像 发表于 03-17 14:36 1755次阅读

    谷歌 Chrome 地址栏将默认连接到网站 URL 的 HTTPS 版本

    1月12日消息 据外媒 9TO5Google 报道,谷歌 Chrome 即将很快开启一项实验改进,当用户在地址栏中输入网址时,会默认连接到网站 URL 的 HTTPS 版本,而不是不安全的 HTTP
    的头像 发表于 01-12 14:46 1759次阅读

    EN55022 B类认证产品文档URL链接

    EN55022 B类认证产品文档URL链接
    发表于 05-10 18:27 16次下载
    EN55022 B类认证产品文档<b class='flag-5'>URL</b>链接

    简述go语言标准库 net/url 库的过程。

    本文是一篇学习笔记,记录了作者学习 go 语言标准库 net/url 库的过程。 参考:https://studygolang.com/pkgdoc 导入方式: import “net/url
    的头像 发表于 08-14 10:35 1382次阅读

    IP知识百科之URL过滤

    URL过滤 URL过滤是一种针对用户的URL请求进行上网控制的技术,通过允许或禁止用户访问某些网页资源,达到规范上网行为和降低安全风险的目的。URL过滤可以基于
    的头像 发表于 09-23 11:08 5029次阅读

    编写一个用于解析url的小例子

    前面一口君写了一篇关于url的文章:《一文带你理解URI 和 URL 有什么区别?》
    的头像 发表于 04-14 12:55 1407次阅读

    什么是URL?为什么要做URL静态化?

    进行URL静态化的目的是对于搜索引擎和用户来说更为友好,虽然Google之前在官方博客发表了博文Google能够很好的抓取动态网页,并且也非常鼓励网站采取动态网页的形式来建站,但是我们所要做的网站
    的头像 发表于 06-28 15:34 762次阅读

    Spring MVC的工作原理是怎样的

    的处理、视图的渲染和响应的发送。 首先,当用户在浏览器中输入一个URL并发送请求时,请求被发送到服务器。服务器会根据请求的URL和其他相关信息,将请求分发给合适的控制器。Spring MVC的核心组件
    的头像 发表于 11-22 16:53 309次阅读

    MySQL数据库的url地址

    MySQL数据库的URL地址是用于连接到MySQL服务器的地址。URL是一种统一资源定位符,用于指定特定资源的位置和访问方式。MySQL数据库的URL地址通常由以下几个部分组成: 协议
    的头像 发表于 12-06 10:58 979次阅读