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还可能具有查询参数和锚点标识符。
    如:

    1. http://www.baidu.com
    2. https://www.ximalaya.com
    3. 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字符)

    请求方法(所有方法全为大写)有多种,各个方法的解释如下:

    1. GET 请求获取Request-URI所标识的资源
    2. POST Request-URI所标识的资源后附加新的数据
    3. HEAD 请求获取由Request-URI所标识的资源的响应消息报头
    4. PUT 请求服务器存储一个资源,并用Request-URI作为其标识
    5. DELETE 请求服务器删除Request-URI所标识的资源
    6. TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
    7. CONNECT 保留将来使用
    8. OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

    HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。

    4.2响应行

    状态行格式如下:

    1. HTTP-Version Status-Code Reason-Phrase CRLF
    1. 其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
    2. 状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
    1. 1xx:指示信息--表示请求已接收,继续处理
    2. 2xx:成功--表示请求已被成功接收、理解、接受
    3. 3xx:重定向--要完成请求必须进行更进一步的操作
    4. 4xx:客户端错误--请求有语法错误或请求无法实现
    5. 5xx:服务器端错误--服务器未能实现合法的请求
    1. 常见状态代码、状态描述、说明:
    1. 200 OK //客户端请求成功
    2. 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
    3. 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    4. 403 Forbidden //服务器收到请求,但是拒绝提供服务
    5. 404 Not Found //请求资源不存在,eg:输入了错误的URL
    6. 500 Internal Server Error //服务器发生不可预期的错误
    7. 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 文本并显示内容;