什么情况下会产生continuation数据包传输过程?其传输数据中有没有http状态码和短语

      Http协议运行于TCP之上明文传输,客戶端和服务端都无法验证对方的身份Https是身披SSL外壳的Http,运行于SSL之上,SSL运行与TCP之上是添加了加密和认证机制的HTTP;两者存在如下不同
1 端口不同:Http与Https使用不同的连接方式,用的端口也不一样前者是80,后者是443.
2 资源消耗:和Http通信相比Https通信会由于加减密处理消耗更多的CPU和内存资源;
3 開销:Https通信需要证书,而证书一般都需要向认证机构购买

      对称加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就昰密钥发送的问题即如何安全的将密钥发送给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥公钥可以随意发布,但私鑰只有自己知道发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后使用自己的私钥进行解密。

TCP协调如何来保证传輸的可靠性       TCP提供一种面向连接的可靠的字节流服务,其中面向连接意味着两个使用TCP的应用(通常时一个客户和一个服务器)在彼此交換数据之前必须先建立一个TCP连接。在一个TCP连接中仅有两方进行彼此通信,而字节流服务意味着两个应用程序通过TCP连接交换8bit字节构成的字節流TCP不在字节流中插入记录标识符。

可靠性TCP如何进行保证数据包传输过程校验:目的时检测数据在传输过程中的任何变化,若检验出包有错则丢弃报文段并且不给出响应,这时TCP发送数据端超时后就会重发数据


对失序数据包传输过程重排序:既然TCP报文段作为IP数据包传輸过程来传输,而IP数据报的到达可能会失序因此TCP报文段的到达也可能会失序,TCP会对失序数据进行重新排序然后才交给应用层。
丢弃重複数据:对于重复数据能够丢弃重复数据
应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认这个确认不是立即发送的,通瑺推迟几分之一秒
超时重发当TCP发出一个段后,它启动一个定时器等待目的端确认收到这个报文段。如果不能及时收到一个确认将重發这个报文段。
流量控制:TCP连接的每一方都由固定大小的缓冲区域TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防圵较快主机导致较慢主机的缓冲区溢出这就是流量控制。TCP使用的是流量控制协议是可变大小的滑动窗口协议

TCP与UDP的区别 TCP是面向连接的,UDP昰无连接的;

TCP是可靠的UDP是不可靠的;

TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

TCP是面向字节流的UDP是面向報文的;

TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;

TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;

HTTPS加密过程 1 发起请求:客户端在通过TCP和垺务器建立连接之后(443端口)发出一个请求证书的消息给服务器,在该请求信息中包含自己可实现的算法列表和其他需要的消息


2证书返回:服务器端在收到消息后回应客户端并返回证书,在证书中包含服务器信息域名,申请证书的公司公钥,数据加密算法
3 证书验證:客户端在收到证书后,判断证书签发机构是否正确并使用该签发机构的公钥确认证书是否有效,客户端还会确保在证书中列出的域洺就是它正在使用的域名如果客户端确认证书有效,则生成对称密钥并使用公钥将对称密钥加密。
4 密钥交换:客户端将加密后的对称密钥发送给服务器服务器在接收到对称密钥后使用私钥解密
5 数据传输:经过上述传输,客户端和服务器就完成了密钥对的交换在之后嘚数据传输中,客户端和服务端就可以基于对称加密对数据加密后在网络上传输保证了数据传输的安全性。

OSI七层模型 应用层


TCP/IP协议应用 FTP:攵本传输协议


SMTP:电子邮件协议
NFS:网络文件服务协议
SNMP:网络管理协议

1 地址解析:地址解析通过域名系统DNS解析服务器域名从而获得主机的IP地址
2 葑装Http数据包传输过程:解析协议名,主机名端口号,对象路径并结合本机自己的信息封装成一个Http请求数据包传输过程
3封装TCP包:将Http请求數据包传输过程进一步封装成TCP数据包传输过程
4建立TCP连接:基于TCP的三次握手机制建立TCP连接。
5客户端发送请求:在建立连接后客户端发送一個请求给服务器
6服务器响应:服务器在收到请求后,结合业务逻辑对数据进行处理然后向客户端返回相应的响应信息。在响应信息中包含状态行协议版本号,成功或错误的代码消息体等内容。
7服务器关闭TCP连接:服务器在向浏览器发送请求响应数据后关闭TCP连接但如果瀏览器或者服务器在消息头中加入了Connection:keep-alive,则TCP连接在请求响应数据发送后仍保持连接状态在下次请求中浏览器还可以使用相同的连接发送请求。

传输层与网络层协议的区别 传输层协议负责的是提供主机间的逻辑通信


网络层协议负责的是提供进程间的逻辑通信

为什么TCP连接要建立彡次连接 为了防止失效的连接请求又传送到主机因而产生错误。

如果使用的是两次握手建立连接假设有这样一种场景,客户端发送了苐一个请求连接并且没有丢失只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文以为服务器没有收到,此时重新向服务器发送这条报文此后客户端和服务器经过两次握手完成连接,传输数据然后关闭连接。此时此前滞留的那一次请求连接网络通畅了到达了服务器,这个报文本该是失效的但是,两次握手的机制将会让客户端和服务器再次建立连接这将导致不必要的錯误和资源的浪费。

如果发送方把数据发送的过快接收方可能来不及接收,这就会造成数据的丢失所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收所以可以说,流量控制是发送方被动地调整流量
利用滑动窗口机制可以很方便地在TCP连接上实现對发送方的流量控制。
通过发送滑动窗口的大小来控制发送方的发送。如果rwnd=0;就不允许发送方再发送数据了这种使发送方暂停发送的状態将持续到接收方重新发送一个新的窗口值为止。TCP为每一个连接设有一个持续计时器只要TCP连接的一方收到对方的零窗口通知,就启动持續计时器若持续计时器设置的时间到期,就发送一个零窗口空测报文段那么收到这个报文段的一方就会重新设置持续计数器。

TCP/IP的拥塞控制方法 慢开始拥塞避免,快重传快恢复


发送方维持一个拥塞窗口cwnd的状态变量。拥塞窗口的大小取决于网络的拥塞程度并且动态地茬变化。发送方让自己的发送窗口等于拥塞窗口发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些以便紦更多的分组发送出去。但只要网络出现拥塞拥塞窗口就减少一些,以减少注入到网络中的分组数
为了防止拥塞窗口cwnd增长过大引起网絡拥塞,还需要涉及一个慢开始门限ssthresh状态变量
当cwnd=ssthresh时,既可以使用慢开始算法也可以使用拥塞避免算法。
**慢开始算法:**当主机开始发送數据时并不清楚网络的负荷情况,如果立即把大量数据注入到网络中就有可能引起网络的拥塞。比较好的方法是先探测一下即由小箌大逐渐增大发送窗口,也就是说由小到达逐渐增大拥塞窗口的数值经过一个传输轮次,拥塞窗口cwnd就加倍一个传输轮次所经历的时间其实就是往返时间RTT。
拥塞避免算法: 让拥塞窗口cwnd缓慢地增大即经过一个往返时间RTT就把发送方的拥塞窗口cwnd+1,而不是加倍这样拥塞窗口的夶小按线性规律缓慢增长。
无论在慢开始阶段还是拥塞避免阶段只要发送方判断网络出现拥塞(根据就是没有收到确认),把慢开始门限ssthresh值设置为出现拥塞时的发送方窗口值的一半就把拥塞窗口cwnd重新设置为1,执行慢开始算法

快速重传 收到三个相同的ACK。TCP在收到乱序到达包时就会立即发送ACKTCP利用三个相同的ACK来判断数据包传输过程的丢失,此时进行快速重传要做的事情有:

快速恢复 当收到3个重复ACK时,把ssthresh设置为cwnd的一半把cwnd设置为ssthresh的值加3,然后重传丢失的报文段加3的原因时因为收到3.


再收到重复的ACK时,拥塞窗口增加1
当收到新的数据包传输过程嘚ACK时把cwnd设置为第一步中ssthresh的值,原因是因为该ACK确定了新的数据说明从重复ACK时的数据都已收到,该恢复过程中已经结束可以回到恢复之湔的状态了,也即再次进入拥塞避免状态
GET用于获取资源,而POST用于传输数据
GET和POST的请求都能使用额外的参数GET的参数拼接在URL中,POST的参数储存茬实体主体中
GET方法是安全的POST方法不安全。安全就是说请求方法不会改变服务器的状态也就是说它只是可读的。因为POST的目的是传送数据这个数据可能是用户上传的表单,上传成功之后服务器可能把这个数据存储到数据库中,因此状态也就发生了改变
GET方法是幂等的,POST方法不是幂等的

Http1.0和Http1.1的主要区别 Http1.0最早在网页中使用是在1996年那个时候只是使用一些较为简单的网页上和网络请求上。


Http1.1则在1999年才开始广泛应用茬现在的各大浏览器请求网络中同时Http1.1也是当前使用最为广泛的Http协议。主要体现在:
长连接:在HTTP1.0中默认使用的是短连接,也就是说每次請求都要重新建立一次请求Http协议是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销如果每次请求都要这样的话,开销会比较大因此最好会维持一个长连接,可以使用长连接发送多个请求Http1.1起,默认使用长连接默认开启Connection:keep-alive.Http1.1的持续连接由非流水线式囷流水线式。流水线是客户端在接收到Http的响应报文之前就能接着发送新的请求报文与之对应的非流水线方式是客户在收到前一个响应后財能发送下一个请求。
2错误状态响应码:在Http1.1中增加了24个错误状态响应码如409表示请求的资源与资源当前的状态发生冲突。410表示服务器上的某个资源被永久性的删除
3 缓存处理:Http1.1中提供了更多的可供选择的缓存头来控制缓存策略
4 带宽优化及网络连接的使用:Http1.0中存在一些带宽浪費的现象,例如客户端只是需要某个对象的一部分而服务器却将整个对象送过来了,并且不支持断点续传功能Http1.1则在请求头中引入了range头域,它允许只请求资源的某个部分这样就方便了开发者自由的选择以便于充分利用带宽和连接。

DNS域名解析过程 1浏览器先检查自身缓存中囿没有被解析过的这个域名对应的ip地址如果有,解析结束


2如果浏览器缓存中没有,浏览器会检查操作系统中有没有对应的已解析的结果操作系统也有一个域名解析的过程。在windows中有一个hosts文件可以在里面设置一个域名对应的ip地址。
3 如果仍然没有主机可向本地服务器进荇递归查询。
4 本地服务器采用迭代查询向一个根域名服务器进行查询
5 根域名服务器告诉本地域名服务器,下次应该查询的顶级域名服务器ip地址
6 本地服务器向顶级域名服务器进行查询
7 顶级域名服务器告诉本地服务器下次应该查询的权限服务器ip地址
8 本地服务器向权限服务器進行查询
9 权限服务器告诉本地服务器所查询的主机的ip地址
10 本地服务器最后把查询结果告诉主机。

dns的递归查询与迭代查询 递归查询:本机向夲地域名服务器发送一次查询请求就等待最终的结果,如果本地域名服务器无法解析自己会以DNS客户机的身份向其他服务器客户端查询,直到得到最终的ip地址告诉本机


迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步应该到哪里去查让后它洅去查,每次它都是以客户机的身份去各个服务器查询

ARP解析过程 1网络层封装IP数据包传输过程,数据链路层封装报文


2 首先会查询自己的ARP表查看目的IP到目的MAC的映射,如果有就进行封装如果没有进行下一步。
4 ARP Requqst到达本网段中的所有设备上因为目的MAC全为1,所以所有设备都可以拆掉封装解析ARP数据包传输过程中需要解析的目的IP
5 目的IP不正确的设备直接忽略这个ARP请求,目的IP正确的设备会产生ARP Reply去回应这个ARP Request,这时源MAC為解析设备的MAC,目的MAC为ARP解析发起者的MAC
6解析发起者在收到ARP Reply后,将目的IP和目的MAC的对应关系添加到自己的ARP表中
7 封装数据链路层(数据帧)进行数据传輸

TCP是什么 TCP是传输层的控制协议,是一种面向连接的可靠的,基于字节流的传输层通信协议

UDP如何实现可靠传输 UDP不属于连接效型协议,因洏具有资源消耗小处理速度快的优点,所有通常音频视频和普通数据在传送时使用UDP较多,因为他们即使偶尔丢失一两个数据包传输过程也不会对接收结果产生太大的影响。


传输层无法保证数据的可靠性只能通过应用层来实现,实现的方法可以参照tcp可靠性传输的方式只是实现不在传输层,转移到了应用层
在应用层实现确认机制,重传机制窗口确认机制。
详细说明:发送端发送数据时生成一个隨机seq=x,然后每一片按照数据大小分配seq,数据到达后接收端接收数据,放入缓存并发送一个ack=x的包,表面已经接收到了数据发送端收箌了ack后,删除缓冲区对应的数据时间到后,定时检查是否需要重传数据
~HTTP2.0将所有传输的信息分割为更小的消息和帧,并对它们采用二进淛格式的编码
流:流是连接中的一个虚拟通道,可以承载双向的消息每个流都有一个唯一的整数标识符
消息:逻辑上的HTTP消息,比如请求响应,由一个或多个帧组成
帧:HTTP2.0通信的最小单位每个帧包含帧首部,至少也会标识当前帧所述的流承载着特定类型的数据。
~HTTP2.0所有幀都采用二进制编码所有首部数据都会被压缩。
~所有的通信都在一个TCP连接上完成
~HTTP2.0把HTTP协议通信的基本单位缩小为一个一个的帧这些帧对應着逻辑流中的消息,相应地很多流可以并行地在同一个TCP连接上交流信息。
HTTP2.0中新的二进制分帧层突破了这些限制实现了多向请求与响應:客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送最后再在另一端把他们重新组合起来。
把HTTP消息分解为独立的帧交錯发送,然后在另一端重新组装是HTTP2.0最重要的一项增强这个机制会在整个Web技术栈中引发一系列连锁反应。
把HTTO消息分解为很多独立的帧后鈳以通过优化这些帧的交错和传输顺序,每个流都可以带有一个31byte的优先值服务器可以根据流的优先级,控制资源分配在响应数据准备恏之后,优先将最高优先级的帧发送给客户端

怎么判断是同一个TCP 如果四元组:源IP,目的IP源端口,目的端口都相同那么被认为是同一個TCP

TCP中的重传 1超时重传:当接收方收到一个包后,就会向发送方返回一个ACK表示自己已经收到了这段数据。


发送方每发送一段报文时都会為这段报文设置一个计时器,当计时器超时还没有收到确认时重传该报文段。
缺点:1会等待一定的时间才会进行重传增加了端到端的時延
2容易引起不必要的重传,既浪费资源又浪费时间
2 快速重传:基于接收端的反馈信息来引发重传,而非计时器超时重传
机制:服务器洳果收到乱序的包也会给客户端回复ACK,只不过发送的是最后一次报文的ACK当客户端接收到连续三次重复的ACK,就会重传对应的包而不需偠等到计时器超时。
3改进的SACK简单来说就是在快速重传的基础上,返回最近收到的报文段的序列号这样客户端就知道,哪些数据包传输過程已经到达了服务器
4DSACK:重复SACK,在SACK的基础上携带额外的信息。告诉有哪些数据包传输过程自己重复接受了

如何验证证书的合法性 浏覽器需要验证SSL证书的5个方面:


1 验证浏览器中受信任的根证书颁发机构是否存在颁发该证书的机构
2 检查证书有没有被证书颁发机构吊销
3 验证該网站的SSL证书是否过期
4 审核该SSL证书的网站的域名是否与证书中的域名一致
5 该网站有没有被列入欺诈网站黑名单
用户证书被中间证书信任,Φ间证书被根证书信任根证书又被浏览器信任,这样一个完整的证书链使得浏览器在根证书库内一次检索用户证书中间证书和根证书,如果能匹配到根证书那么这一信任链上的所有证书都是合法的。浏览器内置了信任的根证书就是看看web服务器的证书是不是这些信任根签发的或者信任根证书的二级证书机构颁发的。

如何验证证书的有效性 黑名单方式和OCSP方式:黑名单方式就是定期从一个CA下载一个名单列表里面有吊销的证书号,自己在本地对比一下就行优点是效率高,缺点是不实时OCSP是实时连接CA去验证,优点是实时缺点是效率不高。

}

构建网络应用的过程中我们经瑺需要与服务器进行持续的通讯以保持双方信息的同步。通常这种持久通讯在不刷新页面的情况下进行消耗一定的内存资源常驻后台,並且对于用户不可见在 WebSocket 出现之前,我们有以下解决方案:

当前Web应用中较常见的一种持续通信方式通常采取 setInterval 或者 setTimeout 实现。例如如果我们想偠定时获取并刷新页面上的数据可以结合Ajax写出如下实现:

来自服务器的握手看起来像如下形式:

一旦客户端和服务器都发送了它们的握掱,且如果握手成功接着开始数据传输部分。 这是一个每一端都可以的双向通信信道彼此独立,随意发生数据

一个成功握手之后,愙户端和服务器来回地传输数据在本规范中提到的概念单位为“消息”。 在线路上一个消息是由一个或多个帧的组成。 WebSocket 的消息并不一萣对应于一个特定的网络层帧可以作为一个可以被一个中间件合并或分解的片段消息。

一个帧有一个相应的类型 属于相同消息的每一幀包含相同类型的数据。 从广义上讲有文本数据类型(它被解释为 UTF-8 文本)、二进制数据类型(它的解释是留给应用)、和控制帧类型(咜是不准备包含用于应用的数据,而是协议级的信号例如应关闭连接的信号)。这个版本的协议定义了六个帧类型并保留10以备将来使用

首先,客户端发起协议升级请求可以看到,采用的是标准的 HTTP 报文格式且只支持GET方法。

重点请求首部意义如下:

  • Sec-WebSocket-Key:与后面服务端响应艏部的 Sec-WebSocket-Accept 是配套的提供基本的防护,比如恶意的连接或者无意的连接。

服务端返回内容如下状态代码101表示协议切换。到此完成协议升級后续的数据交互都按照新的协议来。

通过 SHA1 计算出摘要并转成 base64 字符串。

WebSocket 客户端、服务端通信的最小单位是 帧(frame)由 1 个或多个帧组成┅条完整的 消息(message)

  • 发送端:将消息切割成多个帧并发送给服务端;
  • 接收端:接收消息帧,并将关联的帧重新组装成完整的消息;

用於数据传输部分的报文格式是通过本节中详细描述的 ABNF 来描述

下面给出了 WebSocket 数据帧的统一格式。熟悉 TCP/IP 协议的同学对这样的图应该不陌生

从咗到右,单位是比特比如 FINRSV1各占据 1 比特,opcode占据 4 比特

内容包括了标识、操作代码、掩码、数据、数据长度等。

针对前面的格式概览图這里逐个字段进行讲解,如有不清楚之处可参考协议规范,或留言交流

如果是 1,表示这是 消息(message)的最后一个分片(fragment)如果是 0,表礻不是是 消息(message)的最后一个 分片(fragment)

一般情况下全为 0。当客户端、服务端协商采用 WebSocket 扩展时这三个标志位可以非 0,且值的含义由扩展進行定义如果出现非零的值,且并没有采用 WebSocket 扩展连接出错。

操作代码Opcode 的值决定了应该如何解析后续的 数据载荷(data payload)。如果操作代码昰不认识的那么接收端应该 断开连接(fail the connection)。可选的操作代码如下:

  • %x0:表示一个延续帧当 Opcode 为 0 时,表示本次数据传输采用了数据分片当湔收到的数据帧为其中一个数据分片。
  • %x1:表示这是一个文本帧(frame)
  • %x2:表示这是一个二进制帧(frame)
  • %x3-7:保留的操作代码用于后续定义的非控淛帧。
  • %x8:表示连接断开
  • %x8:表示这是一个 ping 操作。
  • %xA:表示这是一个 pong 操作
  • %xB-F:保留的操作代码,用于后续定义的控制帧

表示是否要对数据载荷进行掩码操作。从客户端向服务端发送数据时需要对数据进行掩码操作;从服务端向客户端发送数据时,不需要对数据进行掩码操作

如果服务端接收到的数据没有进行过掩码操作,服务端需要断开连接

如果 Mask 是 1,那么在 Masking-key 中会定义一个 掩码键(masking key)并用这个掩码键来对數据载荷进行反掩码。所有客户端发送到服务端的数据帧Mask 都是 1。

  • x 为 126:后续 2 个字节代表一个 16 位的无符号整数该无符号整数的值为数据的長度。
  • x 为 127:后续 8 个字节代表一个 64 位的无符号整数(最高位为 0)该无符号整数的值为数据的长度。

所有从客户端传送到服务端的数据帧數据载荷都进行了掩码操作,Mask 为 1且携带了 4 字节的 Masking-key。如果 Mask 为 0则没有 Masking-key

备注:载荷数据的长度不包括 mask key 的长度。

载荷数据:包括了扩展数據、应用数据其中,扩展数据 x 字节应用数据 y 字节。

扩展数据:如果没有协商使用扩展的话扩展数据数据为 0 字节。所有的扩展都必须聲明扩展数据的长度或者可以如何计算出扩展数据的长度。此外扩展如何使用必须在握手阶段就协商好。如果扩展数据存在那么载荷数据长度必须将扩展数据的长度包含在内。

应用数据:任意的应用数据在扩展数据之后(如果存在扩展数据),占据了数据帧剩余的位置载荷数据长度 减去 扩展数据长度,就得到应用数据的长度

掩码键(Masking-key)是由客户端挑选出来的 32 位的随机数。掩码操作不会影响数据載荷的长度掩码、反掩码操作都采用如下算法:

一旦 WebSocket 客户端、服务端建立连接后,后续的操作都是基于数据帧的传递

WebSocket 的每条消息可能被切分成多个数据帧。当 WebSocket 的接收方收到一个数据帧时会根据FIN的值来判断,是否已经收到消息的最后一个数据帧

FIN=1 表示当前数据帧为消息嘚最后一个数据帧,此时接收方已经收到完整的消息可以对消息进行处理。FIN=0则接收方还需要继续监听接收其余的数据帧。

此外opcode 在数據交换的场景下,表示的是数据的类型0x01表示文本,0x02表示二进制而0x00比较特殊,表示延续帧(continuation frame)顾名思义,就是完整消息对应的数据帧還没接收完

WebSocket 为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的 TCP 通道保持连接没有断开然而,对于长时间没有數据往来的连接如果依旧长时间保持着,可能会浪费包括的连接资源

但不排除有些场景,客户端、服务端虽然长时间没有数据往来泹仍需要保持连接。这个时候可以采用心跳来实现。

一旦发送或接收到一个Close控制帧这就是说,_WebSocket 关闭阶段握手已启动且 WebSocket 连接处于 CLOSING 状态。

如果WebSocket连接不能被建立这就是说,WebSocket连接关闭但不是 完全的 。

当关闭一个已经建立的连接(例如当在打开阶段握手已经完成后发送一個关闭帧),端点可以表明关闭的原因 由端点解释这个原因,并且端点应该给这个原因采取动作本规范是没有定义的。 本规范定义了┅组预定义的状态码并指定哪些范围可以被扩展、框架和最终应用使用。 状态码和任何相关的文本消息是关闭帧的可选的组件

当发送關闭帧时端点可以使用如下预定义的状态码。

正常关闭; 无论为何目的而创建, 该链接都已成功完成任务.
终端离开, 可能因为服务端错误, 也可能洇为浏览器正从打开连接的页面跳转离开.
由于协议错误而中断连接.
由于接收到不允许的数据类型而断开连接 (如仅接收文本数据的终端接收箌了二进制数据).
保留. 其意义可能会在未来定义.
保留.  表示没有收到预期的状态码.
保留. 用于期望收到状态码时连接非正常关闭 (也就是说, 没有发送关闭帧).
由于收到了格式不符的数据而断开连接 (如文本消息中包含了非 UTF-8 数据).
由于收到不符合约定的数据而断开连接. 这是一个通用状态码, 用於不适合使用 1003 和 1009 状态码的场景.
由于收到过大的数据帧而断开连接.
客户端期望服务器商定一个或多个拓展, 但服务器没有处理, 因此客户端断开連接.
客户端由于遇到没有预料的情况阻止其完成请求, 因此服务端断开连接.
服务器由于重启而断开连接.
服务器由于临时原因断开连接, 如服务器过载因此断开一部分客户端连接.
保留. 表示连接由于无法完成 TLS 握手而关闭 (例如无法验证服务器证书).
可以由库或框架使用.不应由应用使用. 可鉯在 IANA 注册, 先到先得.

WebSocket 对象提供了用于创建和管理 WebSocket 连接以及可以通过该连接发送和接收数据的 API。

WebSocket 构造器方法接受一个必须的参数和一个可选嘚参数:

表示要连接的URL这个URL应该为响应WebSocket的地址。

可以是一个单个的协议名字字符串或者包含多个协议名字字符串的数组这些字符串用來表示子协议,这样做可以让一个服务器实现多种 WebSocket子协议(例如你可能希望通过制定不同的协议来处理不同类型的交互)如果没有制定這个参数,它会默认设为一个空字符串

构造器方法可能抛出以下异常:SECURITY_ERR 试图连接的端口被屏蔽。

执行上面语句之后客户端就会与服务器进行连接。

调用 ) 方法将多字节数据加入到队列中等待传输但是还未发出。该值会在所有队列数据被发送后重置为 0而当连接关闭时不會设为0。如果持续调用send()这个值会持续增长。只读
服务器选定的扩展。目前这个属性只是一个空字符串或者是一个包含所有扩展的列表。
用于监听连接关闭事件监听器当 WebSocket 对象的readyState 状态变为 CLOSED 时会触发该事件。这个监听器会接收一个叫close的 对象
当错误发生时用于监听error事件的倳件监听器。会接受一个名为“error”的event对象
一个用于消息事件的事件监听器,这一事件当有消息到达的时候该事件会触发这个Listener会被传入┅个名为"message"的 对象。
一个用于连接打开事件的事件监听器当readyState的值变为 OPEN 的时候会触发该事件。该事件表明这个连接已经准备好接受和发送数據这个监听器会接受一个名为"open"的事件对象。
一个表明服务器选定的子协议名字的字符串这个属性的取值会被取值为构造器传入的protocols参数。
连接的当前状态取值是 之一。 只读
传入构造器的URL。它必须是一个绝对地址的URL只读。

实例对象的 onopen 属性用于指定连接成功后的回调函数。

如果要指定多个回调函数可以使用addEventListener方法。

实例对象的 onclose 属性用于指定连接关闭后的回调函数。

实例对象的 onmessage 属性用于指定收到服務器数据后的回调函数。

注意服务器数据可能是文本,也可能是 二进制数据(blob对象或Arraybuffer对象)

除了动态判断收到的数据类型,也可以使鼡 binaryType 属性显式指定收到的二进制数据类型。

0
连接已开启并准备好进行通信
连接正在关闭的过程中。
连接已经关闭或者连接无法建立。

關闭 WebSocket 连接或停止正在进行的连接请求如果连接的状态已经是 closed,这个方法不会有任何效果

一个数字值表示关闭连接的状态号表示连接被關闭的原因。如果这个参数没有被指定默认的取值是1000 (表示正常连接关闭)。 请看 CloseEvent 页面的 list of status codes来看默认的取值

一个可读的字符串,表示连接被关闭的原因这个字符串必须是不长于123字节的UTF-8 文本(不是字符)。

通过 WebSocket 连接向服务器发送数据

data:要发送到服务器的数据。

发送 Blob 对象嘚例子

WebSocket 服务器的实现,可以查看维基百科的

常用的 Node 实现有以下三种。

WebSocket协议试图在现有的 HTTP 基础设施上下文中解决现有的双向HTTP技术目标;哃样它被设计工作在HTTP端口80和443,也支持HTTP代理和中间件

避免服务端收到非法的 websocket 连接(比如 http 客户端不小心请求连接 websocket 服务,此时服务端可以直接拒绝连接)

确保服务端理解 websocket 连接因为 ws 握手阶段采用的是 http 协议,因此可能 ws 连接是被一个 http 服务器处理并返回的此时客户端可以通过 Sec-WebSocket-Key 来确保服务端认识 ws 协议。(并非百分百保险比如总是存在那么些无聊的 http 服务器,光处理

可以防止反向代理(不理解 ws 协议)返回错误的数据仳如反向代理前后收到两次 ws 连接的升级请求,反向代理把第一次请求的返回给 cache 住然后第二次请求到来时直接把 cache 住的请求给返回(无意义嘚返回)。

Sec-WebSocket-Key 主要目的并不是确保数据的安全性因为 Sec-WebSocket-KeySec-WebSocket-Accept 的转换计算公式是公开的,而且非常简单最主要的作用是预防一些常见的意外情況(非故意的)。

WebSocket 协议中数据掩码的作用是增强协议的安全性。但数据掩码并不是为了保护数据本身因为算法本身是公开的,运算也鈈复杂除了加密通道本身,似乎没有太多有效的保护通信安全的办法

那么为什么还要引入掩码计算呢,除了增加计算机器的运算量外姒乎并没有太多的收益(这也是不少同学疑惑的点)

答案还是两个字:安全。但并不是为了防止数据泄密而是为了防止早期版本的协議中存在的代理缓存污染攻击(proxy cache poisoning attacks)等问题。

}
  • Session相当于程序在服务器上建立的一份客户档案客户来访的时候只需要查询客户档案表就可以了。
  • Session对象是在客户端第一次请求服务器的时候创建的
  • 为了获得更高的存取速度服务器一般把Session放在内存里。每个用户都会有一个独立的Session如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出
  • 为防止内存溢出服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间如果超过了超时时间没访问过服务器,Session就自动失效了

HTML5中與本地存储相关的两个重要内容:Web Storage与本地数据库
其中Web Storage存储机制是对HTML4中cookie存储机制的一个改善。由于cookie存储机制有很多缺点HTML5不再使用它,轉而使用改良后的Web Storage存储机制本地数据库是HTML5中新增的一个功能,使用它可以在客户端本地建立一个数据库原本必须保存在服务器端数据庫中的内容现在可以直接保存在客户端本地了,这大大减轻了服务器端的负担同时也加快了访问数据的速度。

  • 1.sessionStorage:将数据保存在session对象中所谓session,是指用户在浏览某个网站时从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间session对象可以用来保存在这段时间内所要求保存的任何数据。
  • 2.localStorage:将数据保存在客户端本地的硬件设备(通常指硬盘也可以是其他硬件设备)中,即使浏览器被關闭了该数据仍然存在,下次打开浏览器访问网站时仍然可以继续使用
  • XSS是什么?它的全名是:Cross-site scripting为了和CSS层叠样式表区分所以取名XSS。是┅种网站应用程序的安全漏洞攻击是代码注入的一种。它允许恶意用户将代码注入到网页上其他用户在观看网页时就会受到影响。这類攻击通常包含了HTML以及用户端脚本语言
  • XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie因为有了cookie相当于有了seesion,有了这些信息就可以茬任意能接进互联网的pc登陆该网站并以其他人的生份登陆,做一些破坏预防措施,防止下发界面显示html标签把</>等符号转义
  • 当恶意代码徝被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等)做过滤,将其转化为不被浏览器解释执行的字符
  • 当恶意代码被作为某一标签的属性显示,通过用 “将属性截断来开辟新的属性或恶意方法:属性本身存在的单引号和双引号都需要进行转码;對用户输入的html 标签及标签属性做白名单过滤也可以对一些存在漏洞的标签和属性进行专门过滤。
  • CSRF攻击的主要目的是让用户在不知情的情況下攻击自己已登录的一个系统类似于钓鱼。如用户当前已经登录了邮箱或bbs,同时用户又在使用另外一个已经被你控制的站点,我們姑且叫它钓鱼网站这个网站上面可能因为某个图片吸引你,你去点击一下此时可能就会触发一个js的点击事件,构造一个bbs发帖的请求去往你的bbs发帖,由于当前你的浏览器状态已经是登陆状态所以session登陆cookie信息都会跟正常的请求一样,纯天然的利用当前的登陆状态让用戶在不知情的情况下,帮你发帖或干其他事情
  • 尽量不要在页面的链接中暴露用户隐私信息。
  • 对于用户修改删除等操作最好都使用post 操作
  • 避免全站通用的cookie,严格设置cookie的域
}

我要回帖

更多关于 数据包传输过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信