HTTP实用指南 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第9天
1.初识
背景
客户程序想服务器程序发出请求,服务器程序想客户端返回客户索要的万维网文档。
(通俗来讲,类似我们打开浏览器搜索我们想要查找的内容)
同时使用这种方式首先要解决一下几个问题:
- 怎么标志分布在整个因特网上的万维网文档?
- 用什么样的协议来实现万维网上的各种链接?
- 使用不同作者创作的不同风格的万维网文档,都能在因特网上的各种主机上显示出来,同时使用户清楚的知道在什么地方存在这链接?
- 怎么使用户能沟很方便的找到所需要的信息?
基于上述问题对应的解决方法
-
万维网使用统一资源定位符URL (Uniform Resource Locator) 来标志万维网的文档,并且每个文档在万维网中有唯一的URL
-
为解决问题 2 就出现了超文本传输协议HTTP(HyperText Transfer Protorl). HTTP 是应用层协议,他使用tcp 连接进行可靠的传送。
-
为解决问题 3 万维网使用超文本标记语言HTML(HyperText Markup Language), 使得万维网界面的设计者可以很方便的用链接从本页面的某处链接链接到因特网 的任何一个万维网的页面,并能沟在自己的主机屏幕将页面展示出来。
如此用户可以使用搜索工具在万维网上方便的查找所需信息。link
概念
HTTP(超文本传输协议 英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。尽管HTTP 是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。link
特点
HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。link
2.协议分析
报文结构
HTTP 协议的请求报文和响应报文的结构基本相同,由三大部分组成
起始行(start line):描述请求或响应的基本信息;
头部字段集合(header):使用 key-value 形式更详细地说明报文;
消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
这其中前两部分起始行和头部字段经常又合称为“请求头”或“响应头”,消息正文又称为“实体”,但与“header”对应,很多时候就直接称为“body”。
HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个“空行”,也就是“CRLF”,十六进制的“0D0A”link
发展历程
自 1989-1991 年以来,HTTP 已经发生了太多的变化,在保持协议简单性的同时,不断扩展其灵活性。如今,HTTP 已经从一个只在实验室之间交换文件的早期协议进化到了可以传输图片,高分辨率视频和 3D 效果的现代复杂互联网协议。link
3.常见场景
静态资源
静态资源:一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件,返回给客户端,客户端解析并渲染显示出来。
静态资源部署,如何优化?link
静态资源方案:缓存+CDN+文件名hash
- CDN Content Delivery Network
- 通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务
登陆
前端有何优化登录link
- Cookie + Session 登录
- Token 登录
- SSO 单点登录
- OAuth 第三方登录
4.实际应用
浏览器与node中使用
AJAX之XHR
Asynchronous JavaScript + XML(异步JavaScript和XML), 能够让网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。link
AJAX之Fetch
- XMLHttpRequeti的升级版
- 使用Promise
- 模块化设计,Response,Request,Header对象
- 通过数据流处理对象,支持分块读取
标准库:HTTP/HTTPS
- 默认模块,无需安装其他依赖
- 功能有限/不是十分友好
常用的请求库:axios
- 支持浏览器、nodejs环境
- 丰富的拦截器
网络优化
- CDN是否开启H2的性能对比数据参考
稳定性
- 重试是保证稳定的有效手段,但要防止加剧恶劣情况
- 缓存合理使用,作为最后一道防线
5.了解更多
不止HTTP协议一个选择
WebSocket
- 浏览器与服务器进行全双工通讯的网络技术
- 典型场景:实时性要求高,例如聊天室
- URL使用WS:/或wSs:/等开头
- WebSocket 教程
QUIC
QUIC 是 Quick UDP Internet Connections 的缩写,谷歌发明的新传输协议link
- 0RTT建联(首次建联除外)
- 类似TCP的可靠传输
- 类似TLS的加密传输,支持完美前向安全
- 用户空间的拥塞控制,最新的BBR算法
- 支持h2的基于流的多路复用,但没有TCP的HOL问题
- 前向纠错FEC
- 类似MPTCP的Connection migration