1.简介
HTTP协议最初的目的是为了让研究者共享知识信息,所以它的主要作用就是文档传输,它是一种用于传输文档的协议。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写 , 它是基于TCP/IP协议来进行数据传输的, 是一个应用层协议,默认端口号是 80。
2.主要特点
- 简单快速
- 灵活 , HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
- 无连接, 服务器每次只处理一次请求,当前请求处理完成后即断开连接。
- 无状态,HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的
- 支持B/S , C/S 模式
然而,在许多应用场景中,我们需要保持用户登录的状态或记录用户购物车中的商品。由于HTTP是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie。
3.URL
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息,URL全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
URL通常以协议(http(s))开头,包含网络主机名(机名(ximalaya.com)和文档)和文档路径(/foo/oo/mypage.html)等信息)等信息。 URL还可能具有查询参数和锚点标识符。
如:
http://www.baidu.com
https://www.ximalaya.com
https://www.ximalaya.com/yinyue/12521114?boardID=5&ID=24618&page=1#news
4.HTTP报文
用于HTTP协议交互的信息被称为HTTP报文 , 客户端发起的HTTP报文叫请求报文, 服务端的HTTP报文叫响应报文 。
请求报文和响应报文的结构比较类似,他们都有三部分组成:
请求报文: 请求行、请求消息头(header)、请求正文。
GET /wws-library-web/library/scene HTTP/1.1 Host: t: wws.test.ximalaya.com Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Accept: application/json, text/plain, / User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36 Referer: r: http://wws.test.ximalaya.com/wws-workbench/v1/audible/template/detail/2387 Ac Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: _xmLog=xm_1553491937965_jtnwzmwdq13rzw;
响应报文: 响应行、响应消息头、响应正文。
HTTP/1.1 200 OK Server: Tengine Date: Fri, 31 May 2019 06:13:21 GMT Content-Type: application/json;charset=UTF-8 Content-Length: 638 Connection: close x-a1-httpdns-switch: off x-a1-xdcs-collector-switch: on x-a1-front-switch: on access-control-expose-headers: x-a1-front-switch x-a1-xdcs-business-switch: on x-a1-xdcs-all-log-switch: on x-a1-protocol-switch: 0
4.1 请求行
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
格式如下:Method Request-URI HTTP-Version CRLF
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
4.2响应行
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正
4.3消息报头
下面是请求的消息头和响应的消息头字段名称和作用:
通用消息头字段 | 作用(请求头和响应消息头都可能使用) |
---|---|
Cache-Control | 控制缓存的行为:no-cache (强制向服务器再次验证)、 no-store (不做任何缓存)、 max-age=111111 (资源可缓存最大时间 秒)、 public (客户端、代理服务器都可利用缓存)、 private (代理服务器不可用缓存) |
Connection | 浏览器想要优先使用的连接类型: keep-alive close (开启和关闭持久连接) |
Date | 创建报文时间 |
Pragma | 只用于请求报文,客户端要求中间服务器不返回缓存的资源 |
Via | 代理服务器相关信息,每经过一个代理服务器就会添加相关信息,用逗号分割 |
Transfer-Encoding | 传输编码方式:chunked 分块传输 |
Upgrade | 要求客户端使用的升级协议,需配合Connection: Upgrade 一起使用: websocket |
Warning | 缓存相关问题的警告 |
请求头字段 | 作用(请求头报文专用) |
---|---|
Accept | 能正确接收的媒体类型:application/json text/plain |
Accept-Charset | 能正确接收的字符集: unicode-1-1 |
Accept-Encoding | 能正确接收的编码格式列表:gzip deflate |
Accept-Language | 能正确接收的语言列表:zh-cn,zh;1=0.9,en,1=0.8 |
Authorization | 客户端认证信息:Bearer dSdSdFFlsfdjasd123 ,一般存token用 |
Cookie | 发送给服务器的Cookie信息 |
Expect | 期待服务端的指定行为 |
From | 请求方邮箱地址 |
Host | 服务器的域名,用于区分单台服务器多个域名的虚拟主机,是HTTP/1.1唯一必须包含的字段。 |
If-Match | 两端资源标记比较,只有判断条件为真服务端才会接受请求:If-Mach: "123456 ,和服务端文件标记比较 |
If-Modified-Since | 本地资源未修改返回 304(比较时间) |
If-None-Match | 本地资源未修改返回 304(比较标记) |
User-Agent | 客户端信息 |
Max-Forwards | 限制可被代理及网关转发的次数 |
Proxy-Authorization | 向代理服务器发送验证信息 |
Range | 请求某个内容的一部分,配合If-Range 使用 |
Referer | 请求发起页面的原始URI |
TE | 传输编码方式 |
响应消息头 | 作用(响应消息头专用) |
---|---|
Accept-Ranges | 告知客户端服务器是否可接受范围请求,是bytes ,否 none |
Age | 资源在代理缓存中存在的时间 |
ETag | 资源标识,资源发生变化时标识也会发生改变 |
Location | 客户端重定向到某个 URL |
Proxy-Authenticate | 向代理服务器发送验证信息 |
Server | 服务器名字:Apache Nginx |
WWW-Authenticate | 获取资源需要的认证方案 |
Set-Cookie | 需要存在客户端的信息,一般用于识别用户身份 |
字段 | 作用(补充请求报文或响应报文相关信息) |
---|---|
Allow | 资源的正确请求方式:GET HEAD POST |
Content-Encoding | 内容的编码格式:gzip deflate |
Content-Language | 内容使用的语言:zh-CN |
Content-Length | request body 长度(即实体主体的大小): |
Content-Location | 返回数据的备用地址 |
Content-MD5 | Base64加密格式的内容 MD5检验值 |
Content-Range | 响应主体的内容范围 |
Content-Type | 内容的媒体类型 |
Expires | 内容的过期时间 |
Last_modified | 内容的最后修改时间 |
4.4请求正文和响应正文
请求正文也叫着请求体(body),它是客户端提交给服务器的真正内容,比如用户登录时的需要用的用户名和密码,文件上传的数据,注册用户信息时提交的表单信息等等。
响应正文也叫着响应体(body), 它是服务器返回的真正内容,它可以是一个HTML页面,或者是一张图片、一段视频等等。
5.HTTP 请求/响应的步骤:
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,www.ximalaya.com
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、请求数据3部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、响应数据3部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP 连接,客户端被动关闭连接,释放TCP 连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
在浏览器地址栏键入URL,按下回车之后会经历以下流程: 1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址; 2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接; 3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器; 4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器; 5、释放 TCP 连接; 6、浏览器将该 html 文本并显示内容;