【计算机网络7】五. 应用层(HTTP)

一. 应用层

  为特定应用程序提供数据传输服务。协议有 HTTP、DNS、DHCP 等协议。数据传输单位是报文。
  计算机自动获取IP地址、自动获取DNS服务器地址,使用的就是DHCP协议(动态主机配置协议)。
  

二. HTTP(超文本传输协议)(端口号80)

URL: 指资源在互联网上的地址。(协议:// 主机 : 端口 / 路径)

HTTP:

  • HTTP是应用层协议,用来传送完成超文本跳转所需要的信息,也能传送互联网上的文本、图像等信息。
  • HTTP使用了面向连接的TCP作为传输层协议,保证了数据的可靠传输。
  • HTTP协议本身是无连接、无状态的。(无状态指的是服务器不记得访问过的客户)

HTTP/1.0 工作流程:
  浏览器请求一个文档时,HTTP协议首先和服务器建立TCP连接,这里需要使用三次握手来建立连接,当三次握手的前两部分完成后,也就是经过一个 RTT 往返时间后,客户端就把HTTP请求报文作为三次握手的第三个报文发给服务器。服务器收到HTTP请求报文后,就把请求的文档作为响应报文返回给客户。
  浏览器请求一个文档到收到整个文档所需的时间:文档的传输时间 + 2 RTT。一个 RTT 用于TCP连接,一个 RTT 用于请求和接收文档。TCP建立连接的三次握手中,第三个报文段传输的就是请求的文档。
在这里插入图片描述
HTTP/1.0 的缺点:

  1. 每次请求文档都有两倍的 RTT 开销
  2. HTTP1.0使用的是非持续连接,指的是客户端接收到响应报文后就断开TCP连接,下一次再重新建立连接,加重了服务器的负担。

三、HTTP1.0和HTTP1.1的区别:

  1. HTTP1.0使用的是非持续连接,HTTP1.1使用的是持续连接,支持流水线方式,可以在同一条长连接上连续发出请求,而不用等待响应返回,减少了TCP连接的空闲时间,提高了效率: 非持续连接指的是每次客户端接收到响应报文后就断开TCP连接,下一次再重新建立连接,会加重服务器的负担。由于这个特性,使用HTTP1.0时,每次请求文档都有两倍的 RTT 开销,一个 RTT 用于TCP连接,一个 RTT 用于请求和接收文档。HTTP1.1协议解决了这个问题,它使用的是持续连接,也就是在一段时间内保持TCP连接不断开,使同一个客户和该服务器能继续使用这条连接传送数据。持续连接有两种工作方式:非流水线方式和流水线方式。非流水线方式的特点是客户在收到前一个响应后才能发出下一个请求,每次访问对象会耗费一个 RTT 往返时间来请求和接收文档,相比非持续连接,节省了一个建立TCP连接的 RTT 时间。非流水线方式的缺点是服务器发送完一个对象后,TCP连接就处于空闲状态了,浪费了服务器资源。流水线方式的特点是客户收到响应前就能接着发送新的请求,服务器连续收到请求,然后连续返回响应,因此客户访问所有对象只需要花费一个 RTT 时间,于是减少了TCP连接的空闲时间,提高了效率。
  2. http1.0 需要 keep-alive 参数来告知服务器要建立一个长连接,而 http1.1 默认使用长连接,而且支持同时打开多个 TCP 连接
  3. HTTP1.1 支持只发送请求头而不发送请求体。 原因是先用请求头判断能否成功,若能成功再发数据,可以节约带宽,post 请求默认就是这样做的。
  4. HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了;HTTP1.1 则在请求头引入了 range头域,它允许只请求资源的某个部分,可以节约带宽。
  5. HTTP 1.1 新增状态码100,表示目前为止正常,客户端可以继续发送请求或者忽略这个响应。

四、HTTP/2.0

HTTP/1.x 的缺陷: HTTP/1.x 实现简单是以牺牲性能为代价的

  • 客户端需要使用多个连接才能实现并发和缩短延迟;
  • 不会压缩请求和响应首部,从而导致不必要的网络流量;
  • 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下。
HTTP/2.0 新特性(二进制分帧层、服务端推送、首部压缩、多路复用 )。(2.0与1.x的区别)

二进制分帧层: HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式的。而 HTTP1.x 的解析是基于文本的。

服务端推送: HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端。而 HTTP 1.0 需要请求一次 html,然后再请求一次 css,然后再请求一 次 js。

首部压缩: HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 进行了首部压缩,而且要求客户端和服务器同时维护和更新一个之前见过的首部字段表,从而避免了重复传输。

多路复用: HTTP2.0 支持多路复用,同一个连接可以并发处理多个请求,方法是把 HTTP数据包拆为多个帧,并发有序的发送, 然后根据序号在另一端进行重组, 而不需要一个个 HTTP请求顺序到达。
  

五、谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?

  • 长短连接指的是TCP连接。
  • HTTP/1.1 开始默认使用的长连接,只需要建立一次TCP连接就能进行多次HTTP通信。减少了TCP连接重复建立和断开所造成的开销。一般用于操作频繁、点对点的通讯,比如数据库连接采用的就是长连接,网络游戏这类应用也采用的长连接。
  • HTTP/1.0 默认使用的短连接。客户端每进行一次 HTTP 请求,就建立一次连接,任务结束就中断连接。WEB网站采用的短连接,因为网站上客户端的连接数会非常多,如果采用长连接,就会占用非常多的资源,所以一般采用短连接。

. HTTP报文结构

  • HTTP 请求报文主要由请求行、请求头部、请求正文 3 部分组成
  • HTTP 响应报文主要由状态行、响应头部、响应正文 3 部分组成
    在这里插入图片描述

六. 请求行

  请求行有三个内容:方法、HTTP版本、URL。

  方法: 常用的方法有:(HTTP请求有哪些?

  • GET:获取资源。
  • POST:传输实体主体
  • PUT:上传文件,但没有验证机制,存在安全问题。
  • DELETE:删除文件,也没有验证机制,存在安全问题。
  • HEAD:获取报文首部,不返回报文的实体主体部分。
  • PATCH:对资源进行部分修改。(中文意思:补丁)
  • OPTIONS:查询URL能够支持的方法。
  • CONNECT:与代理服务器通信时建立隧道。
  • TRACE:追踪通信路径。

七. 状态行

  状态行有三个内容:状态码、HTTP版本、解释状态码的短语。

五大类状态码:
  • 1xx:信息状态码,表示接收的请求正在处理。
  • 2xx:成功状态码,表示请求正常处理完毕。
  • 3xx:重定向状态码,表示需要进行附加操作来完成请求。
  • 4xx:客户端错误状态码,表示服务器无法处理请求。
  • 5xx:服务器错误状态码,表示服务器失效,处理请求出错。
常见状态码:
  • 100:表示目前为止正常,客户端可以继续发送请求或者忽略这个响应。(HTTP 1.1 新值的)
  • 200: 表示请求被成功处理。
  • 204:表示请求已经成功处理,但返回的响应报文不包含实体主体。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
  • 206:表示客户端进行了范围请求,响应报文包含指定范围的实体内容。
  • 301:表示永久重定向。
  • 302: 表示临时重定向。
  • 303:表示临时重定向,同时要求客户端采用 GET 方法获取资源。
  • 304: 如果请求报文首部包含一些条件,比如:If-Match,If-None-Match,If-Modified-Since,If-Unmodified-Since,If-Range,如果不满足条件,则服务器会返回 304 状态码。
  • 307: 表示临时重定向,同时要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
  • 400:表示请求报文中存在语法错误。
  • 401:表示请求需要有认证信息。
  • 403:表示请求被拒绝。
  • 404: 表示无法找到对应资源。
  • 405:表示请求中的方法被禁止。
  • 412:表示先决条件失败。
  • 500: 表示服务器执行请求时发生错误。
  • 503:表示服务器正忙,现在无法处理请求。

八. 常用的请求首部字段(HTTP请求头参数有哪些?)

  HTTP 首部有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

通用首部字段名说明
Cache-Control控制缓存的行为
请求首部字段名说明
Host告知服务器请求资源所在的主机名和端口号,HTTP1.1规定必须包含在请求首部字段内。
If-MatchIf-Match 的字段值和请求资源的 ETag 值一致时,才会执行请求(200 OK),否则返回状态码 412 先决条件失败。
If-None-MatchIf-None-Match 的字段值与请求资源的 ETag 值不一致时,才会执行请求。与 If-Match 作用相反。
If-Modified-Since请求资源在 If-Modified-Since 字段值指定的日期时间之后发生了更新,才能处理请求,否则返回状态码 304 Not Modified 。请求首部字段 If-Modified-Since 用于确认本地资源的有效性,实体首部字段 Last-Modified 用于获取资源最后的修改时间。
If-Unmodified-Since请求资源在 If-Unmodified-Since 字段值指定的日期时间之后未发生更新,才能处理请求,否则返回状态码 412 先决条件失败。与 If-Modified-Since 作用相反。
If-RangeIf-Range 的字段值和请求资源的 ETag 值或时间一致时,作为范围请求来处理。否则返回全体资源。
Cookie服务器接收到的Cookie信息
响应首部字段名说明
ETag资源的匹配信息
Set-Cookie开始状态管理所使用的Cookie信息
实体首部字段名说明
Last-Modified资源最后的修改时间

  

九. 缓存(缓存验证有两种方式:ETag 和 Last-Modified)

  HTTP/1.1 通过 Cache-Control 首部字段来控制缓存。

1. 优点

  • 缓解服务器压力;
  • 降低客户端获取资源的延迟:缓存通常位于内存中,读取缓存的速度更快。并且缓存服务器在地理位置上也有可能比源服务器来得近,例如浏览器缓存。

2. 实现方法

  • 让代理服务器进行缓存;
  • 让客户端浏览器进行缓存。

3. 缓存验证
  URL 不能唯一表示资源,比如 http://www.google.com/ 有中文和英文两个资源,只有 ETag 才能对资源进行唯一标识。

缓存验证有两种方式:ETag 和 Last-Modified

  1. 通过将缓存资源的 ETag 值放入 If-None-Match 首部,服务器收到该请求后,判断缓存资源的 ETag 值和资源最新的 ETag 值是否一致,如果一致则表示缓存资源有效,返回 304 Not Modified。

  2. Last-Modified 首部字段也可以用于缓存验证,它表示服务器对资源的最后修改时间。但它只能精确到一秒,是一种弱校验器,所以通常作为 ETag 的备用方案。如果响应首部字段里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since 来验证缓存。请求资源在 If-Modified-Since 字段值指定的日期时间之后发生了更新,才能处理请求,否则返回状态码 304 Not Modified 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值