前言
最近面试总被问到的HTTP相关知识,之前一直一知半解,最近刚好找了《图解HTTP》一书来学习,所以整理了这篇文章。
基本名词概念
HTTP协议 (HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议。
【一句话概述】
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
TCP (Transmission Control Protocol,传输控制协议) 提供可靠的字节流服务(为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理)。可靠是指能将数据准确可靠地传给对方。采用三次握手策略(使用SYN和ACK标志)
UDP (User Data Protocol,用户数据报协议)
IP (Internet Protocol,国际协议) 作用是把各种数据包传送给对方并确保正确传送
DNS (Domain Name System) 提供域名到 IP 地址之间的解析服务,为了保证高可用、高并发和分布式,它设计成了树状的层次结构
web网络基础
HTTP TCP/IP 分别处于网络分层模型中的哪一层,看下面这张图就够了。
网络分层模型
应用层其他协议
HTTP协议
HTTP 协议用于客户端和服务器端之间的通信。
请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。
http版本演化
http 0.9:
最初的版本,于「1990年」问世,只有一个命令GET,服务器只能回应HTML格式字符串。
http 1.0:
于「1996年5月」发布,引入了新的命令POST和HEAD(http数据头部)命令,每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接,头信息是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。
http 1.1:
目前主流版本,「1997年1月」发布,新增方法:PUT、PATCH、OPTIONS、DELETE,引入了持久连接/管道机制。
Http2.0
「2015年5月」发布,HTTP2.0是SPDY(谷歌公司研发的https的一种协议)的升级版
1.头信息和数据体都是二进制,称为头信息帧和数据帧
2.复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工(Multiplexing)
3.引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
4.HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
HTTP的特点
- HTTP协议支持客户端/服务端模式,也是一种请求/响应模式的协议。
- 灵活可扩展:一个是语义上的自由,只规定了基本格式,其它的各部分没有严格的限制;第二个它允许传输任意类型的数据对象,例如文本、图片、音频等,传输的类型由Content-Type加以标记。
- 可靠传输,HTTP 基于 TCP/IP,因此把这一特性继承了下来。
- 无状态,也就是说HTTP请求不具备保存之前发送过的请求或响应的功能,每一次请求都是独立无关的。
- 持久连接:(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive
- 管线化:对于同一个域名,大多数浏览器允许同时建立6个持久连接引入了管道机制,即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
HTTP的缺点
- HTTP/1.1有两个主要的缺点:安全不足和性能不高。
安全问题:明文传输(不加密),内容可能被窃听。无法验证报文的完整性,内容可能被篡改。不验证通信方的身份,有可能遭遇伪装。
性能问题:同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成"队头堵塞"(Head-of-line blocking)
为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接
HTTP和TCP的不同
HTTP的责任是去定义数据,在两台计算机相互传递信息时,HTTP规定了每段数据以什么形式表达才是能够被另外一台计算机理解。 而TCP所要规定的是数据应该怎么传输才能稳定且高效的传递与计算机之间。
TCP和UDP的区别
TCP是一个面向连接的、可靠的、基于字节流的传输层协议。 UDP是一个面向无连接的传输层协议。
TCP为什么可靠
因为它有三次握手来保证双方都有接受和发送数据的能力。
字节流服务:将大块数据分割为以报文段为单位的数据包进行管理
HTTP的请求方法
- GET 获取资源 (幂等)
- POST 新增资源
- HEAD 获取HEAD元数据 (幂等)
- PUT 更新资源 (带条件时幂等)
- DELETE 删除资源 (幂等)
- CONNECT 建立 Tunnel 隧道
- OPTIONS 获取服务器支持访问资源的方法 (幂等)
- TRACE 回显服务器收到的请求,可以定位问题。(有安全风险)
HTTP状态码
状态码的类别
1xx:信息性状态码 接收的请求正在处理
2xx:成功状态码 请求正常处理完毕
3xx:重定向状态码 需要进行附加操作以完成请求
4xx:客户端错误状态码 服务器无法处理请求
5xx:服务器错误状态吗 服务器处理请求出错
常见状态码
200: '请求被正确处理并返回了结果'
201: '新增或修改数据成功'
202: '请求已进入任务队列,被异步处理'
203: '令牌或登录状态失效'
204: '删除数据成功'
301: '请求的资源被永久重定向到新的位置,将从新的地址重新请求'
302: '请求的资源被临时重定向到新的位置'
400: '请求参数错误,服务器没有对数据做新建或修改'
401: '无访问权限,用户名、密码、令牌错误'
403: '得到访问授权,但访问是被禁止'
404: '访问的是不存在的资源'
405: '请求方式不正确'
406: '请求的数据格式不是服务接收的类型'
410: '请求的资源被永久删除'
422: '服务器创建对象时发生错误'
500: '服务器不可用,未返回正确的数据'
502: '服务器网关错误'
503: '服务器过载或维护中'
504: '服务器响应超时'
后语
第一篇就先放这些吧,后面再把其他章节的补上来,如果有不正确的地方,欢迎指出。