HTTP 和 TCP 的关系

HTTP 是在 TCP 传输协议上层的应用层协议,主要解决 Web 端的数据传输并对 TCP 传输的数据进行包装和拆解,关于 TCP/IPHTTP 协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP 协议,但是如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议。应用层协议有很多,比如 HTTPFTPTELNET 等,也可以自己定义应用层协议,Web 使用 HTTP 协议作应用层协议,以封装 HTTP 文本信息,然后使用 TCP/IP 做传输层协议将它发到网络上”。

HTTP 协议和 TCP 协议

HTTP 访问到服务器的过程

从在浏览器中输入一个网址直到请求到达服务器的过程中如下图:


HTTP 协议访问服务器流程
HTTP 协议访问服务器流程


长连接

HTTP1.0 版本中,每一个请求都需要在 TCP 协议中经历 “三次握手四次挥手”,在 HTTP1.1 中有了长连接,这个问题得到了改善,可以通过创建的一次 TCP 连接,对短时间内连续请求响应进行传输通道的复用,结束后关闭 TCP 连接。

HTTP1.0 版本:


HTTP1.0 版本
HTTP1.0 版本


HTTP1.1 长连接版本:


HTTP1.1 版本
HTTP1.1 版本


管线化

在不同的浏览器中对于访问同一个域名,都有一个最大的请求数限制,数量大小因浏览器而异,如果请求数量大于最大请求数限制,则需要排队等待其他请求结束。

管线化技术,在超出最大请求数限制,客户端继续发送请求到服务端,而不需要其他请求得到响应的时候才能进行,实现并行发送请求,CDN 是比较典型的解决方式,将静态资源分发到不同 ip 下的服务器,请求资源是通过不同的代理服务器去同时获取,可以提高页面初始化响应的速度。


HTTP 管线化
HTTP 管线化


URI 和 URL

  • URI:是统一资源标识符,在某个规则下能把这个资源独一无二标示出来,类似人的身份证号;
  • URL:统一资源定位符,表示资源的地点,是 URI 的特例,也是使用浏览器访问 Web 页面时输入的地址。

URL 的组成:

http://username:password@www.pandashen.com:80/2018/07/09/index.html?uid=1&name=panda#ch1

  • http:协议类型;
  • username:password:登录信息(如 Github,不安全);
  • www.pandashen.com:服务器地址(与前面用 @ 连接);
  • 80:服务器端口号(与前面用 : 连接);
  • /2018/07/09/index.html:带层次的文件路径;
  • uid=1&name=panda:查询字符串(与前面用 ? 连接);
  • ch1:片段标识符(hash 值,与前面使用 # 连接)。

HTTP 的组成

请求的一方叫客户端,响应的一方叫服务器端,通过请求和响应达成通信,HTTP 是一种无状态的协议。

请求报文

请求报文包含请求行、请求首部和请求体三个部分。


请求报文
请求报文


请求行由三个部分组成,并写在同一行,分别为请求方法、请求路径(域名和端口号后面的部分)和协议/版本号。

请求方法:

  • GET:获取资源
  • POST:向服务器端发送数据,传输实体主体
  • PUT:传输文件
  • HEAD:获取报文首部
  • DELETE:删除文件
  • OPTIONS:询问支持的方法
  • TRACE:追踪路径

追踪路径方式如下图:


TRACE 追踪路径
TRACE 追踪路径


请求体内的内容为向服务端发送的数据,首部分为通用首部、请求首部、响应首部和实体首部四种,在后面详细说明。

响应报文

响应报文同样包含三个部分,响应行、响应首部和响应体。


响应报文
响应报文


响应行由三个部分组成,并写在同一行,分别为协议/版本号、状态码和状态码原因短语。

注意:在请求首部与请求体之间、在响应首部与响应体之间都应该空一个空行。

HTTP 响应状态码

状态码负责表示客户端请求的返回结果、标记服务器端是否正常、通知出现的错误。

状态码类别

类别原因短语
1XXInformational(信息性状态码)
2XXSuccess(成功状态码)
3XXRedirection(重定向)
4XXClient Error(客户端错误状态码)
5XXServer Error(服务器错误状态吗)

常见状态码

成功

状态码原因短语原因解释
200OK客户端发过来的数据被正常处理
204Not Content正常响应,没有实体
206Partial Content范围请求,返回部分数据,响应报文中由 Content-Range 指定实体内容

重定向

状态码原因短语原因解释
301Moved Permanently永久重定向
302Found临时重定向,规范要求方法名不变,但是都会改变成 GET
303See Other和 302 类似,但必须用 GET 方法
304Not Modified状态未改变,配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
307Temporary Redirect临时重定向,不该改变请求方法

客户端错误

状态码原因短语原因解释
400Bad Request请求报文语法错误
401Unauthorized需要认证
403Forbidden服务器拒绝访问对应的资源
404Not Found服务器上无法找到资源

服务器错误

状态码原因短语原因解释
500Internal Server Error服务器故障
503Service Unavailable服务器处于超负载或正在停机维护

HTTP 首部

HTTP 首部字段是 HTTP 报文首部的重要部分,在客户端和服务器进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。

HTTP 首部主要分为通用首部、请求首部、响应首部和实体首部四种:

  • 通用首部字段:请求和响应报文两方都会使用的首部字段;
  • 请求首部字段:从客户端向服务器发送请求报文时使用的首部字段,补充了请求的附加内容,客户端信息,响应内容相关优先级等信息;
  • 响应首部字段:从服务器向客户端返回响应报文时使用的首部字段,补充了响应的附加内容,也会要求客户端附加额外的内容信息;
  • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容的更新时间等与实体有关的信息。

通用首部字段

首部字段名说明
Cache-Control控制缓存行为
Connection链接的管理
Date报文日期
Pragma报文指令
Trailer报文尾部的首部
Trasfer-Encoding指定报文主体的传输编码方式
Upgrade升级为其他协议
Via代理服务器信息
Warning错误通知

请求首部字段

首部字段名说明
Accept用户代理可处理的媒体类型
Accept-Charset优先的字符集
Accept-Encoding优先的编码
Accept-Langulage优先的语言
AuthorizationWeb 认证信息
Expect期待服务器的特定行为
From用户的电子邮箱地址
Host请求资源所在的服务器
If-Match比较实体标记
If-Modified-Since比较资源的更新时间
If-None-Match比较实体标记
If-Range资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since比较资源的更新时间( 与 If-Modified-Since相反 )
Max-Forwards最大传输跳数
Proxy-Authorization代理服务器需要客户端认证
Range实体字节范围请求
Referer请求中的URI的原始获取方
TE传输编码的优先级
User-AgentHTTP 客户端程序的信息

响应首部字段

首部字段名说明
Accept-Ranges是否接受字节范围
Age资源的创建时间
ETag资源的匹配信息
Location客户端重定向至指定的 URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After再次发送请求的时机
Server服务器的信息
Vary代理服务器缓存的管理信息
www-Authenticate服务器对客户端的认证

实体首部字段

首部字段名说明
Allow资源可支持的 HTTP 方法
Content-Encoding实体的编码方式
Content-Language实体的自然语言
Content-Length实体的内容大小(字节为单位)
Content-Location替代对应资源的 URI
Content-MD5实体的报文摘要
Content-Range实体的位置范围
Content-Type实体主体的媒体类型
Expires实体过期时间
Last-Modified资源的最后修改时间

总结

本篇重点介绍关于 HTTP 协议的一点基础知识,关于请求、响应以及报文对应的信息及内容,也可以用作查询使用。