写点什么

送给你一份程序员大佬整理的 HTTP 基础知识大图

  • 2021 年 11 月 12 日
  • 本文字数:10166 字

    阅读完需:约 33 分钟



  • URL 指的是统一资源定位符,是访问 Web 网站需要输入的网站地址。例如,http://www.tutu.com

  • URI 指的是统一资源标识符,全称为Uniform Resource Identifier,它的作用是区分互联网中的不同资源。比如,HTML 文档、图像、视频片段、程序等等。而?URL?是?URI?的一个子集。

URI 格式

下图展示了?URI?的格式。



URI.jpg


  • 协议名http:https:表示协议名称。不区分字母大小写,最后加上//

  • 登录信息user:pass@?表示获取服务器资源的用户和密码。但不推荐使用,因为不安全。

  • 服务器地址:服务器地址有三种:

  • 以域名的形式www.tutu.com;

  • 以 IPv4?192.168.0.1地址名;

  • [0:0:0:0:0:0:1]这种方括号括起来的 IPv6 地址;

  • 服务器端口号:8080表示端口号。

  • 文件路径/html/index.html表示服务器文件路径,资源的访问位置。

  • 查询字符串?userId=1表示文件路径中的参数。?后面以key=value的形式。如果后面还需要加参数,用&拼接。

  • 片段标识符#cn1表示文件中的某个位置。就是平时的网页锚点定位。


HTTP 基础




HTTP 是一种无状态的协议,对发送过的请求/响应都不做持久化处理。

持久化连接

HTTP 1.1 中的所有连接都是默认开启的(keep-alive)。通过请求/响应头部的Connection字段可以查看是否开启持久化连接(后面会介绍该字段的值),而在 HTTP1.0 中是默认关闭的(close)。


它的特点是,不管是客户端还是服务器端,只要其中的一端没有提出断开连接,那么就会保持 TCP 连接。好处是,减少 TCP 连接的重复建立和断开连接造成的额外开销,减轻服务器压力。这样使得 HTTP 请求和响应速度更快结束,也提高页面的显示速度。

管线化

管线化是不用等待响应就可以发送下一个请求,也就是并行处理。不用一个接一个的等待响应,管线化比持久化连接还要更快。

HTTP 报文

HTTP 一共有两种报文:请求报文、响应报文。报文又分为报文头部和报文主体,报文主体是可选的。报文包含了以下三个部分。


  • 起始行start line)有以下两种类型。

  • 请求行:请求的方法、请求的 URL、HTTP 的版本

  • 响应行:HTTP 版本、状态码

  • 头部字段header):一些头部信息,以key: value的形式。

  • 主体body):被发送的数据。



报文主体.jpg


这张图是以请求报文为例。

HTTP 的请求方法

  • GET:获取服务器资源。

  • POST:提交信息给服务器。

  • PUT:传输文件。

  • HEAD:和 GET 方法一样。但是只返回响应头部。作用是确定 URL 的有效性和资源更新的时间。

  • DELETE:删除指定的资源。

  • OPTIONS:查询请求服务器指定的资源所支持的方法。

  • TRACE:用来确认连接过程中发生的一些操作。

  • CONNECT:建立连接渠道,用于代理服务器。

HTTP 状态码

1xx


1XX表示接收的请求正在处理。


2xx 成功


  • 200 OK:表示客户端发送的请求在服务器端被正常处理了。

  • 204 No Content:表示请求被处理成功,但没有资源可返回。

  • 206 Partial Content:表示客户端只获取文件的一部分内容,而服务器成功执行了这部分的GET请求。响应报文中含Content-Range指定部分的实体内容。


3xx 重定向


  • 301 Moved Permanenty:永久重定向。表示请求的资源已经被分配了新的 URL,以后就使用资源现在所指的 URL。

  • 302 Found:临时重定向。表示请求的资源被分配了新的 URL。

  • 303 See Other:表示请求的资源存着另一个 URL,应该用GET方法获取请求的资源。

  • 304 Not Modified:表示请求已经找到,但不符合条件请求。协商缓存就会返回这个状态码。

  • 307 Temporary Redirect:临时重定向,和302类似。但是补鞥呢改变请求方法。


当 301、302、303 响应状态码返回时,几乎所有浏览器都会将 POST 改为 GET,并删除请求报文中的主体,之后请求会自动再次发送。301、302 标准是禁止把 POST 改成 GET 的,但实际使用的时候大家都会这么做。


4xx 客户端错误


  • 400 Bad Request:表示请求报文中存在语法错误。

  • 401 Unauthorized:表示发送的请求要通过 HTTP 认证的认证消息。如果之前请求过一次,就表示用户认证失败。

  • 403 Forbidden:表示对请求资源的访问被服务器拒绝。

  • 404 Not Found:表示服务器上无法找到请求的资源。


5xx 服务器错误


  • 500 Internal Serve Error:表示服务器端在执行请求时发生错误。

  • 503 Service Unavailable:表示服务器暂处于超负荷或者正在进行停机维护。

和 HTTP 相关 Web 服务器

HTTP 进行通信时,除了客户端和服务器端这两个之外,还有一些用于通信数据转发的应用程序。例如代理、网关、隧道和缓存


代理


代理是一种具有转发功能的应用程序,它存在于客户端和服务器端之间,相当于一个中间人。它将客户端发送过来的请求并转发给服务器端。当然,它也会将服务器端返回的响应转发给客户端。



代理服务器.jpg


每次通过代理服务器转发请求或响应时,头部都会出现Via这个字段。


网关


网关是一种特殊的服务器,作为其他服务器的中间实体使用。用于将 HTTP 请求转化成其他协议通信。网关接收请求时就好像自己的资源的源服务器一样对请求做处理。



网关.jpg


隧道


隧道是可按要求建立一条和其他服务器的通信线路,到时候使用 SSL 加密进行通信。隧道的目的是保证客户端和服务器进行安全的通信。


![图片](https://img-blog.csdnimg.cn/img_convert/ddbb7b336cc84c7


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


f6949768e6b224d81.png)


隧道.jpg


缓存


缓存是指代理服务器或客户端本地磁盘中保存的资源副本。利用缓存可以减少向源服务器的访问,主要目的是减少网络带宽的流量和通信时间。


缓存服务器是代理服务器的一种,当代理转发从服务器返回的响应时,会保存一份资源的副本。缓存服务器的优点在于通过缓存可以避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求。


缓存的有效期


每当源服务器上的资源更新时,如果还是用不变的缓存,那就会变成返回更新前的旧资源。


即使存在缓存,也会因为客户端的要求、缓存的有效期等等一些因素,向源服务器确认资源的有效性。如果缓存的资源已过期,缓存服务器会向源服务器上获取新的资源。


客户端缓存


这里的客户端缓存指的是浏览器中的缓存。浏览器缓存如果未过期,就不用向源服务器请求相同的资源,直接获取缓存在本地磁盘中的资源。当资源过期时,会向源服务器确认资源的有效性。如果缓存的资源过期,就会再次向源服务器发起资源请求。

内容协商

内容协商机制是指客户端和服务器端就响应的资源内容进行互相协商,然后提供客户端最合适的资源。内容协商会以语言、字符集、编码方式等。


主要使用的请求头有:


  • Accept

  • Accept-Charset

  • Accept-Language

  • Content-Language


内容协商技术有下面三种类型。


  • 服务器驱动协商(Server-driven Negotiation)

  • 由服务器进行内容协商。

  • 客户端启动协商(Agent-driven Negotiation)

  • 由客户端进行内容协商。

  • 透明协商 服务器驱动和客户端驱动的结合体,由服务器和客户端进行内容协商的一种方法。

End-to-end 头部和 Hop-by-hop 头部

HTTP 头字段定义成缓存代理和非缓存代理。分为两种类型。


  • 端到端头部End-to-end


分在这个类别中的头部会转发给请求或响应对应的最终接收目标,而且必须保存在缓存生成的响应中,另外规定它必须被转发。


  • 逐跳头部Hop-by-hop


分在这个类别中的头部只对单次转发有效,会因通过缓存或代理而不转发。在 HTTP 1.1 和之后的版本中,如果使用Hop-by-hop头,就要提供?Connection?头字段。


除了下面 8 个头字段外,其他所有字段都属于端到端头部。


  • Connection

  • Keep-Alive

  • Proxy-Authenticate

  • Proxy-Authorization

  • Trailer

  • TE

  • Transfer-Encoding

  • Upgrade

HTTP 通用头部字段

下面列出请求/响应头都会出现的字段,这些字段都含有重要的信息。


Cache-Control


Cache-Control表示资源的缓存操作,参数是可选的,如果存在多个参数的话,以,分隔开。


请求头


在请求头中使用Cache-Control字段时,它的值如下:


  • no-cache:不使用强缓存,强制向源服务器再次验证缓存的资源是否过期(走协商缓存)。

  • no-store:不使用任何缓存,每次都向源服务器获取最新的资源。

  • max-age:以秒为单位。表示缓存的资源没有超过指定的时间,客户端就从缓存中获取资源。

  • min-fresh:以秒为单位。要求代理服务器返回至少还没过指定时间的缓存资源。

  • max-stale:即使是过期的资源,也照样接收。

  • only-if-cached:告诉代理服务器,从缓存中获取资源(如果有)。

  • no-transform:不能对资源进行转换,可以防止缓存或代理压缩图片等类似操作。


响应头


在响应头中使用Cache-Control字段时,它的值如下:


  • public:资源可被浏览器和代理服务器进行缓存。

  • private:资源只可以被浏览器进行缓存。其他都不可以。

  • no-cache:可以缓存,但每次使用前要向源服务器验证缓存资源是否过期。

  • s-maxage:只提供给代理服务器,表示代理服务器中的资源过期时长,用s-maxage后,会忽略max-ageExpires字段。

  • max-age:以秒为单位。设置缓存时间,如果没超过该时间,不用向服务器请求资源。如果超过,就证明资源已过期。如果响应头出现Expires字段,在 HTTP 1.1 中会有限处理max-age,而 HTTP1.0 中则相反。

  • must-revalidate:可以缓存,但必须向源服务器再次验证。如果请求失败,则返回504状态码。该字段会忽略max-stale

  • proxy-revalidate:要求缓存服务器对缓存的响应有效性进行确认。

  • no-transform:不能对资源进行转换,可以防止缓存或代理压缩图片等类似操作。


Connection


Connection字段决定当前 TCP 连接 完成后,是否关闭连接。有以下两种。


  • keep-Alive:持久化连接。

  • close:TCP 连接完成后,立马关闭连接。


Date


Date字段的值为 GMT 时间日期格式,表示 HTTP 报文创建的时间和日期。


Date: Tue, 13 Apr 2021 12:35:41 GMT


Pragma


Pragma是用来向后兼容只支持 HTTP1.0 协议的缓存服务器。它的效果和Cache-Control一样。


Pragma: no-cache


Upgrade


Upgrade用于查看 HTTP 协议或者其他协议是否可以使用更高的版本进行通信。


Upgrade: HTTP/2.0


Via


Via用于跟踪客户端和服务器端之间的请求和响应报文的传输路径,还可以避免请求循环的发生。


Via: 1.0 gw.hackr.jp(Squid/3.1)


Via: 1.0 gw.hackr.jp(Squid/3.1), 1.1 al.example.com(Squid/2.7)


经过代理服务器 A 时,Via 头部附加了 “1.0 gw.hackr.jp(Squid/3.1)” 这样的字符串值。行头 1.0 指的是接收请求的服务器上应用的 HTTP 协议版本。如果经过多个代理服务器的话,这些信息会后面追加。


Warning


Warning字段告诉用户一些与缓存有关的警告。

请求头字段

Accept


Accept请求头用来告诉服务器,客户端能处理的内容类型。下面列出几种媒体类型。


  • 文本文件:?text/htmltext/plaintext/cssapplication/xhtml+xmlapplication/xml等等。

  • 图片文件:?image/jpegimage/gifimage/png;

  • 视频文件:?video/mpegvideo/quicktime;

  • 二进制文件:application/octet-streamapplication/zip;


当值为*/*,表示客户端可以是任意内容类型。当值为image/*,用来代表任何其他图片类型。


如果想给显示的媒体类型增加优先级,通过用q=表示权重值,用分号(;)分隔开。权重值的范围是0~1,可以精确到小数点后 3 位,1是最大值。没有指定权重值时,默认权重是q=1.0


Accept: text/html, appliaction/json;q=0.9


Accept-Charset


Accept-Charset请求头用来告诉服务器,客户端可处理的字符集类型。另外,可以一次性指定多种字符集。和Accept一样,通过q值来表示优先级。该头部应用于内容协商机制的服务器驱动协商。


Accept-Charset: iso-8859-1


Accept-Charset: iso-8859-1;q=0.5


Accept-Encoding


Accept-Encoding请求头用来告诉服务器,客户端能理解的内容编码方式。可以一次性指定多种内容编码,有以下几种编码。


  • gzip:由文件压缩程序?gzip?生成的编码格式,使用?Lempel-Ziv?算法以及 32 位循环冗余验证。

  • compress:由 UNIX 文件压缩程序compress生成的编码方式,采用Lempel-Ziv-Welch算法。

  • deflate:组合使用?zlib?格式以及由deflate压缩算法生成的编码方式。

  • indentity:不执行压缩或不会变化的默认编码格式。


Accept-Encoding: gzip, deflate


Accept一样,用q值来设置优先级。还有使用星号(*),表示指定任意的编码格式。


Accept-Language


Accept-Language请求头用来告诉服务器,客户端可以理解的自然语言集(指中文和英文集),以及自然语言集的优先级。和Accept一样的,可指定多个自然语言集。使用q值设置优先级。


Accept-Language: zh-CN,zh;q=0.9;q=0.8


客户端在服务器有中文版的情况下,会请求返回中文版的响应,如果没有,则返回英文版。


Authorization


Authorization用来告诉服务器,用户代理的认证信息(证书值)。通常会在服务器返回401状态码响应后,把头部字段Authorization添加到请求中。


Authorization: Basic dWVub3NlbjpwYXNzd29yZA==


Expect


Expect用来告诉服务器,只有在满足这个条件的情况下才会处理请求。如果服务器不能满足客户端的要求,会返回417状态码。目前只规定了100-continue这个条件。


Expect: 100-continue


From


From字段表示用户代理的用户的电子邮箱地址,目的是为了显示搜索引擎用户代理的负责人的电子邮箱联系方式。


From: info@hackr.jp


Host


Host请求头指明了请求的资源所在的服务器主机名和端口号。如果服务器没设置主机名,会发送一个空值。


Host: www.tutu.com


If-Match


像这种If-xxxx开头的请求头字段,都是条件请求。服务器接收到附带条件的请求后,只判断条件是真时才会执行请求。


If-Match字段用于和服务器资源的ETag值做对比时,ETag值和If-Match的值相等时才会处理该请求。否则返回412状态码。通过用星号(*)的方式,表示只要资源存在就处理请求,但服务器会忽略掉ETag的值。


If-Match: "123456"


If-Modified-Since


If-Modified-Since用于确定代理服务器或客户端的资源有效性。在指定的时间之后,请求的资源发生改变时,就处理请求。如果资源都没有改变,则返回304状态码。


If-Modified-Since: Tue, 13 Apr 2021 12:35:41 GMT


If-None-Match


If-None-MatchIf-Match相反,只有服务器资源的ETag的值和If-None-Match的值不一样时,才会处理该请求。在GETHEAD请求方法中加入该字段可以获取最新的资源。


If-Range


If-Range用于告诉服务器,如果If-Range字段的值和请求资源的ETag值或时间一样时,就会作为范围请求处理(Range字段规定请求多少字节的数据)。否则,忽略范围请求,返回全部资源。


If-Range: "123456"


Range: bytes=5001-10000


If-Unmodified-Since


If-Unmodified-Since字段用来告诉服务器,只有当请求资源在指定的时间之后没有修改的情况下,才会处理请求。如果在指定的时间后发生了修改,则返回412状态码。


If-Unmodified-Since: Tue, 13 Apr 2021 12:35:41 GMT


Proxy-Authorization


Proxy-Authorization字段包含了用户代理提供给代理服务器用于身份验证的凭证。


Proxy-Authorization: Basic dGlwOjkpNLAGfFY5


Range


Range请求头字段表示获取资源的哪一部分。服务器收到带有Range字段的请求后,会在处理请求之后返回206状态码。如果无法处理,则返回200状态码并把全部资源返回。


Referer


Referer字段表示请求的 URL 是从哪个 Web 页面发起的。服务器通过Referer字段来标识访问来源,进行统计分析、日志记录和缓存优化。


TE


TE表示客户端能够处理响应的传输编码方式以及优先级。


TE: gzip, deflate;q=0.5


User-Agent


User-Agent字段用于把请求的浏览器和用户代理名称等信息传给服务器。


User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36

响应头字段

Accept-Ranges


Accept-Ranges表示服务器端能处理指定范围内的资源。有两个值:bytesnonenone表示不能处理指定范围内的请求。


Age


Age表示源服务器再多久前返回过资源。单位为秒。


Age: 3600


ETag


ETag表示资源的特定标识符,服务器会给每份资源都分配对应的ETag值。当资源发生变化时,ETag值也会改变。例如,访问同一个 URL 的网站同时具备有中英文版,当切换中文时,会返回中文的资源(ETag: user-chi),而切换到英文时,返回的是英文的资源(ETag: user-us)。


强弱 ETag


  • 强 ETag: 不管资源发生了什么变化都会改变其值。


ETag: "user-123456"


  • 弱 ETag: 用于资源是否相同,只有资源发生了根本改变,产生差异时才会改变ETag值。字段值最开头会添加W/的字符


ETag: W/"user-123456"


Location


Location字段表示需要将页面重定向到某个地址,一般都是响应码为3xx的响应才有用。


Proxy-Authenticate


Proxy-Authenticate字段表示获取代理服务器的资源要通过身份验证的方式。


Retry-After


Retry-After字段表示客户端应该在多久之后再次请求。配合5033xx状态码响应一起使用。


Retry-After: 120


Server


Server字段表示处理请求的服务器所用到的软件相关信息。


Server: Apache/2.2.17


Vary


Vary字段可以对缓存进行控制。从代理服务器收到源服务器返回含有Vary指定项的响应后,如果要进行缓存,那么会对请求中含有Vary指定头部字段的请求返回缓存。即使对相同资源发起请求,如果Vary指定的头部字段不相同,就必须从源服务器重新获取资源。


Vary: Accept-Language

实体头字段

Allow


Allow用于告诉客户端,资源所支持的 HTTP 方法,如果服务器收到不支持的 HTTP 方法时,会返回405状态码作为响应。


Allow: GET, DELETE


Content-Encoding


Content-Encoding字段表示服务器对实体的主体部分用的内容编码方式。内容编码在Accept-Encoding中已经介绍过,一共有4种。


Content-Encoding: gzip


Content-Language


Content-Language字段表示实体主体使用的自然语言。


Content-Language: zh-CN


Content-Length


Content-Length表示实体主体部分的大小(以字节为单位)。


Content-Length: 1500


Content-Location


Content-Location字段表示要返回数据的地址。


Content-Location: https://www.tutu.com/index.html


Content-Range


Content-Range字段表示的是一个数据片段在整个文件中的位置。


Content-Range: bytes 5001-10000/10000


Content-type


Content-type字段表示实体主体中对象的媒体类型。


Content-type: text/html; charset=UTF-8


Expires


Expires字段会把资源失效的日期告诉客户端。在这个日期后,资源就会过期。也就是说,在指定的日期内可以从浏览器缓存中获取资源。如果超过了这个日期,就必须向服务器发起资源请求。如果头部存在Cache-Control: max-age时,会优先处理max-age指令。


Expires: Tue, 13 Apr 2021 12:35:41 GMT


Last-Modified


Last-Modified字段表示资源最后修改的时间。


Last-Modified: Tue, 13 Apr 2021 12:35:41 GMT

HTTP 缓存

HTTP 缓存可分为强缓存协商缓存,主要用于加快资源的获取速度,提高用户体验,减少网络连接,缓解服务器压力。


强缓存


对强缓存来说,浏览器会判断请求的资源是否在有效期内。如果是在有效期内,就直接从缓存中读取资源,不用向服务器发送资源请求。强缓存通过ExpiresCache-ControlPragma这三个头部字段设置。


Cache-Control


Cache-Control头部字段在上面也详细介绍过在各端所具备的属性值。下面来列出最常见的几个值。


  • public: 该资源可以被浏览器和代理服务器进行缓存。

  • private: 该资源只可以被浏览器缓存,其他都不可以。

  • no-cache: 不使用强缓存,强制向源服务器再次验证缓存的有效性。这个值表示走协商缓存。

  • no-store: 不使用任何缓存,每次都向源服务器获取最新资源。

  • max-age: 如果缓存的资源没有超过规定的时间,客户端就从缓存中获取资源。以秒为单位。

  • s-maxage: 只适用于代理服务器,表示代理服务器中的资源过期时长,用了s-maxage后,会忽略max-ageExpires字段。


Expires


Expires字段的值是一个GMT格式的时间日期,将资源失效的日期告诉客户端,客户端收到带有该字段的响应体后进行缓存。后续客户端发起相同的资源请求,会用Expires的值和本地时间做对比,如果该请求的本地时间小于Expires的值,就直接用缓存中的资源,不用向服务器发起请求。


Expires的值会产生一个问题。如果修改了本地时间,就会导致客户端和服务器端的时间不一致,那么对于缓存过期的判断就无法和预期一样了。


Expires在三者中优先级最低。


Pragma


Pragma可以看上面的介绍,这里不过多讲解。


强缓存在 Chrome 中会返回200状态码并且有两种情况。


  • memory cache: 只要页面不关闭,就会从浏览器内存中获取资源。

  • disk cache: 从磁盘中读取缓存资源。



强缓存.jpg


用了强缓存后,如果服务器端的资源更新了,客户端是不知道的,而且在过期之前都会用缓存中的资源。可以通过Ctrl?+?F5强制刷新。


协商缓存


协商缓存是在用本地缓存之前,会向服务器发起一次GET请求,验证浏览器保存在本地的资源是否过期。


last-modified 和 if-unmodified-sine


一般情况下是用请求资源的最近一次修改时间戳来判断。来举个例子:假设客户端向服务器端请求一个文件,为了让资源被再次请求时能通过协商缓存机制使用本地缓存。首次返回该资源的响应头中会包含一个last-modified的字段,字段的值表示资源最后修改的时间。当刷新页面时,该资源使用的是协商缓存,浏览器无法确认本地缓存是否过期,然后向服务器发起一次GET请求,进行缓存有效性的协商,本次请求的请求头中包含一个if-unmodified-since字段,字段的值是上次响应头中的last-modified字段的值。


last-modified 的不足之处


last-modified存在两个缺陷:


  1. 它只是根据资源最后的修改时间进行判断,虽然请求的文件资源进行了编辑,但内容并没有改变,时间也会更新。这就导致了协商缓存时关于有效性的判断验证失效,就要重新进行资源的请求。

  2. 由于文件资源修改的时间单位是秒,如果文件修改很频繁。比如,几百毫秒内改一次,就无法识别出该文件资源的更新。


ETag 和 if-none-match


为了弥补通过时间判断的不足,HTTP 1.1 加入了ETag(实体标签)的头信息。


ETag表示资源的特定标识符,类似文件指纹。作用上面也有提到,这里不过多讲解。


当响应头同时存在last-modifiedETag这两个字段时,会以ETag为准。再次对该资源发起请求时,会将之前的响应头中ETag的值当作这次请求中if-none-match字段的值,发送给服务器进行缓存有效性验证。如果验证缓存有效,就返回304状态码响应重定向到本地缓存。


ETag 的不足之处


ETag的出现并不是last-modified的代替品,而是一种补充方案,它还是存在弊端的。


  • 如果资源比较大,数量多而且修改频繁的话,那么生成ETag的过程会影响到服务器的性能。

  • 上面也讲了ETag还分强ETag和弱ETag

  • ETag值是根据资源内容进行生成,保证每个字节都相同。

  • ETag值是根据资源的部分属性值来生成,生成速度快但是无法保证每个字节都相同。


如果浏览器走的是协商缓存,并且资源没发生改变,服务器端会返回304状态响应码告诉浏览器获取本地缓存的资源即可。



1617632172962.jpg


HTTP 的缺点




HTTP 协议主要的不足之处有以下几点。


  • 通信使用明文,内容会被窃听

  • 不验证通信方的身份,可能遭遇伪装

  • 无法证明报文的完整性,可能已遭到篡改

通信使用明文,内容会被窃听

HTTP 协议本身没有加密功能,所以无法做到对通信请求和响应内容进行加密。

TCP/IP 是会被窃听的网络

由于 TCP/IP 协议的工作机制,通信内容在所有通信线路上都有可能遭到窥视。不管是哪个角落的服务器在跟客户端进行通信,通信的线路上的一些设备都不可能是个人物品。所以不排除在某个环节上遭到恶意窥视的行为。即使进行加密处理,也会被窥视到通信的内容。窃听相同端上的通信并不是难事,只要收集在网络上流动的数据包就行。可以通过抓包和嗅探器工具来收集数据包。


解决方案: 加密处理防止窃听


最常见的两种加密方式是通信加密和内容加密


通信加密


HTTP 协议中本身没有加密机制,但可以通过?SSL(Secure Socket Layer 安全套阶层)?或?TLS(Transport Layer Security 安全传输层协议)?的组合使用,加密 HTTP 的通信内容。用 SSL 建立安全通信线路后,就可以在这条线路上进行 HTTP 通信。和 SSL 组合使用的 HTTP 叫做?HTTPS (HTTP Secure 超文本传输安全协议)?或 HTTP over SSL。


内容加密


由于 HTTP 协议中没有加密机制,那么可以对传输的内容本身进行加密。也就是把 HTTP 报文中包含的内容进行加密处理。在这种情况下,客户端需要对 HTTP 报文主体(body)进行加密处理后再发送请求。要做到内容的加密,前提是客户端和服务器端同时具有加密和解密的机制。主要应用在 Web 服务器中。该方式不同于 SSL 和 TLS 把整个通信线路加密处理,所以内容还是会有被篡改的可能。

不验证通信放的身份可能遭遇伪装

HTTP 协议的请求和响应都不会对通信方进行确认。


任何人都可以发起请求


在 HTTP 协议通信时,由于不存在确定通信方的处理步骤,任何人都可以发起请求。服务器只要收到请求,不管是谁都会返回一个响应(仅限发送端的 IP 地址和端口号没被 Web 服务器设置限制访问的前提下)。也就是来者不拒。


  • 有可能是伪装的服务器。

  • 有可能是伪装的客户端。

  • 无法确定正在通信的对方是否具备访问权限。因为某些 Web 服务器上保存有重要的信息,只想发给特定用户通信的权限。

  • 无法判断请求是从哪来、出自谁手。

  • 即使是无意义的请求也照样接收。无法阻止大量请求下的 Dos 攻击(Denial of Service,拒绝服务器攻击)。


解决方案:查明对方的证书


虽然使用 HTTP 协议无法确定通信方,但使用 SSL 可以。SSL 除了加密处理外,还用了一种证书的手段,用于确认通信方。证书是由值得信任的第三方机构颁发,用来证明服务器和客户端是真实存在的。


通过证书,以证明通信方就是意料中的服务器,对个人来说,减少了个人信息泄露的危险。另外,客户端持有证书即可完成个人身份的确认,也可用于对 Web 网站的认证环节。

无法证明报文完整性,可能已篡改

评论

发布
暂无评论
送给你一份程序员大佬整理的 HTTP 基础知识大图