HTTP理解

OSI 七层模型指什么

  • OSI是ISO制定的一个用于标准化计算机或通信系统间互联的标准体系。
    从底层到高层分别为
  1. 物理层    /建立、维护、断开物理连接/网卡,网线,交换机等    

  2. 数据链路层   /将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正/建立逻辑连接、进行硬件地址寻址、差错校验
  
  等功能

  3. 网络层   /进行逻辑地址寻址,实现不同网络之间的路径选择/ICMP IGMP IP(IPV4 IPV6) ARP RARP

  4. 传输层   /定义传输数据的协议端口号,以及流控和差错校验,数据包一旦离开网卡即进入网络传输层/TCP UDP

  5. 会话层   /建立、管理、终止会话/对应主机进程,指本地主机与远程主机正在进行的会话

  6. 表示层   /数据的表示、安全、压缩(在五层模型里面已经合并到了应用层)/JPEG、ASCll、DECOIC、加密格式

  7. 应用层   /网络服务与最终用户的一个接口/HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

HTTP 的工作原理是什么?

  • HTTP由请求和响应构成,是一个标准的客户端服务器模型(B/S)。HTTP协议永远都是客户端发起请求,服务器回送响应。
  • 一次HTTP操作称为一个事务,其工作整个过程如下:
  1. 地址解析

    • 如用客户端浏览器请求这个页面:http://localhost.com:8080/index.html

    从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:

    协议名:http

    主机名:localhost.com

    端口:8080

    对象路径:/index.html

    在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。

  2. 封装HTTP请求数据包

    • 把以上部分结合本机自己的信息,封装成一个HTTP请求数据包。
  3. 封装成TCP包,建立TCP连接(TCP的三次握手)

  • 在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,HTTP是比TCP更高层次的应用层协议,根据规则,

只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接。

  1. 客户机发送请求命令

    • 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请

    求修饰符、客户机信息和可内容。

  2. 服务器响应

    • 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信

    息包括服务器信息、实体信息和可能的内容。

    • 实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答

    头信息所描述的格式发送用户所请求的实际数据。

  3. 服务器关闭TCP连接

    • 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

    Connection:keep-alive

    • TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时

    间,还节约了网络带宽。

URI 的格式是什么?常见的协议有哪些

URI是采用一种特定语法标识一个资源的字符串,称之为“统一资源标识符”

格式:协议//用户名:密码@授权机构:端口号/路径?查询字符串#哈希

例如:
ftp://mp3:[email protected]:33/VanHalen-Jump.mp3
所有其他字符及内容中需用到的定界符也应用%转义(空格%20 /%2F)

常见的协议:

data    链接中直接包含的Base64编码数据

file    本地磁盘的文件

ftp     FTP服务器

http    使用超文本传输协议的国际互联网服务器

mailto  电子邮件地址

magnet  可以通过对等网络下载的资源

telnet  与基于Telnet的服务连接

HTTP 协议有几种和服务器交互的方法

以HTTP 1.1标准,有如下几种方法:

  • GET:获取资源

    GET方法用来请求访问已被URL识别的资源

  • POST:传输实体主体

POST方法用来请求服务器传输信息实体的主体

  • PUT:传输文件

    PUT要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置处于安全考虑,一般web网站不使用此方法,若配

    合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法

  • HEAD:获得报文首部

HEAD和GET方法一样,只不过不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等

  • DELETE:删除文件

DELETE是与PUT相反的方法,是按请求URI删除指定的资源

处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法

  • OPTIONS:询问支持的方法

用来查询针对请求URI指定的资源支持的方法

  • TRACE:追踪路径
    是让web服务器端将之前的请求通信还回给客户端的方法

发送请求时,在Max-Frowards首部字段中填入数值,每经过一个服务器端就-1,当数值为0时,停止传输,最后收到服务器返回状

态码200 OK的响应

但是,这种方法基本很少使用,而且很容易引起XST(跨站追踪)攻击,就更不会用到了。

  • CONNECT:要求采用隧道协议连接代理

该方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输层安全)协议

把通信内容加密后经过网络传输。

状态码200,301,304,403,404,500,503分别代表什么意思

  • 200 OK
    请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。

  • 301 Moved Permanently

被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接

编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。新的永久性

的URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短

说明。

如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。

注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET

方式。

  • 304 Not Modified
    如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服

务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。

该响应必须包含以下的头信息:

Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将 Date 字段添加到接收

到的响应头中去(正如RFC 2068中规定的一样),缓存机制将会正常工作。

ETag 和/或 Content-Location,假如同样的请求本应返回200响应。
Expires, Cache-Control,和/或Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。

假如本响应请求使用了强缓存验证,那么本次响应不应该包含其他实体头;否则(例如,某个带条件的 GET 请求使用了弱缓存验证),本次响应禁

止包含其他实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。

假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,并且重复发送不包含限制条件的请求。

假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映所有在响应中被更新的字段的值。

  • 403 Forbidden
    服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这

不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个

404响应,假如它不希望让客户端获得任何信息。

  • 404 Not Found
    请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的

话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被

广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。出现这个错误的最有可能的原因是服务器端没有

这个页面。

  • 500 Internal Server Error
    服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。

  • 503 Service Unavailable
    由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么

响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方

式处理它。注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。

报文有哪几部分组成?

  • 用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的HTTP 报文叫做请求报文, 响应端(服务器端)的叫做响应报文。

HTTP报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文

本。HTTP 报文大致可分为报文首部和报文主体两块。 两者由最初出

现的空行(CR+LF)来划分。通常,并不一定要有报文主体。

HTTP理解_第1张图片
image.png
HTTP理解_第2张图片
image.png
HTTP理解_第3张图片
image.png

如图所示,一个请求包括请求行,请求头,空格和消息体(报文主体),一个响应包括状态行,响应头,空格和消息体(报文主体)

请求头的格式和作用是什么?

  • HTTP请求头规定了请求的方法,地址,协议版本,本例中使用POST方法请求http://host_name/path地址,协议版本为HTTP1.1。

首部的格式和作用是什么?给个范例截图说明

  • 请求首部字段范例截图同上。
  1. Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。 可使用 type/subtype 这种形式,

一次指定多种媒体类型。

 文本文件
text/html, text/plain, text/css ...
application/xhtml+xml, application/xml ...

●●图片文件
image/jpeg, image/gif, image/png ...

●●视频文件
video/mpeg, video/quicktime ...

●●应用程序使用的二进制文件
application/octet-stream, application/zip ...
  1. 首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。

可一次指定多种自然语言集。

  1. Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
●●gzip
由文件压缩程序 gzip(GNU zip)生成的编码格式(RFC1952),
采用 Lempel-Ziv 算法(LZ77)及 32 位循环冗余校验(Cyclic
Redundancy Check,通称 CRC)。

●●compress
由 UNIX 文件压缩程序 compress 生成的编码格式,采用 LempelZiv-Welch 算法(LZW)。

●●deflate
组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)
生成的编码格式。

  1. Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0的向后兼容而定义。
Pragma: no-cache

该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。

  1. Cache-Control指令,能操作缓存的工作机制。缓存请求指令如下:
HTTP理解_第4张图片
image.png
  1. If-None-Match,If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。

当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能

主体的作用是什么?

  • 请求主体的内容由传输者定义,传递了客户端到服务器的内容,其格式可以任意指定。本例中传递了两个键值对。

简述浏览器缓存是如何控制的

当浏览器第一次访问服务器请求资源时,服务器会返回资源本体和两条缓存信息(缓存信息以http请求首部的形式定义),
分别为Cache-Control和Etag。
其中Cache-Control定义了何时缓存过期和缓存的各种存储细节,而Etag则是这个资源的一个特征标识符,只有当资源改变
时这个标识符才会改变。
当浏览器在此需要这个资源时,先通过检测这个资源的Cache-Control是否已经过期来判断是否需要向服务器发起请求再次
索取这个资源,如果没有过期则直接使用缓存资源,如果过期了就连同资源的Etag一起向服务器发送请求索取资源。
服务器接收到再次索取资源的请求,比对云端的Etag与请求的Etag是否相等,如果相等,则返回一个304,如果不等,则将
新的资源发送给客户端。

你可能感兴趣的:(HTTP理解)