HTTP基础知识整理
知识地图
发展历史
- 20世纪60年代 美国国防部高等研究计划署(ARPA)建立了 ARPA 网
- 20世纪70年代,基于ARPA,发明出了TCP/IP协议
- 20世纪80年代,TCP/IP协议被纳入UNIX内核
- 1989年,任职于欧洲核子研究中心(CERN)的蒂姆·伯纳斯 - 李(Tim Berners-Lee)发表了一篇论文,提出了超文本协议的构想,他把这个系统称之为world wide web(万维网),就是我们现在的WEB。其中包含三项核心技术
- URI:即统一资源标识符,作为互联网上资源的唯一身份;
- HTML:即超文本标记语言,描述超文本文档;
- HTTP:即超文本传输协议,用来传输超文本。
- 20世纪90年代初,HTTP0.9诞生,只支持get请求,纯文本内容,只读
- 1993年,NCSA(美国国家超级计算应用中心)开发出了 Mosaic,是第一个可以图文混排的浏览器
- 1996年,HTTP1.0诞生,增加了HEAD、post请求,以及引入了http header概念,增加了响应状态码,增加了版本号概念,内容不再局限于纯文本,但是HTTP1.0不是一个规范,只是一个指引,或者说支持的特性,没有强制性约束,因此未形成统一标准
- 1999年,网景和微软的浏览器大战后,HTTP1.1规范发布,成为了业界标准,增加了以下主要内容:
- 增加了PUT DELETE等方法
- 增加了缓存控制
- 允许持久链接
- 允许请求分块(chunked),利于大文件传输
- 强制要求HOST头,让互联网主机托管成为可能
- 2015年,互联网标准化组织在基于谷歌的SPDY协议,制定了HTTP2协议,主要改动如下:
传输内容变成二进制,不再是纯文本
允许服务器主动向客户端推送数据
但是目前大部分网站使用的还是HTTP1.1协议 - 2018年,基于谷歌QUIC协议的HTTP3已经提上日程,未来可能直接跨过HTTP2,直接普及HTTP3
HTTP 是什么
超文本传输协议
协议
明确参与者的权责
约定内容格式、语法等
约定如何发起、处理、结束,以及各种情况下的处理方式
传输协议
明确这是用于计算机之间传输内容的协议
超文本
超越文本的文本,或者超级文本。
内容不仅限于文字符号,还包含图片、视频等,但对于HTTP来说,都是“文本”
文本中可以含有超链接,通过超链接可以指向其他文本
HTTP相关的几个概念
TCP/IP协议
TCP/IP协议是HTTP的基石, HTTP over TCP/IP
IP协议(Internet Protocol)
规定了互联网设备之间的寻址、路由方式,以及数据包的传输方式。
IP地址是IP协议中重要的部分
TCP协议(Transmission controll protocol)传输控制协议
位于IP协议之上,用于保证传输数据的完整性和可靠性
DNS(Domain name system)域名系统
由于IP地址不便于记忆,因此使用域名
域名系统有多级,如文章开头的图中所示。解析域名时,会逐级查找,类似于查找分级索引
URI/URL
英文缩写 | 英文全称 | 中文描述 |
---|---|---|
URI | uniform resouce identifier | 统一资源标识符,代表每一个具体的图片、某一条数据的唯一标识,由“协议名 + 主机名 + 路径”构成,俗称 URL,但俗称是不严谨的 |
URL | uniform resource locator | 统一资源定位符,是URL的子集,也就是“某一种具体的URI”,除了标识资源外,还提供定位信息 |
HTTPS http over SSL/TLS
SSL/TSL协议
SSL 即secure socket layer(安全套接层协议),发展到3.0时被标准化并更名为TLS,即transport layer security (传输层安全协议),其实是同一个东西,但是习惯性上叫SSL
SSL是在TCP/IP协议上面又套了一层,所以最终HTTPS是
HTTP over SSL/TLS over TCP/IP
PROXY 代理
通俗理解为中介,通常分为几种:
- 匿名代理,隐匿了雇主的信息,对方只知道中介的信息,不知道雇主的信息
- 透明代理,对方即知道中介的信息,又知道后面的雇主的信息
- 正向代理,雇主是请求发起者,即request方,如常用的上网代理软件HAProxy做的就是正向代理
- 反向代理,雇主是服务端,即response方,如常用nginx来做负载均衡,nginx做的就是反向代理
除了普通的中介工作之外,代理还可以实现缓存、压缩传输提高效率、安全保护等功能
TCP/IP协议的四层模型
应用层–传输层–网际层–链接层
- 链接层(link layer)负责传输最原始的数据包,传输的单位是帧(frame),通过mac地址来定位
- 网际层(internet layer)把MAC地址翻译成IP地址,并组成各类网络(如局域网),传输的单位是包(package),通过IP地址来定位(实际上会把IP地址翻译成MAC地址,把package拆成frame,交给链接层)
- 传输层(transport layer)负责保证数据的完整性和可靠性,TCP协议(还有UDP协议,不过跟HTTP无关)就在这一层
- 应用层(Application layer)基于前面的三层,再封装一些面向具体应用的信息的协议。这一层的协议有SSH\SMTP\FTP\TELNET\等
OSI(open system interconnection reference model)开放系统互连通信参考模型
这里有“参考”两个字,说明不是强制的,因为TCP已经在很大程度上成了实际标准,所以国际标准组织(ISO)并没有强制要求将TCP四层模型改成OSI七层模型
- 第一层:物理层,网络的物理形式,例如电缆、光纤、网卡、集线器等等;
- 第二层:数据链路层,它基本相当于 TCP/IP 的链接层;传输基本数据包
- 第三层:网络层,相当于 TCP/IP 里的网际层;使用IP来组网
- 第四层:传输层,相当于 TCP/IP 里的传输层;保障数据传输的可靠性、完整性
- 第五层:会话层,维护网络中的连接状态,即保持会话和同步;
- 第六层:表示层,把数据转换为合适、可理解的语法和语义;
- 第七层:应用层,面向具体的应用传输数据。
与四层模型的映射关系如下图:
四层负载均衡
在第四层传输层上做的负载均衡,通过IP+PORT进行转发
七层负载均衡
在第七层应用层上做的负载均衡,通过IP+PORT+应用的信息(如URL、请求方式等)
HTTP协议栈的工作流程
文本数据—>HTTP协议包装一层HTTP的头信息—>TCP协议包装一层TCP的头信息—>IP协议打上IP头信息—>MAC层大上MAC头信息
—>到达接收方的MAC层,拆包,拆掉MAC头信息—>到达接收方的IP层,拆掉IP头信息—>以此类推,最后目标应用拿到文本数据
域名解析的顺序
浏览器缓存>>操作系统缓存>>HOSTS>>本地DNS>>根DNS>>顶级DNS>>权威DNS,最终返回域名对应的IP
HTTP协议的报文内容
请求报文
- 起始行 (start line) 例如:GET /images/1.jpg HTTP/1.1 包含了请求方法(GET)、URI( /images/1.jpg)、协议版本(HTTP/1.1 )
- 请求头(header)HOST Accept 等,KV形式的信息集合。除了HOST信息之外,其他请求头都是可以为空的
- 空行(CRLF)用于隔开请求头和请求体,空行后面的都会被当做请求体
- 请求体(entity)可为空
响应报文
- 状态行(status line) 例如: HTTP/1.1 401 Unauthorized 包含了协议版本、状态码、状态信息说明
- 响应头(header) Server、Content-Type 等 也是KV形式的信息集合
- 空行(CRLF)用于隔开响应头和响应体,空行后面的都会被当做响应体
- 响应体(body)可为空
状态码
五类状态码
RFC 标准把状态码分成了五类,用数字的第一位表示分类
- 1XX 提示信息,表示请求还没处理完,还需要后续操作
- 2XX 成功,数据已被收到且被正确处理
- 3XX 重定向,告诉客户端一个新的地址,让客户端重新发送请求到新的地址
- 4XX 客户端的请求有错误,服务端无法处理
- 5XX 服务器处理请求时发生了错误
3XX 不同重定向状态码的区别
- 301(Moved permanently)告诉客户端,以后要访问目标资源时,都请访问新地址。浏览器会做缓存,下次会直接访问新地址
- 302(Moved Temporarily) 临时重定向。例如网站维护期间,临时指向维护提示页面。维护完了之后,还是会回到之前的地址
- 304(Not Modified)表示资源没有被修改,可以使用客户端缓存,不需要重新获取(也就是告诉客户端,可以重定向到客户端自己的缓存)
HTTP的请求方法
标准方法
- GET 获取资源
- POST 上传/新增资源
- DELETE 删除资源(不一定是物理删除,由接收者最终决定处理方式)
- PUT 类似POST,一般是修改资源
- HEAD 获取资源的元信息,也就是不要响应体,只要响应头
- TRACE 追踪请求 - 响应的传输路径
- CONNECT 建立连接通道
- OPTIONS 列出可以进行的操作(比如可以进行PUT、DELETE等)
扩展方法
MKCOL、COPY、MOVE、LOCK、UNLOCK、PATCH等等
也可以基于自己的需求,扩展自定义的方法
HTTP的优缺点
- 简单易扩展 请求报文简单,对请求方法、请求内容格式等没有严格的要求,可拓展性非常强。容易上手学习,所以很容易被应用、推广
- 明文传输 便于抓包分析,但是也容易被窃取隐私
- 不安全 由于是明文传输,所以容易被窃取。没有严格的身份认证机制,容易被仿冒,钓鱼等。所以出现了HTTPS
- 性能尚可,但还不够好 由于TCP/IP协议的自身机制,如请求-应答模式,以及3次握手,4次挥手等,导致性能不够好
- 无状态 是优点也是缺点。好处在于,服务器不必保存状态,使得集群部署更容易。坏处在于部分需要状态的应用场景,需要自己实现状态机制