[关闭]
@wangjialin 2016-08-08T20:27:14.000000Z 字数 2855 阅读 755

面试

未分类


自我介绍:你好,我叫王佳林,本科毕业于郑州大学,专业是生物信息,是计算机和生物的交叉学科,毕业后考研也是选择的计算机专业,但是准备比较仓促没能如愿考上理想的学校,但是也算是系统的复习了一下计算机基础。去年考研结束后,学习了一段时间Python,做了几个类似纸牌和桌球的简单的小游戏,3月份恰逢百度2016年的前端技术学院春季班开始报名,因为大学的时候有了解过一些前端,就报名了这个春季班,正式开始了前端的学习,这个前端春季班主要分为四个部分,第一个部分是HTML和CSS,从开始简单的居中以及三栏布局开始到后来的报纸以及企业页面,结束后可以在符合语义化的基础上完成比较复杂的页面布局;第二部分是关于JS的练习,我自己所有的任务都是用原生JS实现的,在DOM的基础上,熟悉了基于JS的数据结构以及算法,了解了JS的数组,对象,字符串,正则以及排序算法,事件代理,表单验证;第三部分和第四部分是连接的,基本上是锻炼了对JS框架的使用,我选择的是JQ和React。现在可以写出符合语义化的页面结构以及基本的布局和动画,常见的交互。这段时间的大部分代码都可以在github上面看到。

当在浏览器地址栏输入一个URL后回车,将会发生的事情?

假设为https://www.baidu.com/index.html

  1. 首先解释下URL是什么?URL,uniform resource locator统一资源定位符,大体上由三部分组成,第一部分是协议(http,https,ftp,file...),第二部分是hostname(主机名)便于理解记忆一般都以字符串形式表示主机资源(主机名+端口号),比如www.baidu.com,com对应的就是根域名,接下来是一级域名二级域名,第三部分是主机资源的具体地址,细分的话含有路径path,具体的请求参数等;

  2. 按下回车后,大体上分为两个部分,一个是形成回路后硬件层面的处理,简单讲就是按键的消息由于电路的闭合被发现,接着配合驱动以及某些端口的处理将信息传递给当前活跃的应用程序,这时就触发了比较复杂的关于网络部分的处理

  3. URL前期处理 由于题目中表明输入的是URL而不是关键字,那么就不需要考虑关键字的 情况,因此接下来显示要对URL进行解析以及寻找目标地址的IP。由第一部分可知,第一个冒号前的部分是所使用的协议,大部分的网页访问都是基于HTTP/HTTPS协议进行的,有时候我们会发现是file之类的其他协议,在这里只研究一般化,即http协议,这个协议内容分为请求行、消息正文等等。通俗说就是http协议表明了要采用什么方式干什么事情。接下来就是URL的域名部分,需要采用DNS进行域名解析得到目的IP. DNS简单讲就是存放了域名到IP地址的映射表的一些分布式服务器,分为根域名服务器,顶级域名服务器,二级域名服务器等等,和域名的层级对应,因此解析需要一层一层的找到IP。具体的查找过程可能有以下几个方面:一般而言,分为递归查询和迭代查询,两种查询都是由浏览器先向本地域名服务器(本地路由器或者 ISP 的缓存 DNS 服务器,一般会使用ARP广播)发出请求,若没找到该域名对应的ip,递归查询则向根域名发出请求,找到com所在的根域名服务器的ip,然后com根域名服务器向顶级域名服务器发出请求baidu的域名服务器,找到对应IP之后再如此向下发出请求,找到最终的ip之后再一层一层返回,直至返回到本地域名服务器,然后将结果返还给浏览器。迭代查询是本地域名服务器向根域名服务器发出请求,结果直接返回给本地服务器,然后本地再向结果对应的ip发出请求,再返回,依次得到最终的ip.在实际的DNS查询过程中,一般不会这么麻烦,而是按下回车后,依次查询浏览器缓存,系统缓存,路由器缓存,一般都会在本地域名服务器或者之前的缓存中得到目的IP

  4. 响应并完成传输————建立tcp连接,三次握手(客户机发送SYN请求连接,服务器主机回复SYN以及ACK确认,最后客户机发送ACK对确认进行回复)建立连接并将http请求作为tcp报文段的数据部分封装以及发送——路由寻址,先在路由表里面查询与目的IP一致的主机,找不到的话就查找网络号一致的,若还是没有则找到默认的下一跳IP,依次进行这三种查询,一旦查到符合要求的IP就进行传送,没有找到就放弃并回传网络不可达——目标主机收到了请求后,自底向上地对该请求进行处理。链路层把数据报传给网络层,网路层将TCP数据段通过对应的Socket传给应用程序。应用程序处理请求后产生一个应答的HTTP报文,又经过了一层层的封装、一跳跳的传输到达了源主机。

  5. 断开连接——当源主机传输层收到了应答之后,就要关闭这条TCP连接了。但是,又不能悄悄地自己关了,目标主机那边还不知道你要不要关闭呢。于是就有了对应创建TCP连接“三次握手”的关闭TCP连接“四次挥手”。FIN-ACK-FIN-ACK

  6. HTML,CSS解析——HTML,CSS加载 ——遍历DOM节点并根据绘制的DOM树计算出对应的样式进行渲染——同步执行JS代码并在合适的时机触发JS动画
    在这里面需要了解到HTML解析并绘制DOM树的时候并不是简单地自顶向下或者自下向上的方式,因为JS文件里面还会有一下比如document.write之类的操作,所以会对DOM不断进行修改;CSS文件分为外链和内联,所以会根据权重的不同对样式进行计算得到最终的样式,这里需要注意的是,尽量不要把CSS里面嵌套的层级写的过多,尽量采用可复用的样式,这样会减少DOM节点的匹配步骤,进一步减少CSS样式的计算时间,从而尽快的实现页面的绘制

部分地区用户反应网站很卡,请问有哪些可能性的原因,以及解决方法?

  1. 部分地区而不是所有用户——可以先排除由于页面编写不合理比如需要加载的文件过多,js特效过多,或者页面引用了过多其它网站的内容的原因;也排除由于服务器过载的问题
  2. 部分地区,由地区的原因划分的网站卡顿问题,可以排除网站卡顿并不是因为这些人的电脑有故障或者防火墙之类用户自身的问题
  3. 排除了页面编写的问题,排除了用户自身的问题,很有可能问题出在网络上。打开别的网页试一下或者采用一些排除法分析到底是那一层出现了问题:首先分析链路层,可能某段网线有故障,接触不良之类的问题;或者有可能是交换机或者集线器的问题导致的网络中广播风暴,撤换掉怀疑有问题的交换机/集线器来排除此类问题;
  4. 网络层原因: 比如有可能是这个地区的网络中计算机过多,上网的时间比较集中,负载过重造成数据传输过慢造成——增加带宽;或者该地区的网络受到了攻击,某些有效的带宽资源被霸占,导致用户访问不通——抓包检查是否有某个IP段的数据传输不正常;可能是当地网络中出现了环路,会造成每一帧数据报都在网络中重复传播,最终造成网络阻塞——现在的网络
  5. 传输层原因:网络不好造成TCP由于丢包或者延时发生重传导致的网页打开过慢
  6. 域名解析DNS过慢,可能一个域名对应多个IP但是一部分IP的服务器发生了故障
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注