HTTP协议是一种规范,制定了从客户端到服务端等一系列运作的流程(读书笔记)
介绍
HTTP协议(HyperText Transfer Protocal,通俗叫做超文本传输协议,严谨译名为超文本转移协议),是Web的一种规范,完成从客户端到服务器端一系列的运作流程规范。
诞生
1989年3月,HTTP诞生。
最初,CERN(欧洲核子研究组织)的蒂姆·博纳斯-李(Tim BernersLee)博士提出了一种能让远隔两地的研究者们共享知识的设想。
基本理念是:借助多文档之间关联形成的超文本,连成可相互参阅的WWW(World Wide Web,万维网)
现在已提出了3项WWW构建技术:
- HTML(HyperText Markup Launguage,超文本标记语言):把SGML(Standard Generalized Markup Launguage,标准通用标记语言)作为页面的文本标记语言。
- HTTP:作为文档传递协议的HTTP
- URL(Uniform Resource Locator,统一资源定位符):制定文档所在地址
WWW(World Wide Web,万维网),是Web浏览器当年用来浏览超文本的客户端应用程序的名称,现在用来表示这一些列的集合,简称为Web。
成长
1990年11月,CERN成功研发了世界上第一台Web服务器和Web浏览器。
1992年9月,日本第一个网站的主页上线http://www.ibarakiken.gr.jp/www。
1993年1月,现代浏览器的祖先NCSA(National Center For Supercomputer Applications,美国国家超级计算机应用中心)研发的Mosaic 问世了,以内联形式显示HTML图像。
1994年12月,网景通信公司发布了Netscape Navigator 1.0
1995年,微软公司发布Internet Explorer 1.0和2.0
HTTP版本
HTTP/0.9
HTTP1.0之前的版本,于1990年问世,还不是标准
HTTP/1.0
1996年5月正式作为标准,命名为HTTP/1.0,记载为RFC1945
HTTP/1.1
1997年1月公布,作为目前主流的HTTP协议版本。记载为RFC2068,后修订为RFC2616.
HTTP/2.0
下一代的HTTP协议
HTTP、DNS、TCP、IP的互相运作过程
以客户端发送一个Web页面的HTTP请求为例:
- 客户端发送请求,域名是yuming.cn,DNS通过域名找出其IP地址
- 应用层的HTTP协议生成针对目标Web服务器的HTTP请求报文
- 传输层的TCP协议,为了方便通信,把HTTP报文分割成报文段
- 网络层的IP协议,搜索对方的地址,一边中转一边传送,中间可能会经过多台路由器
- 找到后Web服务器后,传输层的TCP协议根据序号重组报文段
- 应用层的HTTP协议处理请求,同样利用TCP/IP通信协议回传结果
HTTP协议
HTTP协议规定了客户端和服务端通信的规范,通过请求和响应达成通信的目的。
客户端会发给服务器请求报文,服务器会返回响应报文
请求报文
响应报文
特点:无状态
HTTP是不保存状态,无状态的协议,不对通信状态进行保存。
HTTP方法
HTTP方法的作用是告知服务器请求意图。
- GET:获取资源
- POST:传输实体主体
- PUT:传输文件,要求在请求报文中的主体中包含有文件内容,然后保存到请求URI指定的位置(由于其不带验证机制,存在安全问题,一般不使用)
- HEAD:获取报文首部,不返回报文主体,用于确认URI的有效性及资源更新的日期时间。
- DELETE:删除文件,与PUT相反的方法,同PUT一样不带验证机制。
- OPTIONS:询问支持,用来查询针对请求URI指定的资源支持的方法,客户端查询其支持哪些方法,服务端会返回其支持的方法
- TRACE:追踪路径,让服务器将之前的请求通信环返回给客户端(容易引发XST(Cross-Site Tracing,跨站追踪))
- CONNECT:要求用隧道协议连接代理,主要使用SSL(Secure Sockets Layer,安全套阶层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
持久链接
通常HTTP请求在每次请求之后都会断开TCP链接(握手断开),会增加通信开销。
为了解决通信开销的问题,有了持久链接(HTTP Persistent Connections,也成为HTTP keep-alive),主要为了建立1次TCP链接后可以进行多次请求和响应交互。减少TCP连接的重复建立和断开造成的额外开销。
特点:只要任意一段没有明确断开链接,就保持TCP链接状态。
管线化:持久连接让请求可以管线化发送,即并发发送,不用等到响应后再发送。
Cookie进行状态管理
Cookie技术是通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
过程:
- 客户端发出请求
- 服务器生成Cookie,标识发请求的客户端,然后把Cookie放在Set-Cookie字段中返回
- 客户端发现了Set-Cookie字段,保存Cookie,再次发送时,在请求中带上Cookie字段。
- 服务器接受到请求中有Cookie,检查记录,确认后返回信息
HTTP报文
HTTP报文:用于HTTP协议交互的信息,由多行数据构成的字符串文本。(用CR+LF换行)
请求报文:客户端发送的HTTP报文
响应报文:服务端返回的HTTP报文。
HTTP报文结构
有四种首部:
- 通用首部
- 请求首部
- 响应首部
- 实体首部
编码
传输数据时编码,可以提升传输数据。
1、内容编码:指明应用在实体内容上的编码格式,并压缩。
常用内容编码:
- gzip (GNU zip)
- compress (UNIX系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
2、分块传输编码(Chunked Transfer Coding)
在传输大容量数据时,通常把数据分割多块,让浏览器逐步显示
实体主体分成的部分叫做块,每一块用十六进制标记块的大小,最后一块用“0(CR+LF)”标记
发送多种类型数据集合
多部分对象集合:包含了不同类型数据的集合
通常是在图片或文本文件上传时使用。
HTTP报文使用多部分对象集合需要增加首部字段:Content-type
多部分对象集合包含的对象:
-
multipart/form-data:Web表单文件上传时使用
表单文件上传 - multipart/byteranges:部分内容
划分实体的标识:boundary字符串。在各个实体的起始行之前插入“--xx”标记,在最后一个实体上加上“--xx--”标记结束。
范围请求
背景:需要可恢复的机制进行恢复请求或者续传。
范围请求:制定范围发送的请求。
首部字段:
- Range,制定资源的byte范围。
- Content-type:multipart/byteranges
实例: - 5001~10000字节:Range:bytes=5001-10000
- 从5001之后全部:Range:bytes=5001-
- 从一开始到3000,和5000~10000:Range:bytes=-3000,5000-10000
响应状态:206(Partial Content)
内容协商
内容协商就是客户端和服务器就响应的资源内容进行交涉,然后服务器提供给客户端合适的资源。
判断依据:语言、字符集、编码方式
判断基准:某些首部字段
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
协商类型:
1、服务器驱动协商:服务器自动根据首部协商
2、客户端驱动协商:用户从浏览器显示的可选列表中手动选择
3、透明协商:服务器和客户端驱动结合
HTTP状态码
状态码 = 3位状态数字+原因短语
类别
2xx 成功
- 200 OK:请求正常处理
- 204 No Content:请求处理成功,不返回资源
- 206 Partial Content:请求一部分资源
3xx重定向
表明浏览器需要执行某些特殊的处理来正确处理请求
- 301 Moved Permanently:永久性重定向
- 302 Found:临时性重定向
- 303 See Other:表示请求对应的资源存在另一个URI,应该用GET方法获取请求资源
- 304 Not Modifined:允许访问资源,但是资源不符合条件请求(一些条件首部)
- 307 Temporary Redireect : 临时重定向,
4xx客户端错误
- 400 Bad Request :请求报文中存在语法错误
- 401 Unauthorized:请求需要通过认证
- 403 Forbidden:请求被服务器拒绝(没有权限等)
- 404 Not Found:找不到
5xx服务器错误
- 500 Internal Server Error:服务器执行请求时错误
- 503 Service Unavailable:服务器超负载或正在维护,无法处理请求
Web服务器
通信数据转发程序:代理、网关、隧道
通信数据转发程序,是程序或者服务器,可以转发请求
- 代理:有转发功能的应用程序,不改变请求URI,每次经过代理服务器时会修改Via首部,表示经过了那些代理服务器。
使用理由:利用缓存技术减少网络带宽,针对特定网站进行访问控制
使用方法:(判断标准:是否使用缓存,是否修改报文)- 缓存代理:转发时会先把资源副本保存在代理服务器,再次受到请求时直接返回缓存
- 透明代理:转发时不做任何加工,加工的叫做非透明代理
- 网关:转发其他服务器数据的服务器
使用理由:可以利用网关转化为其他协议通信,可以提高通信安全 - 隧道:在相隔很远的客户端和服务器之间进行中转,保持双方通信连接的应用程序。
缓存
缓存是代理服务器或者客户端本地磁盘保存的资源副本,利用缓存可以减少对源服务器的访问,节省通信流量和通信时间
HTTP首部
HTTP首部字段是构成HTTP报文的要素之一,
类型
HTTP 首部字段根据实际用途被分为以下 4 种类型
-
通用首部字段:请求报文和响应报文都会使用的首部
通用首部 -
请求首部字段:请求报文使用
请求首部 -
响应首部字段:响应报文使用
响应首部 -
实体首部字段:针对实体部分使用的首部,补充了资源内容更新时间等于实体有关的信息
实体首部
非HTTP/1.1首部字段
- Cookie
- Set-Cookie
根据缓存代理分类
- 端到端首部(End-to-end Header):会转发给请求、响应对应的最终接受目标,而且必须保存在缓存,必须被转发
- 逐跳首部(Hop-by-hop Header):只对单词转发有效,会因通过缓存或代理而不再转发,除以下首部外,其他都是端到端首部
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
通用首部字段
-
Cache-Control:控制缓存行为,参数可选,多个指令之间用“,”分隔
缓存请求指令:
缓存请求指令
缓存响应指令:
image.png Connection:作用:控制不再转发给代理的首部字段或者管理持久连接
指令:
1、Connection:不再转发的首部字段名
2、Connection:Close:HTTP/1.1版本的链接默认是持久连接,服务器想明确断开链接时发送
3、Connection:Keep-Alive:想要在旧版本(HTTP/1.0,旧版本不是默认持久连接)上维持持久连接时发送
请求首部字段
- Accept:通知服务器用户代理能够处理的媒体类型和优先级
媒体类型:- 文本文件
text/html,text/plain,text/css
application/xhtml+xml - 图片文件
image/jped,image/gif - 视频文件
video/mpeg,video/quicktime - 应用程序使用的二进制文件
application/octet-stream,application/zip
- 文本文件