服务端与网络
http/https 协议
-
1.0 协议缺陷:
- 无法复用链接 完成即断开,重新慢启动和TCP3次握手
- head of line blocking: 线头阻塞,导致请求之间互相影响
-
1.1 改进:
- 长链接(默认 keep-alive),复用
- host字段指定对应的虚拟站点
- 新增功能:
- 断点续传
- 身份认证
- 状态管理
- cache 缓存
- Cache-Control
- Expires
- Last-Modified
- Etag
-
2.0:
- 多路复用
- 二进制分帧层:应用层和传输层之间
- 首部压缩
- 服务端推送
-
https:较为安全的网络传输协议
- 证书(公匙)
- SSL 加密
-
TCP:
- 三次握手
- 四次挥手
- 滑动窗口:流量控制
- 拥塞处理
- 慢开始
- 拥塞避免
- 快速重传
- 快速恢复
-
缓存策略:可分为 强缓存 和协商缓存
- 唯一标识方案:Etag(respones携带)&if-None-Match(request携带,上一次返回的Etag):服务器判断资源是否被修改。
- 最后一次修改时间:Last-Modified(response) & If-Modified-Since (request,上一次返回的Last-Modified)
- 如果一致,则直接返回304通知浏览器使用缓存
- 如果不一致,则服务端返回新的资源
- Last-Modified 缺点:
- 周期性修改,但内容未变时,会导致缓存失效
- 最小粒度只到 s, s 以内的改动无法检测到
- Etag的优先级高于Last-Modified
常见状态码
- 1xx 接受,继续处理
- 200 成功,并返回数据
- 201 已创建
- 202 已接受
- 203 成为,但未授权
- 204 成功,无内容
- 205 成功 重置内容
- 206 成功 部分内容
- 301 永久移动 重定向
- 302 临时移动 可使用原有URL
- 304 资源未修改,可使用缓存
- 305 需要代理访问
- 400 请求语法错误
- 401 要求身份认证
- 403 拒接请求
- 404 资源不存在
- 500 服务器错误
GET/POST
- get: 缓存、请求长度受限、会被历史保存记录
- 无副作用(不修改资源),幂等(请求次数与资源无关)的场景
- post:安全、大数据、更多编码类型
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded or multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。 在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
Websocket
Websocket 是一个 持久化的协议, 基于 http , 服务端可以 主动 push
HTTP 协议有一个缺陷:通信只能由客户端发起
(1)建立在 TCP 协议之上,服务器端的实现比较容易。
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
(3)数据格式比较轻量,性能开销小,通信高效。
(4)可以发送文本,也可以发送二进制数据。
(5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws
(如果加密,则为wss
),服务器网址就是 URL。
- new WebSocket(url)
- ws.onerror = fn
- ws.onclose = fn
- ws.onopen = fn
- ws.onmessage = fn
- ws.send()
TCP三次握手
客户端 – FIN --> 服务端, FIN—WAIT
服务端 – ACK --> 客户端, CLOSE-WAIT
服务端 – ACK,FIN --> 客户端, LAST-ACK
客户端 – ACK --> 服务端,CLOSED
Node 的 Event Loop: 6个阶段
- timer 阶段: 执行到期的
setTimeout / setInterval
队列回调 - I/O 阶段:执行上轮循环残留的callback
- idle,perpare
- poll 等待回调
- 执行回调
- 执行定时器
- 如有到期的
setTimeout / setInterval
,则返回timer阶段 - 如有
setTimeout
,则往前check阶段
- 如有到期的
- check
- 执行
setTimeout
- 执行
- close callbacks
跨域
跨域是浏览器的安全策略,在nodejs环境中不存在跨域