一.HTTP与TCP的关系

  • HTTP属于应用层协议,主要解决如何包装数据;
  • 在传输层使用TCP协议,主要解决数据如何在网络中传输;
  • 在网络层使用IP协议,主要解决网络路由和寻址问题;
  • HTTP把TCP分割好的各种数据包封装到IP包里面传送给接收方。

二.短连接、长连接、websocket、postmessage作用

1.短连接:(占用较多内存和带宽)

在HTTP/1.0中,默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就建立一次连接,但服务器向发送响应数据后,将关闭TCP,中断连接。WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源;并发量大,但每个用户无需频繁操作情况下,使用短连接更好。

2.长连接:(省时间,少带宽)。

但从 HTTP/1.1起,默认使用长连接。会在响应头有加入这行代码: Connection:keep-alive;TCP连接在发送后将仍然保持打开状态,浏览器可以继续通过相同的连接发送请求,即把多个HTTP请求合并为一个。也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是请记住 Request = Response, 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

3.WebSocket:(无需循环等待(长轮询),CPU和内存资源不以客户端数量衡量,而是以客户端事件数衡量。)

WebSocket是HTML5出的协议,IE10以上浏览器支持,跟HTTP协议没有关系。只是借用了HTTP的协议来完成一部分握手。HTTP是不支持持久连接的(长连接,循环连接的不算),Websocket是一个持久化的协议;

4.PostMessage:可以安全地实现跨源通信IE8以上支持。主窗口通过postMessageAPI向异域的窗口发送数据,在异域的页面脚本中始终监听message事件,当获取主窗口数据时处理数据或者以同样的方式返回数据从而实现跨窗口的异域通讯。

三.Websocket握手过程(参考:https://www.cnblogs.com/oshyn/p/3574497.html

Websocket协议定义为ws和wss协议,分别为普通请求和基于SSL的安全传输,占用端口与http协议系统,ws为80端口,wss为443端口。

ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]

其中port是可选项,query前接“?”。

1.当建立一个Websocket连接时,连接状态是CONNECTING,客户端通过HTTP请求与WebSocket服务端协商升级协议,需要提供host、port、resource-name和一个是否是安全连接的标记,也就是一个WebSocket URI,采用的是标准的HTTP报文格式,且只支持GET方法。

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

这个升级的HTTP请求头中的字段顺序是可以随便的。与普通HTTP请求相比多了一些字段。

  • Sec-WebSocket-Protocol:字段表示客户端可以接受的子协议类型,也就是在Websocket协议上的应用层协议类型。上面可以看到客户端支持chat和superchat两个应用层协议,当服务器接受到这个字段后要从中选出一个协议返回给客户端。
  • Upgrade:告诉服务器这个HTTP连接是升级的Websocket连接。
  • Connection:告知服务器当前请求连接是升级的。
  • Origin:该字段是用来防止客户端浏览器使用脚本进行未授权的跨源攻击,这个字段在WebSocket协议中非常重要。服务器要根据这个字段判断是否接受客户端的Socket连接。可以返回一个HTTP错误状态码来拒绝连接。
  • Sec-WebSocket-Key:为了表示服务器同意和客户端进行Socket连接,服务器端需要使用客户端发送的这个Key进行校验,然后返回一个校验过的字符串给客户端,客户端验证通过后才能正式建立Socket连接。服务器验证方法是:首先进行 Key + 全局唯一标示符(GUID)“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”连接起来,然后将连接起来的字符串使用SHA-1哈希加密,再进行base64加密,将得到的字符串返回给客户端作为握手依据。其中GUID是一个对于不识别WebSocket的网络端点不可能使用的字符串。

发送请求的要求(排查错误的方法/连接失败的原因):

  • 请求的WebSocket URI必须要是定义的有效的URI。
  • 如果客户端已经有一个WebSocket连接到远程服务器端,不论是否是同一个服务器,客户端必须要等待上一个连接关闭后才能发送新的连接请求,也就是同一客户端一次只能存在一个WebSocket连接。如果想同一个服务器有多个连接,客户端必须要串行化进行。如果客户端检测到多个到不同服务器的连接,应该限制一个最大连接数,在web浏览器中应该设定最多可以打开的标签页的数目。这样可以防止到远程服务器的DDOS攻击,但这是对到多个服务器的连接,如果是到同一个服务器连接,并没有数目限制。
  • 如果使用了代理服务器,那么客户端建立连接的时候需要告知代理服务器向目标服务器打开TCP连接。
  • 如果连接没有打开,一定是某一方出现错误,此时客户端必须要关闭再次连接的尝试。
  • 连接建立后,握手必须要是一个有效的HTTP请求
  • 请求的方式必须是GET,HTTP协议的版本至少是1.1
  • Upgrade字段必须包含而且必须是"websocket",Connection字段必须内容必须是“Upgrade”
  • Sec-Websocket-Version必须,而且必须是13

2.服务器返回响应头,客户端验证通过后将建立连接,此时状态为OPEN。

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

Sec-WebSocket-Accept是根据客户端请求首部的Sec-WebSocket-Key计算出来的:

计算公式为:

  • Sec-WebSocket-Key258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接。
  • 通过SHA1计算出摘要,并转成base64字符串。

3.判断服务器返回的响应头是否同意握手的依据:

  • 首行返回的是HTTP/1.1协议版本和状态码101,表示变换协议(Switching Protocol)
  • Upgrade 和 Connection:这两个字段是服务器返回的告知客户端同意使用升级并使用websocket协议,用来完善HTTP升级响应
  • Sec-WebSocket-Accept:服务器端将加密处理后的握手Key通过这个字段返回给客户端表示服务器同意握手建立连接。
  • Sec-Websocket-Procotol:服务器选择的一个应用层协议。

浏览器解析响应头字段,如果Sec-WebSocket-Accept字段的信息符合要求就会建立连接,同时就可以发送WebSocket的数据帧了。如果该字段不符合要求或者为空或者HTTP状态码不为101,就不会建立连接。

服务器端响应步骤:

  • 解析握手请求头:获取握手依据Key并进行处理,检测HTTP的GET请求和版本是否准确,Host字段是否有权限,Upgrade字段中websocket是一个与大小写无关的ASCII字符串,Connection字段是一个大小写无关的"Upgrade"ASCII字符串,Websocket协议版本必须为13,其他的关于Origin、Protocol和Extensions可选。
  • 发送握手响应头:检测是否是wss协议连接,如果是就是用TLS握手连接,否则就是普通连接。服务器可以添加额外的验证信息到客户端进行验证。当进行一系列验证之后,服务器必须返回一个有效的HTTP响应头。响应头中每一行一个字段,结束必须为“\r\n”,使用的ABNF语法。

除了上述必要头字段之外,其他的HTTP协议定义的字段都可以使用,如Set-Cookie等。

同样类似AJAX的是,WebSocket对象也有一个readyState属性,用来表示对象实例当前所处的链接状态,有四个值:

  • 0:表示正在连接中(CONNECTING);
  • 1:表示连接成功,可以通信(OPEN);
  • 2:表示连接正在关闭(CLOSING);
  • 3:表示连接已经关闭或打开连接失败(CLOSED);

四.PostMessage(跨源通信)

以上这些跨域技术都只适用于客户端请求异域服务端资源的情景。而除此之外,有时候我们还需要在异域的两个客户端之间共享数据,例如页面与内嵌iframe窗口通讯,页面与新打开异域页面通讯。

任何域都可以通过postMessage发送跨域信息,因此只要有消息通过postMessage发送过来,脚本都会接收并进行处理。如何鉴别发送至页面的信息呢?答案是通过 message事件监听函数的事件对象,我们称它为event,该对象有三个属性:

  • data:值为其他window传递过来的对象;
  • origin:值为消息发送方窗口的域名;
  • source:值为对发送消息的窗口对象的引用;

很显然的,我们应该着重检测event对象的origin属性,建立一个白名单对origin属性进行检测通常是一个明智的做法。

-------------------------------<本节完>------------------------------------------

前端面试题必考(四)- HTTP短连接,长连接(keep-alive),websocket,postmessage相关推荐

  1. 每日三道前端面试题--vue 第四弹

    每日三道前端面试题--vue 第四弹 什么是vue的计算属性? 官方定义: 计算属性和侦听属性有什么区别?怎样选择? 两者之间的对比 两者之间的区别 两者之间怎样选择 总结 简述axios的安装和引入 ...

  2. 整理的最新的前端面试题必问集锦 (持续更新)

    前端面试必问 一.HTML+CSS 1.HTML 001.标签上title属性与alt属性的区别是什么? title: 仔显示图片的时候,鼠标以上可以显示一些信息,一般为建议.提示类型 alt : 当 ...

  3. 前端面试题综合(四)

    Major06面试题综合 第二周 1.说说你对Event Loop的理解? 1.Event Loop是JavaScript中的一种机制,用于处理异步事件和回调函数,它是JavaScript运行时环境的 ...

  4. 前端面试题汇总(四)

    BAT及各大互联网公司2014前端笔试面试题–Html,Css篇 注:本文转载,可移步原文评论. 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者 ...

  5. 前端面试题【131道】

    前端面试题 1.vue2和vue3的主要区别 3.Apply/call/bind的原理是什么? 4.说说你对原型和原型链的理解? 5.说说你对ES6中Generator的理解 6.说说你对Event ...

  6. 一份来自于全球的前端面试题清单,看看老外喜欢考哪些题(部分有答案)

    方括号中的蓝色标题是题目的出处,有些题目在原址内包含答案.搜集的大部分外国前端面试题没有做翻译,单词并不难,大家应该看得懂.题目旁边的方括号内, 简单记录了与此题相关的知识点.总共大概一千多道,包含国 ...

  7. 金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)上

    引言 元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班.年底冲冲冲外,还有着对于明年的迷茫和期待!2019年有多少苦涩心酸,2020年就有更多幸福美好,加油,奥利给!怀着一颗积极向上 ...

  8. 金三银四求职季,前端面试题小梳理(HTML、CSS、JS)

    好久没写学习记录,最近太多事,又到一年求职季,都说金三银四求职季,自己也做一下最近学习的一些前端面试题梳理,还是个小白,写的不对请指正,不胜感激. HTML篇 html语义化 用语义化的代码标签书写, ...

  9. 金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)下

    引言 元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班.年底冲冲冲外,还有着对于明年的迷茫和期待!2019年有多少苦涩心酸,2020年就有更多幸福美好,加油,奥利给!怀着一颗积极向上 ...

最新文章

  1. [数据结构] 散列表(哈希表)
  2. Windows破解逆向-CrackMe_1实例(使用OpenProcess修改内存中的值)
  3. 洛谷——P1478 陶陶摘苹果(升级版)
  4. Queue 输出数据
  5. paip.提升性能--多核cpu中的java/.net/php/c++编程
  6. Java敏感词过滤 工具类
  7. Python+Selenium爬虫实现:草料二维码微信群活码自动更新,提升社群运营效率
  8. 文件服务器挂在网上,(6)NAS简述 - 服务器 【已迁移到IXPUB】 - ITPUB论坛-专业的IT技术社区...
  9. 磁导航组成与基本原理
  10. led同步回显到计算机屏幕,手把手教您如何将笔记本电脑的画面投屏到LED大屏幕上显示,音视频同步传输...
  11. 【小程序】报getUserProfile:fail can only be invoked by user TAP gesture.
  12. VulnHub Billu_b0x
  13. jav学习日记:多线程(一)
  14. 《python 程序设计》读书笔记
  15. 禁用服务器网络协议怎么设置,如何在Windows操作系统中启用和禁用DHCP?
  16. 2440裸奔界面控制MCX314
  17. 哪位能推荐一下广州比较好的IT公司啊,不尽感激
  18. vb6DataGrid
  19. 高精度阶乘C语言实现
  20. Eclipse下JUnit报错“The input type of the launch configuration does not exist ”

热门文章

  1. 从零开始构建根文件系统
  2. 网银显示服务器无效应,网银U盾报错“系统智能卡服务未启动”的解决方案
  3. 【抓包工具】配置:Fiddler 设置 APP 抓包成功,微信小程序却无网络问题解决
  4. python获取字符串首字母_Python中用startswith()函数判断字符串开头的教程
  5. 海滩在室内?虚拟现实创建的治愈世界
  6. php 做支付宝接口 防钓鱼时间戳,ThinkPHP实现支付宝接口功能
  7. 第一章计算机系统基础知识,计算机系统基础知识 第一章(未完待续)
  8. 家长接到声称自己孩子出车祸需要汇款的电话后,首先要做的是()。
  9. Newtonsoft.Json取json字符串中的值得用法 这里是取的时候
  10. 数据库实验一 在SQL Server 中创建数据库