其他协议
补充协议
RARP
ARP(Address Resolution Protocol),译为:地址解析协议
- 通过 IP 地址获取 MAC 地址
RARP(Reverse Address Resolution Protocol),译为:逆地址解析协议
- 使用与 ARP 相同的报头结构
- 作用与 ARP 相反,用于将 MAC 地址转换为 IP 地址
- 后来被 BOOTP、DHCP 所取代
ICMP
ICMP(Internet Control Message Protocol),译为:互联网控制消息协议
- IPv4 中的 ICMP 被称作 ICMPv4,IPv6 的 ICMP 则被称作 ICMPv6
- 通常用于返回错误信息
- 比如 TTL 值过期,目的不可达
- ICMP 地错误消息总是包括了数据源并返回给发送者
WebSocket
HTTP WebSocket
Socket 是一套 网络编程API,利用它可以建立网络连接,一般都是操作系统底层实现的。WebSocket 是一个 网络协议
HTTP 请求的特点:通信只能由客户端发起。所以,早起很多网站为了实现推送技术,所用的技术都是轮询
- 轮询是指由浏览器每隔一段时间(如每秒)向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端
- 为了能更好的节省服务器资源和带宽,并且能够更实时地进行通讯,HTML5 规范总出现了 WebSocket 协议
WebSocket 是基于 TCP 地支持全双工通信的应用层协议
WebSocket 的应用场景很多
- 社交订阅、股票基金报价、体育实况更新、多媒体聊天、多玩家游戏等
WebSocket 和 HTTP 属于平级关系,都是应用层协议
- 其实 TCP 本身就是支持全双工通信的(客户端、服务器均可主动发消息给对方)
- 只是 HTTP 地 "请求-应答模式" 限制了 TCP 地能力
WebSocket 使用 80(ws://)、443(wss://)端口,可以绕过大多数防火墙的限制
- 与 HTTP 不同的是,WebSocket 需要先建立连接
- 这就使得 WebSocket 成为一种有状态的协议,之后通信时可以省略部分状态信息
- 而 HTTP 请求可能需要再每个请求都额外携带状态信息(如:身份认证等)
建立连接
WebSocket 需要借助 HTTP 协议来建立连接(也叫作握手,Handshake)
- 由客户端(浏览器)主动发出握手请求
- Connection 必须设置 Upgrade
- Upgrade 必须设置 websocket
- Sec-WebSocket-Key 提供给服务器来验证是否收到一个有效的 WebSocket 请求
- Sec-WebSocket-Version 版本号
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
GUID: 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
Sec-WebSocket-Key+GUID: dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
SHA1加密:b37a4f2cc0624f1690f64606cf385945b2bec4ea
BASE64加密:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- 更多的时候会使用 Socket.io 库,对于不支持 WebSocket 浏览器会回退到 HTTP 轮询,而且提供自动重连
// client
const ws = new WebSocket('ws://localhost:3000')
ws.addEventListener('open', () => {
console.log('连接服务器了!')
ws.send('床前明月光,疑是地上霜')
})
ws.addEventListener('message', ({ data }) => {
console.log(data)
})
// server
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 3000 })
wss.on('connection', ws => {
console.log('连接进来了!')
ws.on('message', () => {
ws.send('举头望明月,低头思故乡')
})
ws.on('close', () => {
console.log('连接走了~')
})
})
WebService
WebService,译为:Web 服务,是一种跨编程语言和操作系统平台的远程调用技术标准
WebService使用场景举例:
- 天气预报、手机归属地查询、航班信息查询、物流信息查询
- 比如天气预报,是气象局把自己的服务以WebService形式暴露出来,让第三方程序可以调用这些服务功能
- http://www.webxml.com.cn/zh_cn/index.aspx
事实上,WebService 完全可以用普通的 Web API 取代(比如 HTTP + JSON)
- 现在很多企业的开放平台都是直接采用 Web API
SOAP
SOAP(Simple Object Access Protocol),译为:简单对象访问协议
- 很多时候,SOAP=HTTP+XML
WebService 使用 SOAP 协议来封装传递数据
WSDL(Web Services Description Language),译为:Web 服务描述语言
一个 XML 文档,用以描述 WebService 接口的细节(比如:参数、返回值等)
一般在 WebService 的 URL 后面跟上 ?wsdl 获取 WSDL 信息
Content-Type: application/soap+xml;
RESTful
REST 的全称是:REpresentational State Transfer
- 译为:"表现层状态转移"
- 把客户端当前的状态通过 API 请求传递给服务端
REST 是一种互联网软件架构设计风格
- 定义了一组用于创建 Web 服务的约束
- 符合 REST 架构的 Web 服务,称为 RESTful Web 服务
约束
2 个核心:资源的表示性、状态传输
6 个约束:
- 客服端-服务端: 客户端和服务端是分离的, 它们可以独自的进化
- 无状态: 客户端和服务端的通信必须是无状态的, 状态应包含在请求里的. 也就是说请求里要包含服务端需要的所有的信息, 以便服务端可以理解请求并可以创造上下文
- 分层系统: 就像其它的软件架构一样, REST也需要分层结构, 但是不允许某层直接访问不相邻的层
- 统一接口: 这里分为4点, 他们是: 资源标识符(URI), 资源的操作(也就是方法Method, HTTP动词), 自描述的响应(可以认为是媒体类型Media-Type), 以及状态管理(超媒体作为应用状态的引擎 HATEOAS, Hypermedia as the Engine of Application State)
- 缓存: 缓存约束派生于无状态约束, 它要求从服务端返回的响应必须明确表明是可缓存的还是不可缓存的
- 按需代码: 这允许客户端可以从服务端访问特定的资源而无须知晓如何处理它们. 服务端可以扩展或自定义客户端的功能
REST 与 GrapQL
- REST 里,客户端需要面对多个资源端点,端点变了也要做相应更新
- GraphQL 客户端只需要面对一个端点,这样可以避免客户端获取不足和过度获取,不需要客户端把杂乱的资源进行请求后的整合,改善网络带宽
- 读 Query、写 Mutation、事件观察 Subscription
缺点:REST 越到后期越复杂,如果想要拥有复杂关系的数据,有强类型的需求,要面对很多移动端用户,对客户端的性能有较高的要求,也可以承受一定的学习成本,可以考虑 GraphQL
Significant advantages of GraphQL
- 取你所需要的数据,不多也不少
- 向导查询,支持嵌套查询
- 强类型
RPC
- json 的负载会比 protocol buffers 大。CPU 解析 json 也需要消耗更多资源,解析 protocol buffers 消耗更小,因为会序列化成二进制串
- gRPC 是基于 HTTP2 构建,支持流式传输可以单向也可以双向,使用 HPACK 进行压缩降低负载体积
- 前后端不同团队开发,REST 和 GraphQL 更适用,全栈开发 tRPC 可以降低难度
实践建议
URL 中使用名词(建议用复数形式),不使用动词
- 推荐:/users、/users/6
- 不推荐:
/listUsers、/getUser?id=6,/uesr/list、/user/get?id=6
使用 HTTP 的请求方法表达动作:
一个资源连接到其他资源,使用子资源的形式:
- GET /users/6/cars/8
- POST /users/8/cars
API 版本化
- mj.com/v1/users
- mj.com/v2/users/66
返回 JSON 格式的数据
发生错误时,不要返回 200状态码
HTTPDNS
HTTPDNS 是基于 HTTP 协议向 DNS 服务器发送域名解析请求
- 替代了基于 DNS 协议向运营商 Local DNS 发起解析请求的传统方式
- 可以避免 Local DNS 造成的 域名劫持 和 跨网访问 问题
- 常用在 移动互联网 中(比如在 Android、iOS 开发中)
HTTPDNS使用
市面上已经有现成的解决方案
移动端集成相关的 SDK 即可使用 HTTPDNS 服务
FTP
FTP (File Transport Protocol),文件传输协议,RFC 959 定义了此规范,是基于TCP的应用层协议
RFC 1738 中有定义,FTP 的 URL 格式为
ftp://[user[:password]@]host[:port]/url-path
FTP 有 2 种连接模式:主动(Active)和被动(Passive)
不管是哪种模式,都需要客户端和服务器建立2个连接
- 控制连接:用于传输状态信息(命令,cmd)
- 数据连接:用于传输文件和目录信息(data)
FTP-主动模式
FTP-被动模式
邮件相关的协议
SMTP、POP、IMAP
发邮件使用的协议
SMTP (Simple Mail Transfer Protocol),简单邮件传输协议
- 基于 TCP,标准参考 RFC 5321
- 服务器默认使用 25 端口,SSL/TLS 使用 465 端口
- 收邮件使用的协议
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的特点
- 客户端连接服务器时,获取的是服务器上邮件的基本信息(如列表),并不会下载邮件
- 等打开邮件时,才开始下载邮件
- 客户端的操作(比如删除邮件、移动到文件夹)会跟服务器同步
- 所有客户端始终会看到相同的邮件和相同的文件夹
VPN
VPN(Virtual Private Network),译为:虚拟私人网络
- 它可以再公共网络上建立专用网络,进行加密通讯
作用
- 提高上网的安全性
- 保护公司内部资料
- 隐藏上网者的身份
- 突破网站的地域限制
- 有些网站针对不同地区的用户展示不同的内容
- 突破网络封锁
- 因为有 GWF 的限制,有些网站在国内上不了
- Great Firewall of China 中国长城防火墙
- GFW 拥有 IP 屏蔽、关键词过滤、DNS 劫持等功能
VPN 与代理的区别
- 软件
- VPN 一般需要安置 VPN 客户端软件
- 代理不需要安装额外的软件
- 安全性
- VPN 默认会对数据进行加密
- 代理默认不会对数据进行加密(数据最终是否加密取决于使用的协议本身)
- 费用
- 一般情况下,VPN 比代理贵
VPN 实现原理
- 使用了隧道协议
- 常见的 VPN 隧道协议有
- PPTP(Point to Point Tunneling Protocol):点对点隧道协议
- L2TP(Layer Two Tunneling Protocol):第二层隧道协议
- IPsec(Internet Protocol Security):互联网安全协议
- SSL VPN(如 OpenVPN)
网络爬虫
网络爬虫 (Web Crawler),也叫做 网络蜘蛛 (Web Spider)
- 模拟人类使用浏览器操作页面的行为,对页面进行相关的操作
- 常用爬虫工具:Python 的 Scrapy 框架
搜索引擎
示例
可以使用 Java 的一个小框架 Jsoup 爬一些简单的数据
- jar包:jsoup、commons-io
- https://jsoup.org/packages/jsoup-1.13.1.jar
- https://mirror.bit.edu.cn/apache//commons/io/binaries/commons-io-2.8.0-bin.zip
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
// Jsoup使用CSS选择器来查找元素
String dir = "C:/Users/yusael/Desktop/imgs/"; // 爬取后的存放路径
String url = "https://ext.se.360.cn/webstore/category";
Document doc = Jsoup.connect(url).get();
Elements eles = doc.select(".applist .appwrap");
for (Element ele : eles) {
String img = ele.selectFirst("img").attr("src");
String title = ele.selectFirst("h3").text();
String intro = ele.selectFirst(".intro").text();
// 下载图片
String filepath = dir + (title + ".png");
FileUtils.copyURLToFile(new URL(img), new File(filepath));
}
}
}
robots.txt
robots.txt 是存放于网站根目录下的文本文件,比如:https://www.baidu.com/robots.txt
- 用来告诉爬虫:哪些内容是不应被爬取的,哪些是可以被爬取的
- 因为一些系统中的URL是大小写敏感的,所以 robots.txt 的文件名应统一为小写
robots.txt 并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私
- 只能防君子,不能防小人
- 无法阻止不讲 "武德" 的年轻爬虫爬取隐私信息
无线网络
HTTP 缓存(Cache)
实际上,HTTP 的缓存机制远远比上图的流程要复杂
- 通常会缓存的情况是:GET请求 + 静态资源(比如HTML、CSS、JS、图片等)
- Ctrl + F5:可以强制刷新缓存
缓存 - 响应头
Pragma:作用类似于 Cache-Control,HTTP/1.0 的产物
Expires:缓存过期时间(GMT 格式时间),HTTP/1.0的产物
GMT(Greenwich Mean Time)格林威治时间,以伦敦格林威治的子午线为基线,以地球自转为标准,全球都以此标准设定时间
new Date().toGMTString()
->Thu, 03 Aug 2023 08:27:34 GMT
UTC(Coordinated Universal Time)世界协调时,又称世界标准时间或世界协调时间,是最主要的世界时间标准,在时刻上尽量接近于格林尼治标准时间
ISO 规定了一种明确的、国际上都能理解的日历和时钟格式
new Date().toISOString()
->2023-08-03T08:31:30.426Z
时间戳,相对于格林威治时间(GMT)1970年1月1日的午夜0点0分0秒的时间距离
Cache-Control:设置缓存策略
- no-storage:不缓存数据到本地
- public:允许用户、代理服务器缓存数据到本地
- private:只允许用户缓存数据到本地
- max-age:缓存的有效时间(多长时间不过期),单位秒
- no-cache:每次需要发请求给服务器询问缓存是否有变化,再来决定如何使用缓存
优先级:Pragma > Cache-Control > Expires
Last-Modified:资源的最后一次修改时间
ETag:资源的唯一标识(根据文件内容计算出来的摘要值)
优先级:ETag > Last-Modified
缓存 - 请求头
If-None-Match
- 如果上一次的响应头中有 ETag,就会将 ETag 的值作为请求头的值
- 服务器发现资源的最新摘要值跟 If-None-Match 不匹配,就会返回新的资源 (200 OK)
- 否则,就不会返回资源的具体数据 (304 Not Modified)
If-Modified-Since
- 如果上一次的响应头中没有 ETag,有 Last-Modified,就会将 Last-Modified 的值作为请求头的值
- 如果服务器发现资源的最后一次修改时间晚于 If-Modified-Since,就会返回新的资源 (200 OK)
- 否则,就不会返回资源的具体数据 (304 Not Modified)
Last-Modified 缺陷
- 只能精确到秒级别,如果资源在 1 秒内被修改了,客户端将无法获取最新的资源数据
- 如果某些资源被修改了(最后一次修改时间发生了变化),但是内容并没有任何变化(比如在文本中敲个空格再删除)
- 会导致相同数据重复传输,没有使用到缓存
ETag 可以办到
- 只要资源的内容没有变化,就不会重复传输资源数据
- 只要资源的内容发生了变化,就会返回最新的资源数据给客户端
IPv6
IPv6 (Internet Protocol version 6),网际协议第6版
- 用它来取代 IPv4 主要是为了 解决 IPv4 地址枯竭问题,同时它也在其他方面对于 IPv4 有许多改进
- 然而长期以来 IPv4 在互联网流量中仍占据主要地位,IPv6 的使用增长缓慢
- 在 2019 年 12 月,通过 IPv6 使用 Google 服务的用户百分率首次超过 30%
- 因为使用 IPv6 需要设备、操作系统内核升级支持 IPv6
- 不像 HTTP 升级到 HTTP2 一样方便
IPv6 采用 128 位的地址,而 IPv4 使用的是 32 位
- 支持 2128(约3.4 ∗ 1038 )个地址
- 以地球人口 70 亿人计算,每人平均可分得约 4.86 ∗ 1028 个 IPv6 地址
- 解决了 IPv4 地址枯竭问题
地址格式
IPv6 地址为 128 bit,每 16bit 一组,共 8 组
- 每组以冒号
:
隔开,每组以 4 位十六进制方式表示 - 例如 2001:0db8:86a3:08d3:1319:8a2e:0370:7344
类似于 IPv4 的点分十进制,IPv6 同样也存在点分十六进制的写法
- 2.0.0.1.0.d.b.8.8.5.a.3.0.8.d.3.1.3.1.9.8.a.2.e.0.3.7.0.7.3.4.4
每组前面连续的 0 可以省略。下列 IPv6 地址是等价的:
- 2001:0db8:02de:0000:0000:0000:0000:0e13
- 2001:db8:2de:0:0:0:0:e13
双冒号 ::
表示一组 0 或多组连续的 0,但只能出现一次。下列 IPv6 地址等价:
- 2001:db8:2de:0:0:0:0:e13
- 2001:db8:2de::e13
2001::25de::cade 是非法的,因为双冒号:出现了两次,会造成歧义
- 2001:0000:0000:0000:0000:25de:0000:cade
- 2001:0000:25de:0000:0000:0000:0000:cade
::1
是本地环回地址:0:0:0:0:0:0:0:1
ping ::1
可以ping通本机
首部格式
- 有 40 字节的固定首部
Version (占 4bit,0110):版本号
Traffic Class (占 8bit):交通类别
- 指示数据包的类别或优先级,可以帮助路由器根据数据包的优先级处理流量
- 如果路由器发生拥塞,则优先级最低的数据包将被丢弃
Payload Length (占 16bit):有效负载长度
- 最大值 65535 字节
- 包括了扩展头部、上层(传输层)数据的长度首部格式
Hop Limit (占 8bit):跳数限制
- 与IPv4数据包中的TTL相同
Source Address (占 128bit):源 IPv6 地址
Destination Address (占 128bit):目的 IPv6 地址
Flow Label (占 20bit):流标签
- 指示数据包属于哪个特定序列(流)
- 用数据包的源地址、目的地址、流标签标识一个流
拓展头部
Next Header(占 8bit):下一个头部
- 指示扩展头部(如果存在)的类型、上层数据包的协议类型(例如 TCP、UDP、ICMPv6)
即时通信(IM)
即时通信 (Instant Messaging,简称IM),平时用的QQ、微信,都属于典型的IM应用
国内的IM开发者社区:
IM 云服务
常用的协议:
- XMPP、MQTT、自定义协议
XMPP
XMPP (Extensible Messaging and Presence Protocol)
- 译为:可扩展消息与存在协议,前身是 Jabber
- 基于 TCP,默认端口 5222、5269
特点
- 使用 XML 格式进行传输,体积较大
- 专为 IM 而开发的、比较成熟的 IM 协议,开发者接入方便
MQTT
MQTT (Message Queuing Telemetry Transport),消息队列遥测传输
- 基于 TCP,默认端口 1883、8883(带 SSL/TLS)
特点
- 开销很小,以降低网络流量,信息冗余远小于XMPP
- 不是专门为 IM 设计的协议,很多功能需要自己实现
- 很多人认为 MQTT 是最适合 物联网 (IoT,Internet of Things) 的网络协议
流媒体
流媒体 (Streaming Media),又叫流式媒体
- 是指将一连串的多媒体数据压缩后,经过互联网分段发送数据,在互联网上即时传输影音以供观赏的一种技术
- 此技术使得资料数据包得以像流水一样发送,不使用此技术,就必须在使用前下载整个媒体文件
RTP (Real-Time Transport Protocol),实时传输协议
RTCP (Real-Time Transport Control Protocol),实时传输控制协议
- 参考:RFC 3550,基于UDP,使用RTP的下一个端口
RTSP (Real-Time Streaming Protocol),实时流协议,参考:RFC 7820
- 基于TCP、UDP的554端口
RTMP (Real-Time Messaging Protocol),实时消息传输协议,由Adobe公司出品
- 默认基于TCP的1935端口
HLS (HTTP Live Streaming),苹果公司出品,参考:RFC 821
- 基于HTTP的流媒体网络传输协议