- 本文主要介绍应用层除HTTPS之外的其他协议,包括支持全双工的WebSocket协议、HTTPDNS、文件传输协议FTP、邮件协议收发协议POP、IMAP(收)和SMTP(发)。
#区别WebSocket和Socket
Socket:一套网络编程API,利用他可以建立网络连接,一般都是基于操作系统底层实现的(Socket编程)
WebSocket:网络协议。
#WebSocket协议
背景
- HTTP请求的特点,通信只能由客户端发起(请求-应答 模式),所以早期的网站为了实现推送技术,!所用的技术都是轮询(直播,聊天,股票)
- **轮询:**由浏览器每隔一段时间(如每秒)向服务器发出HTTP请求,然后服务器返回最新的数据给客户端
- 为了能更好的节省服务器资源和带宽,并且能够更实时地进行通讯,HTML5规范中出现了WebSocket协议
WebSocket
WebSocket是基于TCP的支持全双工通信的应用层协议
WebSocket的应用场景
- 社交订阅、股票基金报价、体育实况更新、多媒体聊天、多玩家游戏等
- 社交订阅、股票基金报价、体育实况更新、多媒体聊天、多玩家游戏等
WebSocket和 HTTP 属于平级关系,都是应用层的协议
- 其实TCP本身就是支持全双工通信的(客户端、服务器均可主动发消息给对方)
- 只是HTTP的 “请求-应答模式” 限制了TCP的能力
WebSocket使用 80(ws://)、443(wss://) 端口,可以绕过大多数防火墙的限制(不能写#)
ws://example.com/wsapi
wss://secure.example.com/wsapi
与 HTTP 不同的是,WebSocket需要先建立连接(在应用层建立)
- 这就使得WebSocket成为一种有状态的协议,之后通信时可以省略部分状态信息
- 而HTTP请求可能需要在每个请求都额外携带状态信息(如身份认证等)
#WebSocket - 建立连接
WebSocket需要借助 HTTP协议来建立连接(也叫作握手,Handshake)
- 由客户端(浏览器)主动发出握手请求
- Connection必须设置Upgrade
- 表示客户端希望连接升级
- Upgrade必须设置webSocket
- 表示希望升级到WebSocket协议
- Sec-WebSocket-Version
- 表示支持的WebSocket版本
- RFC 6455要求使用的的是13
- Sec-WebSocket-Key是客户端随机生成的字符串
- 服务端收到客户端的Sec-WebSocket-Key后会执行以下操作
- Sec-WebSocket-Key加上一个固定的GUID值
- 将1中的结果进行SHA-1摘要计算
- 将2中的结果进行Hex To Base64编码
- 将3中的结果作为Sec-WebSocket-Accept响应头的值,返回给客户端
- 这样操作以后就能尽量避免普通的HTTP请求被误认为是WebSocket协议
WebSocket - 使用
WebSocket的体验和演示
W3C标准化看一套
WebSocket
API 可以通过JS直接调用:1
let ws = new WebSocket('wss://example.com')
#WebService
WebService:Web服务,是一种跨编程语言和跨操作系统平台的远程调用技术标准
应用场景
天气预报、手机归属地查询、航班信息查询、物流信息查询等,比如天气预报,是气象局把自己的服务以WebService形式暴露出来,让第三方程序可以调用这些服务功能
后被Web API取代(例如:HTTP + JSON)(大多数使用)
WebService传递数据
- WebService使用SOAP协议来封装传递数据
- SOAP(Simple Object Access Protocol),译为:简单对象访问协议
- 很多时候,SOAP = HTTP + XML
- WebService使用SOAP协议来封装传递数据
- 补充:
- WSDL(Web Services Description Language),译为:Web服务描述语言
- 一个XML文档,用以描述WebService接口的细节(比如参数、返回值等)
- 一般在WebService的URL后面跟上?wsdl获取WSDL信息
- 比如:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
#RESTful风格
简介:
RESTful的全称是:(REpresentational State Transfer)
REST是一种互联网架构设计风格
- 定义一组用于创建Web服务的约束
- 符合REST架构的Web服务,称为为RESTful Web服务
RESTful的使用:
URL使用名词(建议使用复数形式),不使用动词
- 推荐:
users
、/users/6
- 不推荐:
/listUsers
、/getUser?id=6
、/user/list
、/user/get?id=6
- 推荐:
使用HTTP 的请求方法表示动作
一个资源连接到另一个资源,使用子资源的形式
- GET
/users/6/cars/88
- POST
/users/8/cars
- GET
API 的版本化
baidu.com/v1/users
baidu.com/v2/users/66
返回JSON格式数据
发生错误是,不要返回200的状态码
#HTTPDNS
简介
- HTTPDNS是基于HTTP协议向DNS服务器发送域名解析请求
- 替代了传统基于DNS协议向运营商Local DNS发起解析请求的传统方式
- 可以避免Local DNS造成的域名劫持和跨网访问问题
- 常用在移动互联网中(比如Android、iOS开发中)
使用:
- 腾讯云:https://cloud.tencent.com/product/httpdns
- 阿里云:https://help.aliyun.com/product/30100.html
- 使用移动端集成的相关SDK就可以使用HTTPDNS服务
#FTP文件传输协议
FTP的两种连接模式:主动(Active)和被动(Passive)
不管是哪种模式,都需要客户端和服务器建立2个连接
- 控制连接:用于传输状态信息(命令,CMD)
- 数据连接:用于传输文件和目录信息(data)
FTP - 主动模式
客户端
- 客户端打开一个随机的命令端口(端口号大于1024,假设为N),同时连接至服务器的命令端口21(固定不变)
- 客户端开始监听N+1数据端口,同时发送一个Port命令给服务器的命令端口21(告诉客户端正在监听N+1数据端口,并且已经准本好从此端口接受数据)
服务器
- 服务器打开20号数据端口,并创建和客户端端口(N+1)的连接
FTP - 被动模式
客户端
客户端打开一个随机的命令端口(端口号大于1024,假设为N),同时连接至服务器的命令端口21(固定不变)
客户端通过命令端口N发送PASV命令(开启被动模式)给服务器端口21
服务器打开一个随机的命令端口(端口号大于1024,假设为M),并告知该端口号给客户端
客户端数据端口N+1发起与服务器数据端口M的连接
#邮件相关的协议
发邮件使用的协议
- SMTP(Simple Mail Transfer Protocol),译为:简单邮件传输协议
- 基于TCP,标准参考RFC 5321
- 服务器默认使用25端口,SSL/TLS使用465端口
- SMTP(Simple Mail Transfer Protocol),译为:简单邮件传输协议
收邮件使用的协议
POP(Post Office Protocol),译为:邮局协议
- 基于TCP,最新版是POP3,标准参考RFC 1939
- 服务器默认使用110端口,SSL/TLS使用995端口
IMAP(Internet Message Access Protocol),译为:因特网信息访问协议
- 基于TCP,最新版是IMAP4,标准参考RFC 3501
- 服务器默认使用143端口,SSL/TLS使用993端口
收发邮件流程
POP 和 IMAP对比
POP的特点
客户端连接服务器时,将会从服务器下载所有邮件
可以设置下载完后,立即或一段时间后删除服务器邮件
客户端的操作(比如删除邮件、移动到文件夹)不会跟服务器同步
每个客户端都是独立的,都可以获得其自己的电子邮件副本
IMAP的特点
客户端连接服务器时,获取的是服务器上邮件的基本信息,并不会下载邮件
等打开邮件时,才开始下载邮件
客户端的操作(比如删除邮件、移动到文件夹)会跟服务器同步
所有客户端始终会看到相同的邮件和相同的文件夹