http面试题

136 阅读12分钟

0,比如 给一个网址:scheme: // host.domain:port / path / filename ? abc = 123 # 456789

scheme       - 定义因特网服务的类型。常见的协议有 http、https、ftp、file,
         		  其中最常见的类型是 http,而 https 则是进行加密的网络传输。
host         - 定义域主机(http 的默认主机是 www)
domain       - 定义因特网域名,比如 baidu.com
port         - 定义主机上的端口号(http 的默认端口号是 80)
path         - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。
filename     - 定义文档/资源的名称
query        - 即查询参数
fragment     - 即 # 后的hash值,一般用来定位到某个位置

一、状态码:

  2XX(成功处理了请求状态)
      200 服务器已经成功处理请求,并提供了请求的网页
      201 用户新建或修改数据成功
      202 一个请求已经进入后台  
      204 用户删除成功  
  3XX(每次请求使用的重定向不要超过5次)
      304 网页上次请求没有更新,节省带宽和开销
  4XX(表示请求可能出错,妨碍了服务器的处理)
      400 服务器不理解请求的语法
      401 用户没有权限(用户名,密码输入错误)
      403 用户得到授权(401相反),但是访问被禁止
      404 服务器找不到请求的网页,
  5XX(表示服务器在处理请求的时候发生内部错误)
      500 服务器遇到错误,无法完成请求
      501 服务器不支持
      503 服务器目前无法使用(超载或停机维护)

二、304的缓存原理(添加Etag标签.last-modified) 304 网页上次请求没有更新,节省带宽和开销 1.服务器首先产生Etag,服务器可在稍后使用它来判断页面是否被修改。本质上,客户端通过该记号传回服务器要求服务器验证(客户端)缓存) 2.304是 HTTP的状态码,服务器用来标识这个文件没有被修改,不返回内容,浏览器接受到这个状态码会去去找浏览器缓存的文件 3.流程:客户端请求一个页面A。服务器返回页面A,并在A上加一个Tage客服端渲染该页面,并把Tage也存储在缓存中。客户端再次请求页面A 并将上次请求的资源和ETage一起传递给服务器。服务器检查Tage.并且判断出该页面自上次客户端请求之后未被修改。直接返回304

last-modified: 客服端请求资源,同时有一个last-modified的属性标记此文件在服务器最后修改的时间
		客服端第二次请求此url时,根据http协议。浏览器会向服务器发送一个If-Modified-Since报头,
		询问该事件之后文件是否被修改,没修改返回304

 有了Last-Modified,为什么还要用ETag?
  1、因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确(Last—Modified不能识别秒单位的修改)
  2、某些服务器不能精确的得到文件的最后修改时间
  3、一些文件也行会周期新的更改,但是他的内容并不改变(仅仅改变修改的事件),这个时候我们并不希望客户端认为文件被修改,而重新Get

ETag,为什么还要用Last-Modified?
  1、两者互补,ETag的判断的缺陷,比如一些图片等静态文件的修改
  2、如果每次扫描内容都生成ETag比较,显然要比直接比较修改时间慢的多。


ETag是被请求变量的实体值(文件的索引节,大小和最后修改的时间的Hash值)
  1、ETag的值服务器端对文件的索引节,大小和最后的修改的事件进行Hash后得到的。

三、get/post的区别 1.get数据是存放在url之后,以?分割url和传输数据,参数之间以&相连; post方法是把提交的数据放在http包的Body中(post比get更安全点) 2.get提交的数据大小有限制,(因为浏览器对url的长度有限制),post的方法提交的数据没有限制 3.get需要request.queryString来获取变量的值,而post方式通过request.from来获取变量的值 4.get的方法提交数据,会带来安全问题,比如登录一个页面,通过get的方式提交数据,用户名和密码就会出现在url上 5.get能缓存,post不能 四、http协议的理解 1.超文本的传输协议,是用于从万维网服务器超文本传输到本地资源的传输协议 2.基于TCP/IP通信协议来传递数据(HTML,图片资源) 3.基于运用层的面向对象的协议,由于其简洁、快速的方法、适用于分布式超媒体信息系统 4.http请求信息request: 请求行(request line)、请求头部(header),空行和请求数据四部分构成 请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本. 请求头部,用来说明服务器要使用的附加信息 空行,请求头部后面的空行是必须的 请求数据也叫主体,可以添加任意的其他数据。 5.http相应信息Response 状态行、消息报头、空行和响应正文 状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成 消息报头,用来说明客户端要使用的一些附加信息 空行,消息报头后面的空行是必须的 响应正文,服务器返回给客户端的文本信息。

五、http和https https:是以安全为目标的HTTP通道,简单讲是HTTP的安全版本,通过SSL加密 http:超文本传输协议。是一个客服端和服务器端请求和应答的标准(tcp),使浏览器更加高效,使网络传输减少

五、http1.0 1.1 2.0的区别 长连接:HTTP1.0需要使用keep-alive参数来告知服务器建立一个长连接,而HTP1.1默认支持长连接 节约宽带:HTTP1.1支持只发送一个header信息(不带任何body信息) host域(设置虚拟站点,也就是说,web server上的多个虚拟站点可以共享同一个ip端口):HTTP1.0没有host域

1.http2采用的二进制文本传输数据,而非http1文本格式,二进制在协议的解析和扩展更好
2.数据压缩:对信息头采用了HPACK进行压缩传输,节省了信息头带来的网络流量
3.多路复用:一个连接可以并发处理多个请求
4.服务器推送:我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源

六、koa和express的区别 1.异步流程的控制。express采用callback来处理异步,koa2采用的是async/await 2.错误处理。express采用callback捕获异常,对深层次的异常捕获不了。koa采用try/catch

七、web缓存 1.web缓存就是存在于客户端与服务器之间的一个副本、当你第一个发出请求后,缓存根据请求保存输出内容的副本 2.缓存的好处 (1)减少不必要的请求 (2)降低服务器的压力,减少服务器的消耗 (3)降低网络延迟,加快页面打开速度(直接读取浏览器的数据)

八、常见的web安全及防护原理 1.sql注入原理:通郭sql命令插入到web表单递交或者输入活命,达到欺骗服务器执行的恶意sql命令 防范:1.对用户输入进行校验 2.不适用动态拼接sql 2.XSS(跨站脚本攻击):往web页面插入恶意的html标签或者js代码。 举例子:在论坛放置一个看是安全的链接,窃取cookie中的用户信息 防范:1.尽量采用post而不使用get提交表单 2.避免cookie中泄漏用户的隐式 3.CSRF(跨站请求伪装):通过伪装来自受信任用户的请求 举例子:黄轶老师的webapp音乐请求数据就是利用CSRF跨站请求伪装来获取QQ音乐的数据 防范:在客服端页面增加伪随机数,通过验证码 XSS和CSRF的区别: 1.XSS是获取信息,不需要提前知道其他用户页面的代码和数据包 2.CSRF代替用户完成指定的动作,需要知道其他页面的代码和数据包

九、CDN(内容分发网络) 1.尽可能的避开互联网有可能影响数据传输速度和稳定性的瓶颈和环节。使内容传输的更快更稳定。 2.关键技术:内容存储和分发技术中 3.基本原理:广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对的地区或者网络中。当用户访问网络时利用全局负载技术 将用户的访问指向距离最近的缓存服务器,由缓存服务器直接相应用户的请求(全局负载技术)

十、TCP三次握手 (客服端和服务器端都需要确认各自可收发)

客服端发c起请求连接服务器端s确认,服务器端也发起连接确认客服端确认。
第一次握手:客服端发送一个请求连接,服务器端只能确认自己可以接受客服端发送的报文段
第二次握手: 服务端向客服端发送一个链接,确认客服端收到自己发送的报文段
第三次握手: 服务器端确认客服端收到了自己发送的报文段

 udp:面向无连接的,只是数据报文的搬运工(不会对数据报文进行任何拆分和拼接)

十一、从输入url到获取页面的完整过程 blog.csdn.net/samjustin1/… 1.查询NDS(域名解析),获取域名对应的IP地址 查询浏览器缓存 2.浏览器与服务器建立tcp链接(三次握手) 3.浏览器向服务器发送http请求(请求和传输数据) 4.服务器接受到这个请求后,根据路经参数,经过后端的一些处理生成html代码返回给浏览器 5.浏览器拿到完整的html页面代码开始解析和渲染,如果遇到外部的css或者js,图片一样的步骤 6.浏览器根据拿到的资源对页面进行渲染,把一个完整的页面呈现出来

十二、浏览器渲染原理及流程 DOM -> CSSOM -> render -> layout -> print 流程:解析html以及构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树 概念:1.构建DOM树: 渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM node(包括js生成的标签)生成内容树 2.构建渲染树: 解析对应的css样式文件信息(包括js生成的样式和外部的css) 3.布局渲染树:从根节点递归调用,计算每一个元素的大小,位置等。给出每个节点所在的屏幕的精准位置 4.绘制渲染树:遍历渲染树,使用UI后端层来绘制每一个节点

重绘/重排:当盒子的位置、大小以及其他属性,例如颜色、字体大小等到确定下来之后,浏览器便把这些颜色都按照各自的特性绘制一遍,将内容呈现在页面上
	触发重绘的条件:改变元素外观属性。如:colorbackground-color等
	重绘是指一个元素外观的改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观
注意:table及其内部元素需要多次计算才能确定好其在渲染树中节点的属性值,比同等元素要多发时间,要尽量避免使用table布局

重排(重构/回流/reflow): 当渲染书中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建,这就是回流。
	每个页面都需要一次回流,就是页面第一次渲染的时候

重排一定会影响重绘,但是重绘不一定会影响重排

十三、为什么css放在顶部而js写在后面 1.浏览器预先加载css后,可以不必等待HTML加载完毕就可以渲染页面了 2.其实HTML渲染并不会等到完全加载完在渲染页面,而是一边解析DOM一边渲染。 3.js写在尾部,主要是因为js主要扮演事件处理的功能,一方面很多操作是在页面渲染后才执行的。另一方面可以节省加载时间,使页面能够更加的加载,提高用户的良好体验

但是随着JS技术的发展,JS也开始承担页面渲染的工作比如我们的UI其实可以分被对待,把渲染页面的js放在前面,时间处理的js放在后面