在建立HTTP标准规范时,制订者主要想把HTTP 当作传输HTML文档的协议。随着时代的发展,Web 的用途更具多样性,比如演化成在线购物网站、SNS(SocialNetworking Service,社交网络服务)、企业或组织内部的各种管理工具,等等
而这些网站所追求的功能可通过 Web应用和脚本程序实现。即使这些功能已经满足需求,在性能上却未必最优,这是因为 HTTP 协议上的限制以及自身性能有限。
HTTP功能上的不足可通过创建一套全新的协议来弥补。可是目前基于HTTP的Web浏览器的使用环境已遍布全球,因此无法完全抛弃HTTP。有一些新协议的规则是基于HTTP的,并在此基础上添加了新的功能
SPDY(发音为“speedy”)是一种由Google推出的用于加速网络传输的协议。它的目标是通过减少页面加载时间、提高网络性能和安全性,提供更好的用户体验。SPDY并不是一个完全独立的协议,而是在传输层协议(如HTTPS)之上进行改进。
SPDY 的主要特性和目标包括:
希望使用SPDY时,Web的内容端不必做什么特别改动,而Web浏览器及Web服务器都要为对应SPDY做出一定程度上的改动。有好几家Web浏览器已经针对SPDY做出了相应的调整。另外,Web服务器也进行了实验性质的应用,但把该技术导入实际的 Web 网站却进展不佳。
因为SPDY基本上只是将单个域名(IP地址)的通信多路复用所以当一个 Web网站上使用多个域名下的资源,改善效果就会受到限制。
SPDY的确是一种可有效消除HTTP瓶颈的技术,但很多Web网站存在的问题并非仅仅是由 HTTP瓶颈所导致。对Web本身的速度提升,还应该从其他可细致钻研的地方人手,比如改善 Web 内容的编写方式等。
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许在客户端和服务器之间进行实时的、双向的数据传输。与传统的 HTTP 协议不同,WebSocket 在建立连接后,可以在客户端和服务器之间进行持久性的通信,而不需要频繁地建立和断开连接。
以下是 WebSocket 的一些关键特点和工作原理:
WebSocket 的引入使得实时应用的开发变得更加便捷,无需使用轮询等手段实现实时通信。许多现代的 Web 应用和框架都广泛使用 WebSocket 技术来实现实时性能更高的通信。
WebSocket 握手过程是通过 HTTP 协议实现的,它在建立 WebSocket 连接之前进行。以下是 WebSocket 握手请求的基本步骤:
客户端发起连接请求: 客户端通过普通的 HTTP 请求向服务器发起 WebSocket 连接请求。这个请求类似于普通的 HTTP GET 请求,但是包含了特定的协议和头部字段,表示客户端希望升级连接为 WebSocket。
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Upgrade: websocket
表示客户端希望升级连接为 WebSocket。Connection: Upgrade
表示客户端希望升级连接。其中,Sec-WebSocket-Key
是一个随机的 Base64 编码的字符串,用于确保服务器不会被攻击者滥用。Sec-WebSocket-Version
表示 WebSocket 的版本,目前主要使用的版本是 13。
服务器响应握手请求: 服务器接收到客户端的请求后,进行握手响应。服务器响应的头部包含了升级连接的信息,表示同意将连接升级为 WebSocket。
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Upgrade: websocket
表示服务器同意升级连接为 WebSocket。Connection: Upgrade
表示服务器同意升级连接。Sec-WebSocket-Accept
是服务器通过客户端提供的 Sec-WebSocket-Key
计算出来的响应验证字段,用于确保客户端和服务器都支持 WebSocket,并防止恶意攻击。握手完成: 客户端收到服务器的响应后,WebSocket 握手过程就完成了。此时,连接升级为 WebSocket,客户端和服务器可以通过这个 WebSocket 连接进行双向通信。
WebSocket 握手过程的目的是确保客户端和服务器都支持 WebSocket 协议,同时进行一些验证,确保连接的安全性。一旦握手完成,后续的数据传输将使用 WebSocket 协议,而不再是普通的 HTTP。
WebSocket API 是用于在 Web 应用程序中实现 WebSocket 通信的一组 JavaScript 接口。这些接口提供了在客户端与服务器之间建立 WebSocket 连接、发送和接收数据的方法。WebSocket API 使得开发者能够通过 JavaScript 脚本在浏览器中实现实时双向通信。
WebSocket API 的基本用法包括以下步骤:
创建 WebSocket 对象: 使用 WebSocket
构造函数创建一个 WebSocket 对象,指定要连接的 WebSocket 服务器的地址。
const socket = new WebSocket('ws://example.com/socket');
这将发起到指定 WebSocket 服务器的连接。
监听事件: 通过监听 WebSocket 对象的事件来处理连接、消息发送和接收等不同阶段的操作。
javascriptCopy codesocket.addEventListener('open', (event) => {
console.log('WebSocket 连接已打开');
});
socket.addEventListener('message', (event) => {
console.log('接收到消息:', event.data);
});
socket.addEventListener('close', (event) => {
console.log('WebSocket 连接已关闭');
});
socket.addEventListener('error', (event) => {
console.error('WebSocket 发生错误:', event.error);
});
open
事件在 WebSocket 连接成功打开时触发。message
事件在接收到新消息时触发。close
事件在 WebSocket 连接关闭时触发。error
事件在发生错误时触发。发送消息: 使用 send
方法向服务器发送消息。
javascriptCopy code
socket.send('Hello, WebSocket!');
这将把消息发送到服务器。
关闭连接: 使用 close
方法关闭 WebSocket 连接。
javascriptCopy code
socket.close();
这将关闭与服务器的连接。
总体而言,WebSocket API 提供了一种简单而强大的机制,使得在 Web 应用程序中实现实时通信变得更加容易。通过使用 WebSocket,开发者可以在客户端和服务器之间实现低延迟、高效率的双向通信,适用于诸如在线聊天、实时更新、在线游戏等场景。
HTTP/2.0(简称HTTP/2)是HTTP协议的一个重大升级版本,旨在提高页面加载性能和用户体验。它是HTTP/1.x的继任者,于2015年正式发布。HTTP/2带来了一些关键的改进,其中最显著的是支持多路复用、头部压缩和服务器推送等特性。
以下是HTTP/2.0的一些重要特性:
**HTTP/2 的引入旨在改善Web性能,减少页面加载时间,并提高用户体验。它对于支持现代Web应用程序的高并发和复杂性是非常重要的,同时也为未来的Web协议演进提供了基础。**大多数现代浏览器和服务器都支持HTTP/2,因此,对于构建性能优越的Web应用程序,采用HTTP/2 是一个明智的选择。
WebDAV ( Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制)是一个**可对Web服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。**它作为扩展HTTP/1.1的协议定义在RFC4918。
除了创建、删除文件等基本功能,它还具备文件创建者管理、文件编辑过程中禁止其他用户内容覆盖的加锁功能,以及对文件内容修改的版本控制功能。
使用HTTP/1.1的PUT方法和DELETE方法,就可以对Web 服务器上的文件进行创建和删除操作。可是出于安全性及便捷性等考虑,一般不使用。
针对服务器上的资源, WebDAV新增加了一些概念
WebDAV为实现远程文件管理,向HTTP/1.1中加了以下这些方法
为配合扩展的方法,状态码也随之扩展。
请求示例:
PROPFIND /path/to/resource HTTP/1.1
Host: example.com
Depth: 1
Content-Type: text/xml
PROPFIND
表示进行属性检索的请求。/path/to/resource
是远程服务器上资源的路径。Host
表示服务器的主机名。Depth: 1
表示检索资源及其直接子资源的属性。Content-Type: text/xml
表示请求体的内容类型为 XML。响应示例:
HTTP/1.1 207 Multi-Status
Content-Type: text/xml
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>/path/to/resource</D:href>
<D:propstat>
<D:prop>
<D:getcontenttype>text/plain</D:getcontenttype>
<D:getcontentlength>12345</D:getcontentlength>
<!-- 其他属性信息 -->
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<!-- 其他资源的响应信息 -->
</D:multistatus>
HTTP/1.1 207 Multi-Status
表示请求已成功处理,但返回的响应可能包含多个状态码。Content-Type: text/xml
表示响应体的内容类型为 XML。这只是 WebDAV 请求和响应的一个简单示例。实际上,PROPFIND
请求和响应可以包含更多的属性信息,具体的格式和内容可以按照 WebDAV 协议的规范进行定义和解析。