【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...

原文:前端面试“http全过程”将所有HTTP相关知识抛出来了...

来一篇串通,一个http全过程的问题,把所有HTTP相关知识点都带过一遍

http全过程

输入域名(url)-->DNS映射为IP-->TCP三次握手-->HTTP请求-->HTTP响应-->(浏览器跟踪重定向地址)-->服务器处理请求-->服务器返回一个html响应-->(视情况决定释放TCP连接)-->客户端解析HTML-->获取嵌入在HTML中的对象重新发起http请求

输入域名(url)

在域名这里有很多可以聊的:

域名级数判别

域名服务器及域名 这里有详细解释,即“计算机网络技术”的第九章Domain Name System

一个点分隔一级(域名由分量组成,一级为一个分量),通俗易懂如下:

...三级域名.二级域名.顶级域名
WWW.baidu.com  com为顶级域名(通常依据组织和地理分为两类),baidu为二级域名,WWW网站
www.pic.baidu.com pic为三级域名
所谓降域,如pic.baidu.com/a.txt  baidu.com/b.txt中a和b在不同的域下面,都降域为baidu.com..如下详细解释

同源策略

同源需满足的条件:

  • 协议相同
  • 域名相同:a.b.c.com a.b.d.com域名相同吗
  • 端口相同

非同源受限制的行为:

  • cookie localStorage indexDB无法获取
  • DOM无法获得
  • ajax请求不能发送

    跨域方法:

双向跨域

1.降域(二级和以上有共同部分)

所谓降域就是寻找到最后面的域名相同的部分留下
a.b.c.com
d.b.c.com
降域后统统改为b.c.com或者c.com
  • 存在的问题:

    • 安全性,当一个站点被攻击,相同域名的站点也会被攻击
    • 重复性,所有需要跨域的都要修改document.domain=""
    • ajax不受降域影响,还是需要iframe在一个页面引入另一页面的形式
    • 不可更改性,一旦降域就无法回去

2.location.hash(FIM---fragment itentitier messaging)

a向b传送数据
    baidu.com/a.html中的iframe的src="google.com/b.html#paco",b.html监听到   url发生变化触发相应操作
b向a传送数据
    google.com/b.html中隐藏一个iframe,设置src="baidu.com/proxy.html#data" data为要传输的数据,proxy.html是和a.html同域名下的,是a b之间的代理,负责监听utl变化就修改a的url,a监听到url变化了就做出相应操作

b.html:

try {
    parent.location.hash = ‘data‘;
} catch (e) {
    // ie、chrome的安全机制无法修改parent.location.hash,
    var ifrproxy = document.createElement(‘iframe‘);
    ifrproxy.style.display = ‘none‘;
    ifrproxy.src = "http://www.baidu.com/proxy.html#data";
    document.body.appendChild(ifrproxy);
}

proxy.html:

//因为parent.parent(即baidu.com/a.html)和baidu.com/proxy.html属于同一个域,所以可以改变其location.hash的值
parent.parent.location.hash = self.location.hash.substring(1);
问题:数据暴露在URL中,数据大小格式受限

3.HTML5的postMessage方法

a向b发送数据

baidu.com/a.html

window.onload = function() {
    var ifr = document.getElementById(‘ifr‘);
    var targetOrigin = "http://www.google.com";
    ifr.contentWindow.postMessage(‘hello world!‘, targetOrigin);
};

google.com/b.html

var onmessage = function (event) {
  var data = event.data;//消息
  var origin = event.origin;//消息来源地址
  var source = event.source;//源Window对象
  if(origin=="http://www.baidu.com"){
console.log(data);//hello world!
  }
};
if (typeof window.addEventListener != ‘undefined‘) {
  window.addEventListener(‘message‘, onmessage, false);
} else if (typeof window.attachEvent != ‘undefined‘) {
  //for ie
  window.attachEvent(‘onmessage‘, onmessage);
}
同理可以b向a postMessage

单向跨域

1.jsonp

先看两种用法
<script>
    function foo(data){
        console.log(data);
    }
</script>
<script type="http://www.google.com/getUsers.js?callback=foo"></script>
回调函数
<script src="http://www.google.com/getUsers.php?flag=do&time=1"></script>
参数
问题:只支持get请求

2.服务器代理

服务器没有同源策略,在数据提供方没有jsonp,window.name协议的支持下,使用服务器代理。
在baidu.com下配置一个代理proxy即baidu.com/proxy/将ajax绑定到代理下发送http请求,此时http请求是在服务端进行的,无同源限制

3.CORS

var url = ‘http://api.alice.com/cors‘;
var xhr = createCORSRequest(‘GET‘, url);
xhr.send();
//非简单请求
var url = ‘http://api.alice.com/cors‘;
var xhr = createCORSRequest(‘PUT‘, url);
xhr.setRequestHeader(
    ‘X-Custom-Header‘, ‘value‘);
xhr.send();
另外:对于CORS的支持需要服务器和客户端之间的协调

4.window.name

5.webSocket

需要服务器的支持,源在白名单

6.Access-Controll-Allow-Origin

http和https协议有什么区别,重点解释https

http+加密+认证+完整性保护=https
  • http:应用层的无状态,超文本传输协议。端口为80
  • HTTPS:只是http通信接口部分用SSL和TLS协议替代。http直接和TCP通信,而HTTPS使用SSL所以是先和SSL通信,再由SSL和TCP通信。端口为443

cookie sessionStorage localStorage有什么不同

  • cookie存储在客户端,可以发送给服务器,数据大小限制为4K
  • sessionStorage,localStorage存储在本地,不可以发送给服务器,数据大小为5M
  • localStorage只能手动清除数据
  • sessionStorage关闭会话窗,数据就被清除了

HTML5本地存储分为

  • webStorage(localStorage,sessionStorage)
  • indexDB

DNS解析域名为IP

  • 浏览器缓存中找
  • 系统缓存中找
  • 路由器缓存中找
  • ISP DNS缓存中找

TCP三次握手

  • client----->server:SYN(发起一个TCP连接,同步报文)
  • server----->client:SYN+ACK(应答报文,表示已创建连接)
  • client----->server:ACK(应答报文,表示收到已连接)
四次挥手:
    由客户端发起的关闭连接
        * client----->server:FIN(请求关闭连接)
        * server----->client:ACK(收到了连接,但不会立即关闭,等到报文都发送完再回复一个FIN)
        * server----->client:FIN
        * client----->server:ACK(收到关闭)

    由服务端发起的关闭连接
        * 当http设置了keepalive定时关闭,服务端会在结束数据传送后关闭TCP连接

http请求

  • 请求行
  • 请求头
  • 空行
  • 请求包体(只有POST请求有包体)

get/post区别

  • 请求参数:get参数附在URL后面?隔开,POST参数放在包体中
  • 大小限制:GET限制为2048字符,post无限制
  • 安全问题:GET参数暴露在URL中,不如POST安全
  • 浏览器历史记录:GET可以记录,POST无记录
  • 缓存:GET可被缓存,post无
  • 书签:GET可被收藏为书签,post不可
  • 数据类型:GET只能ASCII码,post无限制

http响应

  • 状态行
  • 响应头
  • 响应包体

http状态码

1XX:表示可续发请求

2XX:表示成功

* 202成功
* 204成功 不返回实体主体
* 206成功 执行了一个范围请求

3XX:表示重定向

* 301永久重定向,增加SEO排名
* 302临时重定向 禁止POST变为GET
* 303另外一个URI
* 304判断是否要更新缓存 请求头部携带if-modified-since自从上次更新距这次多久
* 307临时重定向

4XX:表示客户端错误

* 400客户端语法错误
* 401请求未经授权
* 403服务器拒绝服务
* 404请求资源不存在

5XX:服务端错误

* 500不可预期的错误
* 503此时不能提供服务 稍后恢复正常

释放TCP连接

  • header中的connecton:close

    服务器主动关闭TCP连接,客户端被动关闭连接
  • header中的connecton:keepalive
    连接保持一段时间,可以连续发送http请求

客户端解析HTML

onload ready区别:

  • ready表示文档加载完毕,不包括图片
  • onload表示都加载完毕
时间: 2024-10-13 00:10:16

【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...的相关文章

前端面试知识点集锦

个人总结的比较全面的前端面试知识点.主要是一些个人认为面试时容易考到以及平时需要注意的一些知识点. 本人只是对这些知识进行了一个大概的总结,还有一部分技术还没开始涉及,后期会持续添加.如果需要进行深入了解可以根据知识点查询相关的技术文章. 本文涵盖了以下各个方面的知识: HTML, CSS, JS基础知识 网站性能优化知识 前端项目自动化构建相关知识 算法相关知识 网络与HTTP协议相关知识 前端的安全相关知识 插件编写相关知识 JS模块化编程相关知识 Github Repo:https://g

问得最多的十个JavaScript前端面试问题

我知道有很多人不同意这种类型的面试.其实不管你喜不喜欢,你都得接受.尤其当你是自学的,而且要申请第一份工作时. 我估计很多有人其它方法来证明他自己,像Github/ 项目地址可能是非常理想的证明方法,但也别全都指望这些. 好消息是有一些很难的问题,在有限的时间里我没答上来(比如说Event Loop和杨辉三角),一些其它面试侯选人也承认他们也没答上来,这会让讨论变得轻松很多. 坏消息是有些面试之后就没有任何反馈了.有三家公司再也没联系过.这点击打击自信,而且没有受到尊重.然后你可能会有心理斗争,

2016.10.19 小米前端面试 vs 2016.10.22 华为web面试

这次面试还是很值得记录一下的~长了很多姿势. 一共三面,面试官都是MIUI的浏览器部门,感觉面试官都很厉害,知识点问的很细很深入. 一面面试官是个可爱的小姑娘,主要考察的就是常见的前端面试题,很基础,但是会在其上进行拓展和深入.就我记得的一些题做个总结: 1. 说一下CSS的盒模型?(这简直是我参加过的几乎所有前端面试岗必问的一道题目--不管是比较水的国企还是问基础的互联网... 想一想似乎只有只问项目不谈基础的京东没有问吧) 这里是答案 2. 常用的跨域方法:(之前小米一个面试官电话面试时候也

百度Web前端面试经历

今天面了百度的前端实习职位.一面.时间大概是50分钟.面试官是位很帅气的小伙子,非常友好的一个人.进门的时候他让我等一会,我瞄了一眼他的电脑屏幕,发现他在coding…… 9点50开始的面试. 面试官:自我介绍一下. 我:blablabla. 面试官:javascript的类型转换(比如"2"*1, "a"*1). 我:javascript会调用valueOf来转换为一个基本数据类型,在这种情况下,如果javascript不能通过valueOf转成一个number,

web前端面试经历分享

十天前,我还在纠结这个暑假到底是呆在实验室研究技术好还是找一份实习见识世面好,而现在我已经接到offer准备工作了.这几天真是累得够呛,一方面需要拼命准备期末考试,另一方面,需要往公司里面跑接受面试.欣慰的是,我不仅顺利通过了公司的面试,还认识了好几个厉害的师兄,自己的人生规划也稍有改变. 开始的纠结是有原因的,主要是考虑到了一下几个方面: 第一,作为一个大二的学生有必要这么着急跑出去找实习么? 第二,去找实习主要目的应该是赚钱还是学习技术? 第三,难得有那么两个月的时间,就这样去工作了会不会浪

web前端面试总结

本文由我收集总结了一些前端面试题,初学者阅后也要用心钻研其中的原理,重要知识需要系统学习.透彻学习,形成自己的知识链.万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的!也是不可能的! 前端还是一个年轻的行业,所以关注各种前端技术,跟上快速变化的节奏,也是身为一个前端程序员必备的技能之一. 前端开发知识点: HTML&CSS: 对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级. HTML5.CSS3.Flexbox JavaScript: 数据类

前端面试中的常见的算法问题

虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路.下面罗列在前端面试中经常撞见的几个问题吧. Q1 判断一个单词是否是回文? 回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环.比如 mamam redivider . 很多人拿到这样的题目非常容易

百度web前端面试2015.10.18

邮件里通知的周日下午两点参加百度校招面试,我13:10分就到了,前台先让我拿了个面试资格单(上面是我的信息),然后在web前端面试入口排队,面试在百度食堂举行的,等了大概1个小时,放我去面试.都是一对一面试,人很多. 下面是面试过程:没让我自我介绍,有的会让先自我介绍,简单看了下我的简历开始问我是不是自学的,(计算机专业不开设这个专业,都是自学加项目经验)为什么选择前端开发,你怎么看前端开发这个岗位的.说那这样我就从简单到难的问你,由浅入深就知道你的水平了,面试官都很年轻,人都不错. 1:说一下

Web前端面试笔试题总结

最近一段时间要毕业了,忙着找工作,见过不少笔试面试题,自己总结了一些加上网上找的一些整合了一下.答案暂时都东拼西凑出来了,但是还是先不发出来,一方面是答案并不是唯一的并且自己的答案不能保证对,另一方面希望看到本文的伙伴能自己去找答案,毕竟,技术只有自己真正理解了才是自己的东西,共勉. 小白第一次发文,恭请指点. Web前端面试笔试题 Html+css 1.对WEB标准以及w3c的理解与认识. 2.Xhtml和html有什么区别. 3.css的引入方式有哪些?link和@import的区别是? 4