请求行 { 请求方法(get/post等)+ URL + 协议版本号 } + 头部 { 按照规范,根据自己需要来选择性添加 } + 包体 { 即数据内容,post请求时,这部分才有数据;get请求时,数据附在URL参数里,格式为【URL?参数名=参数值】 }2.响应报文格式
状态行 { 协议版本号 + 状态码 + 状态码说明 } + 头部 { 按照规范,根据自己需要来选择性添加 } + 包体 { 一般为服务端返回给客户端的数据 }#一、请求报文
结构构成:请求行 + 请求头部 + 请求数据1.请求行 = 请求方法字段 + URL字段 + HTTP协议版本字段 ##.请求方法
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETe、OPTIONS、TRACE、CONNECT。GET和POST是最常用的请求方法。
&&. GET请求 使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。这种方式不适合传送私密数据。 GET方式的请求一般不包含”请求数据”部分。 由于不同的浏览器对地址的字符限制也有所不同,长度一般不能超过4KB,所以如果需要传送大量数据的时候,也不适合使用GET方式。 &&. POST请求 POST方式对传送的数据大小没有限制, 可以允许客户端给服务器提供信息较多。 POST方法将请求参数封装在HTTP请求数据中,不会显示在URL中。##.URL
URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。 组成:<协议>://<主机>:<端口>/<路径> 端口和路径有事可以省略(HTTP默认端口号是80,Https默认端口443)##.HTTP协议版本字段
指定使用的Http协议版本 HTTP/1.1的优化 长连接 : 在HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。因此最好能维持一个长连接,可以用个长连接来发多个请求。HTTP1.1起,默认使用长连接 ,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。 HTTP2.0的优化 使用二进制格式传递数据:HTTP1.x的解析是基于文本, 传输的是一堆ASCII码串 。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。 多路复用:在同一个TCP连接中,同一时刻可以发送多个请求和响应,下一次的请求不需要等待上一个响应来之后再发送。但响应的顺序是不变的,FIFO(先进先出)。2.0之前是同一个连接只能用一次, 如果开启了keep-alive,虽然可以用多次,但是同一时刻只能有一个HTTP请求。 HTTP2.0的多路复用主要是指:因为http2.0的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。 header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用HPACK算法对header的数据进行压缩,避免了重复header的传输,又减小了需要传输数据的大小,基本原理是客户端和服务端分别缓存一份索引表,如果头部存在于索引表,则用对应的索引值;否则进行霍夫曼编码,并加入索引表。##2.请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。请求头部通知服务器有关于客户端请求的信息。常见头部字段:
Cache-Control 控制缓存的行为,一般包括一个“max-age=3400”的值,代表缓存的有效时间为资源返回后的3400秒之内 Connection 逐跳首部、连接的管理。如果值为其他字段的名字,代表代理服务器转发时将 Accept 用户代理可处理的媒体类型 Accept-Charset 优先的字符集 Accept-Encoding 优先的内容编码 Authorization Web认证信息 Expect 期待服务器的特定行为 From 用户的电子邮箱地址 Host 请求资源所在的服务器主机名/域名 If-Match 比较实体标记(Etag) If-Modified-Since 比较资源的更新时间,出现在条件get请求中 If-None-Match 比较实体标记(与If-Match相反) If-Range 资源未更新时发送实体Byte的范围请求 If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反) Max-Forwards 最大传输逐跳数 Proxy-Authorization 代理服务器要求客户端的认证信息 Range 实体的字节范围请求 Referer 请求中URI的原始获取方 TE 传输编码的优先级 User-Agent HTTP客户端程序的信息。如果是浏览器则是对应浏览器的用户代理字符串
空行 请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。##3.请求数据
请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最长使用的请求头部是Cntent-Type和Content-Length#二.响应报文
HTTP响应报文 = 状态行(status line) + 响应头部(headers) + 响应数据(也叫响应体或响应正文)(response body)##1.状态行
状态行 = 协议版本 + 状态码 + 状态码描述。 其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。
HTTP状态码 状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示: 1xx:表示服务器已接收了客户端请求,客户端可继续发送请求; 2xx:表示服务器已成功接收到请求并进行处理; 3xx:表示服务器要求客户端重定向; 4xx:表示客户端的请求有非法内容; 5xx:表示服务器未能正常处理客户端的请求而出现意外错误;##2.响应头部
常见响应头部及描述如下: Cache-Control 控制缓存的行为,一般包括一个“max-age=3400”的值,代表缓存的有效时间为资源返回后的3400秒之内 Connection 逐跳首部、连接的管理。如果值为其他字段的名字,代表代理服务器转发时将不再携带该字段。如果值为close或Keep-Alive则分别表示连接为短/长连接 Accept-Ranges 是否接受字节范围请求 Age 推算资源创建经过时间 ETag 资源的匹配信息 Location 令客户端重定向至指定URI Proxy-Authenticate 代理服务器对客户端的认证信息 Server HTTP服务器的安装信息 Vary 代理服务器缓存的管理信息 WWW-Authenticate 服务器对客户端的认证信息
##3.响应体空行
响应头部的最后会有一个空行,表示响应头部结束,接下来为响应数据。与请求报文一致。
用于存放需要返回给客户端的数据信息。#头部字段补充说明 HTTP首部字段类型分为四种:
1、通用首部字段(General Header Feilds) 即请求报文和响应报文双方都会使用的首部 2、请求首部字段(Request Header Fields) 从客户端向服务器发送请求时使用的首部。补充了请求的附加内容、客户端信息、响应内容想关优先级等信息。 3、响应首部字段(Response Header Fields) 从服务器向客户端返回响应时使用的首部。补充了相应的附加内容 4、实体首部字段(Entity Header Fields) 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。 注意:仍然是报文的头部字段,只是针对报文数据体作相关说明,并不会存储在报文数据体里。以下为HTTP/1.1所有头部字段
1.通用头部字段 Cache-Control 控制缓存的行为,一般包括一个“max-age=3400”的值,代表缓存的有效时间为资源返回后的3400秒之内 Connection 逐跳首部、连接的管理。如果值为其他字段的名字,代表代理服务器转发时将不再携带该字段。如果值为close或Keep-Alive则分别表示连接为短/长连接 Date 创建报文的日期时间 Pragma 报文指令。是HTTP/1.1之前版本的遗留字段,仅作为与HTTP/1.0的向后兼容而定义 Trailer 报文末端的首部一览 Transfer-Encoding 指定报文主体的传输编码方式 Upgrade 升级为其他协议 Via 代理服务器的相关信息。报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发,目的是追踪请求和响应报文的传输路径 Warning 错误通知 2.请求头部字段 Accept 用户代理可处理的媒体类型 Accept-Charset 优先的字符集 Accept-Encoding 优先的内容编码 Authorization Web认证信息 Expect 期待服务器的特定行为 From 用户的电子邮箱地址 Host 请求资源所在的服务器主机名/域名 If-Match 比较实体标记(Etag) If-Modified-Since 比较资源的更新时间,出现在条件get请求中 If-None-Match 比较实体标记(与If-Match相反) If-Range 资源未更新时发送实体Byte的范围请求 If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反) Max-Forwards 最大传输逐跳数 Proxy-Authorization 代理服务器要求客户端的认证信息 Range 实体的字节范围请求 Referer 请求中URI的原始获取方 TE 传输编码的优先级 User-Agent HTTP客户端程序的信息。如果是浏览器则是对应浏览器的用户代理字符串 3.响应头部字段 Accept-Ranges 是否接受字节范围请求 Age 推算资源创建经过时间 ETag 资源的匹配信息 Location 令客户端重定向至指定URI Proxy-Authenticate 代理服务器对客户端的认证信息 Server HTTP服务器的安装信息 Vary 代理服务器缓存的管理信息 WWW-Authenticate 服务器对客户端的认证信息 4.实体头部字段 Allow 资源可支持的HTTP方法 Content-Encoding 实体主体适用的编码方式 Content-language 实体主体的自然语言 Content-length 实体主体的大小(单位:字节) Content-MD5 实体主体的报文摘要 Content-Range 实体主体的位置范围 Content-Type 实体主体的媒体类型 Expires 实体主体过期的日期时间 Last-Modified 资源的最后修改日期时间(声明:部分图片引用自网络,侵删!)



