(一)HTTP-基础篇

组成

HTTP协议的核心部分是其传输的报文内容,
HTTP协议的请求报文和响应报文的结构基本相同:

  • 起始行(start line):描述请求或响应的基本信息;
  • 头部字段集合(header):使用key-value形式更详细的说明报文。
  • 消息正文(entity):实际传输的数据,不一定是纯文本,可以是图片,视频等二进制数据。

HTTP协议规定报文必须有header,但可以没有body,而且在header之后必须有一个“空行”。
(一)HTTP-基础篇
在上图浏览器发出的请求报文中,第一行“GET /HTTP/1.1”即为请求行,后面的“host” “connection”等属于header,报文的最后是一个空白行,没有body。

请求行

请求报文的起始行即请求行,其简要地描述了客户端想要如何操作服务端的资源。
请求行的组成部分:

  • 请求方法:GET/POST 表示对资源的请求。
  • 请求目标:通常是一个URI,标记请求方法要操作的资源。
  • 版本号:表示报文使用的HTTP协议版本。
    上述三部分通常使用空格来分隔最后使用CRLF换行表示结束。
    (一)HTTP-基础篇
    例如:GET / HTTP/1.1

状态行

服务器响应的状态

  • 版本号:表示报文使用的HTTP协议版本
  • 状态码:表示处理的结果
  • 原因:作为数字状态码的补充,更详细的解释文字。
    (一)HTTP-基础篇
    HTTP/1.1 200 OK

头部字段

请求行或者状态行再加上头部字段集合构成了HTTP报文里完整的请求头或者响应头。
(一)HTTP-基础篇
(一)HTTP-基础篇
Host字段,属于请求字段,只能出现在请求头里,该字段告诉服务器这个请求应该由哪个主机来处理。
User-Agent请求字段,使用字符串描述发起HTTP请求的客户端,服务器可以依据其来返回最合适此浏览器显示的页面。
Date字段:出现在响应头里,表示HTTP报文创建的时间,客户端可以使用这个时间啊搭配其他字段决定缓存策略。
Server字段:响应字段,告诉客户端当前正在提供web服务的软件名称和版本号。

HTTP请求方法

  • GET:获取资源,读取或下载数据
  • HEAD:获取资源的元信息
  • POST:向资源提交数据,写入或上传数据
  • PUT:类似POST
  • DELETE:删除资源
  • CONNECT:建立特殊的连接隧道
  • OPTIONS:列出可对资源实行的方法,在响应头的Allow字段里返回
  • TRACE:追踪请求-响应的传输路径

安全
在HTTP协议里,安全是指请求方法不会“破坏”服务器上的资源,即不会对服务器上的资源造成实质的修改。所以只有GET/HEAD方法是安全的,

幂等
幂等意思是多次执行相同的操作,结果都是相同的。HEAD/GET既是安全的也是幂等的,DELETE可以多次删除同一个资源,返回均是资源不存在,所以也是幂等的。

状态码

1**:提示信息,表示目前是协议处理的中甲状态,仍需后续操作
2**:成功,报文已经收到并被正确处理
3**:重定向,资源位置发生变动,需要客户端重新发送请求
4**:客户端错误,请求报文有误,服务器无法处理
5**:服务器错误,服务器在处理请求的时候内部发生了错误

  • 200 OK :表示一切正常
  • 204 No Content:成功状态码,但是响应头后没有body数据。
  • 206 Partial Content:HTTP分块下载或断定续传的基础,在客户端发送“范围请求”,要求获取资源的部分数据时出现,服务器成功处理的请求,body里的数据不是资源的全部,只是其中一部分。
  • 301 moved Permanently:永久重定向,请求的资源已经不存在。
  • 302 Moved Temporarily:临时重定向。
  • 304 Not Modfied:资源未修改,用于缓存控制,
  • 400 Bad Request:请求报文有误
  • 403 Forbidden:服务器禁止访问资源
  • 404 Not Found:资源在本服务器上未找到
  • 405 Method Not Allowed :不允许使用某些方法操作资源
  • 406 Not Acceptable:资源无法满足客户端请求的条件。
  • 408 Request Timeout:请求超时
  • 409 Conflict:多个请求发生冲突
  • 413 Request Entity Too Large:请求报文里的body太大。
  • 414 Request-URI Too Long:请求里的URI太长
  • 429 Too many Requests:客户端发送了太多请求,通常由于服务器的限制连接策略
  • 431 Request Header Feilds Too Large:请求头某个字段或者总体太大。
  • 500 Internal sever Error:服务器错误
  • 501 Not Implemented:对客户端的请求的功能不支持
  • 502 Bad Gateway:服务器作为网关或者代理时返回的错误码,
  • 503 Service Unavailable:服务器当前很忙,暂时无法响应服务。

HTTP特点

  1. 灵活可扩展
  2. 可靠传输:HTTP协议基于TCP/IP,TCP本身是一个可靠的传输协议,HTTP能够在请求方和应答方之间可靠的传输数据。
  3. 应用层协议:HTTP可以携带任意头字段和实体数据的报文结构以及连接控制、缓存代理等方便易用的特性,HTTP几乎可以传递一切东西,
  4. 请求-应答通信模式:永远是请求方先发起连接和请求,是主动的,而且应答方只有在收到请求后才能答复,是被动的,
  5. 无状态:状态是客户端或者服务器里保存的一些数据或者标志,记录了通信过程中的一些变化信息。TCP协议是有状态的。

如果要100%保证数据收发成功,就不能使用HTTP或者TCP协议,而是需要使用各种消息中间件(MQ)如:kafka RabbitMQ等
在HTTP/1.1中默认启用keepalive长连接机制,

HTTP的实体数据

  • Accept:字段标记客户端可以理解的MIME type,可以使用“,”作为分隔符列出多个类型

  • Accept-Encoding:请求报文,标记客户端支持的压缩格式,没有则表示不支持压缩数据

  • Accept-Language:请求报文,标记了客户端可以理解的自然语言

  • Accept-Charset:请求头字段中字符集,响应头中在Content-Type字段的数据类型后面使用“charset=xxx”来表示。

  • Content-Type:响应报文表述实体数据的真实类型

  • Content-Encoding:响应报文,实际使用的压缩格式,没有表示响应数据没有被压缩。

  • Content-Language:响应报文,告诉客户端实体数据使用的实际语言类型。

大文件传输

- 数据压缩:
浏览器在发送请求时会携带Accept-Encoding头字段,浏览器支持的压缩格式列表,服务器可以从中选择一种压缩算法放进Content-Encoding响应头里,再把原数据压缩后发给浏览器。
Gzip等压缩算法只对文件有较好的压缩率,而图片、视频音频等多媒体数据再用gzip处理也不会变小。

- 分块传输
将大文件拆分成多个小块,再把这些小块分批发给浏览器,浏览器收到后再组装复原。
在响应报文中用头字段:“Transfer-Encoding:chunked”来表示,即报文中的body部分不是一次性发过来的,而是分成许多chunk逐个发送的。
(一)HTTP-基础篇
- 范围请求
范围请求即允许客户端在请求头里使用专用字段来表示只获取文件的一部分,服务器在响应字段Accept-Ranges:byte告知客户端,支持范围请求。没有该字段或者设置Accept-Ranges:none表示服务器没有实现范围请求功能。
请求头Range是HTTP范围请求的专用字段,格式是bytes=x-y
例如:
(一)HTTP-基础篇
(一)HTTP-基础篇
请求要点:
(1)先发HEAD请求,看服务器是否支持范围请求,同时获取文件的大小
(2)开N个线程,每个线程使用Range字段划分出各自负责下载的片段,发请求传输数据
(3)下载意外中断,只需根据上次的下记录,使用Range请求剩下的一部分即可。

- 多段数据
范围请求也可支持在Range头中使用多个“x-y”,一次性获取多个片段数据,
此时使用multipart/byteranges,表示报文的body是由多段字节序列组成的,并且需要一个参数boundary=xxx给出段之间的分隔标记。
(一)HTTP-基础篇
(一)HTTP-基础篇

其他
“四层负载均衡”是指工作在传输层上,基于TCP/IP协议的特性,例如ip地址、端口号等实现对后端服务器的负载均衡
“七层负载均衡”是指工作在应用层上,看到的是HTTP协议,解析HTTP报文里的URI、主机名、资源类型等数据,再用适当的策略转发给后端服务器。