定义:HTTP 是超文本传输协议,它定义了客户端和服务器之间交换报文的格式和方式,是基于TCP/IP通信协议传递数据,默认使用 80 端口(不涉及数据包(packet)传输)
特性
无状态(服务器不会保存任何客户端信息)
媒体独立:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
HTTP1.1之后默认采用持续连接,connection:keep-alive
报文
请求报文
组成内容:请求行、请求头、空行和请求数据
例子:
GET index.html / HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
请求方法
GET:请求指定的页面信息,并返回实体主体
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改
HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
PUT:从客户端向服务器传送的数据取代指定的文档的内容
DELETE:请求服务器删除指定的页面
CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS:允许客户端查看服务器的性能
TRACE:回显服务器收到的请求,主要用于测试或诊断
PATCH:是对 PUT 方法的补充,用来对已知资源进行局部更新
响应报文
组成内容:
状态行、消息报头、空行和响应正文
例子:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
响应头信息
Allow:服务器支持哪些请求方法(如GET、POST等)
Content-Encoding:文档的编码方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间
Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小
Content-Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html
Date:当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦
Expires:应该在什么时候认为文档已经过期,从而不再缓存它
Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态
Location:表示客户应当到哪里去提取文档
Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面
Server:服务器名字,由Web服务器自己设置
Set-Cookies:设置和页面关联的Cookie
WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的
状态码
1**
100:Continue,客户端应继续其请求
101:Switching Protocols,服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
2**
200:OK,一般用于GET与POST请求
201:Created,成功请求并创建了新的资源
202:Accepted,已经接受请求,但未处理完成
203:Non-Authoritative Information,非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204:No Content,无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205:Reset Content,重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206:Partial Content,部分内容。服务器成功处理了部分GET请求
3**
300:Multiple Choices, 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301:Moved Permanently,永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302:Found,临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303:See Other,查看其它地址。与301类似。使用GET和POST请求查看
304:Not Modified,未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305:Use Proxy,使用代理。所请求的资源必须通过代理访问
306:Unused,已经被废弃的HTTP状态码
307:Temporary Redirect,临时重定向。与302类似。使用GET请求重定向
4**
400:Bad Request,客户端请求的语法错误,服务器无法理解
401:Unauthorized,请求要求用户的身份认证
402:Payment Required,保留,将来使用
403:Forbidden,服务器理解请求客户端的请求,但是拒绝执行此请求
404:Not Found,服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405:Method Not Allowed,客户端请求中的方法被禁止
406:Not Acceptable,服务器无法根据客户端请求的内容特性完成请求
407:Proxy Authentication Required,请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408:Request Time-out,服务器等待客户端发送的请求时间过长,超时
409:Conflict,服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410:Gone,客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411:Length Required,服务器无法处理客户端发送的不带Content-Length的请求信息
412:Precondition Failed,客户端请求信息的先决条件错误
413:Request Entity Too Large,由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414:Request-URI Too Large,请求的URI过长(URI通常为网址),服务器无法处理
415:Unsupported Media Type,服务器无法处理请求附带的媒体格式
416:Requested range not satisfiable,客户端请求的范围无效
417:Expectation Failed,服务器无法满足Expect的请求头信息
5**
500:Internal Server Error,服务器内部错误,无法完成请求
501:Not Implemented,服务器不支持请求的功能,无法完成请求
502:Bad Gateway,作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503:Service Unavailable,由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504:Gateway Time-out,充当网关或代理的服务器,未及时从远端服务器获取请求
505:HTTP Version not supported,服务器不支持请求的HTTP协议的版本,无法完成处理
HTTP的缺点
使用明文方式发送,可能被第三方窃听
可能被第三方截取后修改通信内容,接收方没有办法发现报文内容的修改
存在认证的问题,第三方可以冒充他人参与通信
HTTP/1.0协议
缺点:每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。
为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection(keep-alive)字段。
HTTP/1.1协议
特点
持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive;(主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close)
管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求
多个回应如何区分:
1.使用Content-Length标识一次回应数据长度,来区分多个回应
2.使用Transfer-Encoding:chunked,每个非空数据块前使用一个16进制的数字标识该段数据长度,最后一个为长度为0即结束
新增PUT/PATCH/HEAD/OPTIONS/DELETE
缺点:所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。
解决方法:
1.减少请求数
2.同时多开持久连接。
与HTTP/1.0的区别
缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
带宽优化:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接
错误通知的管理优化:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
长连接:HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
HTTP/2协议
特点
二进制协议:头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧
多工:HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。
数据流:HTTP/2 将每个请求或回应的所有数据包,称为一个数据流(stream)。每个数据流都有一个独一无二的编号。数据包发送的时候,都必须标记数据流ID,用来区分它属于哪个数据流。另外还规定,客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数;可通过发送信号(RST_STREAM帧),取消这个数据流。
头信息压缩:头信息使用gzip或compress压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
服务器推送:允许服务器未经请求,主动向客户端发送资源
缺点:由于多个数据流使用同一个 TCP 连接,遵 守同一个流量状态控制和拥塞控制。只要一个数据流遭遇到拥塞,剩下的数据流就没法发出去,这样就导致了后面的所有数据都 会被阻塞。HTTP/2 出现的这个问题是由于其使用 TCP 协议的问题,与它本身的实现其实并没有多大关系。
HTTP网络请求影响因素
带宽
延迟
浏览器阻塞:浏览器对于同一个域名,同时只能有 4 个连接(大多数是6个),超过浏览器最大连接数限制,后续请求就会被阻塞
DNS查询:浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是 DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的
建立连接:HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大
HTTPS
特点
需要到CA申请证书,一般免费证书很少,需要交费
运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
完全不同的连接方式,用的端口也不一样,前者是80,后者是443
可以有效的防止运营商劫持,解决了防劫持的一个大问题
TLS握手过程
客户端向服务器发起请求,请求中包含客户端支持的加密方法(加密算法清单)
服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数
客户端确认服务器证书有效后,生成一个随机数,并使用数字证书中的公钥,加密这个随机数,然后发给服务器
服务器使用自己的私钥,来解密客户端发送过来的随机数。并提供前面所有内容的 hash 值来供客户端检验
客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥 来加密信息
客户端给服务端发送消息使用非对称加密,服务端给客户端发送消息使用对称加密