文章目录
0x01 什么是HTTP
HTTP是一种超文本传输协议
(Hypertext Transfer Protocol)
超文本:一种可以显示在电脑显示器或电子设备上的文本,现时超文本普遍以电子文档的方式存在,其中的文字包含有可以链接到其他字段或者文档的超链接,允许从当前阅读位置直接切换到超链接所指向的文字。
传输:计算机间关联进行通信,超文本会被解析为二进制数据包,由传输载体(如同轴电缆,电话线,光缆)负责把二进制数据包由计算机终端传输到另一个终端的过程(一般称为请求方和应答方)。
协议:计算机通信之间需要遵守的规则。
总结:HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
0x02 HTTP相关内容和协议
网络模型:根据因特网的协议栈可以分成五层–物理层、链路层、网络层、运输层和应用层。HTTP协议是属于应用层的协议。
- 应用层的信息分组称为报文
- 运输层分组称为报文段
- 网络层负责数据报的传输
- 链路层的分组称为帧
- 物理层传输的是帧中的一个一个比特
CDN:Content Delivery Network,即内容分发网络,应用了HTTP协议里面的缓存和代理技术,代替源站响应客户端的请求。
HTML:超文本标记语言。HTML允许嵌入图像与对象,并且可以用于创建交互式表单,它被用来结构化信息——例如标题、段落和列表等等,也可用来在一定程度上描述文档的外观和语义。HTML的语言形式为尖括号包围的HTML元素(如),浏览器使用HTML标签和脚本来诠释网页内容,但不会将它们显示在页面上。
TCP/IP:TCP全称是Transmission Control Protocol,即传输控制协议,HTTP协议就建立在TCP协议之上;IP协议全称为Internet Protocol,主要用于通信双方的寻址问题,IP协议使用IP地址标识互联网上的计算机,可以类比手机号。
DNS:Domain Name System,域名系统。将域名和IP地址相互映射的一个分布式数据库。
URI/URL:Uniform Resource Identifier,统一资源标识符,资源的身份证。Uniform Resource Locator,统一资源定位符,即网址,属于URI的子集,资源的“身份证上的地址”。(下图URN为资源的名称)
0x03 HTTP报文
HTTP协议三大部分:
- 请求行:描述请求或相应的基本信息
- 头部字段:使用key-value形式更详细地说明报文
- 消息正文:实际传输的数据。可以是纯文本,图片、视频等数据。
起始行和头部字段并成为请求头
或者响应头
,统称为Header
。消息正文也叫做实体(entity),称为body
。Header为必须,body为可选。
GET /dir/index.html HTTP/1.1 起始行(使用了相对URL)
HOST: www.xyz.edu.cn 首部行开始,给出了主机域名
Connection: close 告诉服务器请求完文档即可释放链接
User-agent: Mozilla/5.0 用户使用代理为火狐浏览器
Accept-language: cn 用户希望得到中文版本文档
请求报文最后还有一个空行
HTTP请求的方法:
- GET获取资源,一般请求访问已被URI识别的资源。指定资源经过服务器端解析后返回相应内容。也就是说,如果请求的资源是文本,那就原样返回。
- POST传输实体,虽然GET也可以传输主体信息(body),但是便于区分,一般使用POST请求。
- PUT传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。不带验证机制,存在安全性问题。可配合Web的应用程序验证机制。
- HEAD获得响应首部。和GET方法一样,但是不返回本文主体部分。用于确认URI的有效性及资源更新的日期时间等。
- DELETE删除文件,和PUT相反,按请求的URI删除指定的资源
- OPTIONS询问支持的方法,OPTIONS方法用来查询针对请求URI指定的资源支持的方法。HTTP1.1起支持。
- TRACE追踪路径,让Web服务器端将之前的请求通信环回给客户端的方法。HTTP1.1起支持。
- CONNECT要求用隧道协议连接代理,CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Socket Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经过网络隧道传输。HTTP1.1起支持。
注:熟悉GET和POST,然后其他的有了解即可。
0x04 HTTP版本进化
HTTP 1.0(1996年)
- 提供最基本的认证,用户名和密码未经加密
- 使用短连接,每次发送数据都会经过TCP三次握手,结束后使用四次挥手释放连接。
- 只使用header的If-Modified-Since和Expires作为缓存失效的标准。
- 不支持断点续传,每次传送全部页面和数据。
- 认为每台计算机只能绑一个IP,所以请求消息中的URL并没有传递主机名(hostname)。
HTTP 1.1(1999)
- 使用了摘要算法来进行身份验证
- 默认使用长连接。一次连接,多次传输。长连接时长可以通过请求头中的keep-alive设置。
- 新增E-tag,If-Unmodified-Since,If-Match,If-None-Match等缓存控制头来控制缓存失效。
- 支持断点续传,通过请求头中的Range实现。
- 使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机,并且共享一个IP地址。
HTTP 2.0(2015)
- 头部压缩,HTTP1.1经常出现User-Agent、Cookie、Accept、Server、Range等字段可能占用几百几千字节,body通常只有几十字节。在HTTP2.0使用了
HPACK
算法压缩。 - 二进制格式,HTTP2.0使用更靠近TCP/IP的二进制格式,之前是使用ASCII码。
- 安全性提高,HTTP2.0使用SSL模块加密传输。
- 多路复用,每个请求都用作连接共享。一个请求对一个一个id,一个连接上可以有多个请求。