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

    文章

    701

    浏览量

    55634
  • USB控制器
    +关注

    关注

    1

    文章

    35

    浏览量

    11864
  • SoC设计
    +关注

    关注

    1

    文章

    148

    浏览量

    18774
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136707
  • URL
    URL
    +关注

    关注

    0

    文章

    139

    浏览量

    15328
收藏 人收藏

    评论

    相关推荐

    C语言实现url解析小实例

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

    为什么有些URL包含“www”,有些却不包括?“www”是什

    为什么有些URL包含“www”,有些却不包括?“www”是什么意思? 众所周知,“普通”网站的URL如下所示:http://www.howstuffworks.com。然而您可能也已注意到,很多网站并不需
    发表于 08-06 08:16 4001次阅读

    URL,URL是什么意思

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

    C#教程之打开Url

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

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

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

    检测恶意URL的方法

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

    Chrome 86新特性:改进地址栏隐藏/显示完整 URL 功能

    钓鱼、社交工程和网络诈骗。项研究显示,当 URL 中出现误导性品牌名称时,超过 60% 的用户会被欺骗。
    的头像 发表于 08-17 11:23 2429次阅读
    Chrome 86新特性:改进地址栏隐藏/显示完整 <b class='flag-5'>URL</b> 功能

    基于畸形URL前缀的网络攻击激增6000%

    来自GreatHorn的研究人员报告说,他们已经观察到了犯罪分子通过构造 “畸形的URL前缀 ”来逃避安全软件的防护,发送钓鱼邮件进行攻击的次数增加了近6000%。除非你仔细观察URL前缀中使用的符号,要不然,它们看起来是非常合法的。
    的头像 发表于 02-26 15:40 1722次阅读

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

    EN55022 B类认证产品文档URL链接
    发表于 05-10 18:27 19次下载
    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 1568次阅读

    IP知识百科之URL过滤

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

    编写用于解析url的小例子

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

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

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

    Spring MVC的工作原理是怎样的

    的处理、视图的渲染和响应的发送。 首先,当用户在浏览器中输入URL并发送请求时,请求被发送到服务器。服务器会根据请求的URL和其他相关信
    的头像 发表于 11-22 16:53 884次阅读

    MySQL数据库的url地址

    MySQL数据库的URL地址是用于连接到MySQL服务器的地址。URL种统资源定位符,用于指定特定资源的位置和访问方式。MySQL数据库的UR
    的头像 发表于 12-06 10:58 2644次阅读