HTTP再次学习详解

一.TCP/IP的分层管理
1.分层:
分为应用层,传输层,网络层,数据链路层
应用层: 决定了向用户提供应用服务时通信的活动(HTTP协议也处于该层)
传输层: 提供处于网络连接中的两台计算机之间的数据传输,在该层有两个性质不同的协议,分别是TCP和UDP
TCP和UDP( 用户数据报协议 的区别
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据 之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付 3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等) 4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信 5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信
网络层: 用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方计算机。
数据链路层: 用来处理连接网络的硬件部分。硬件上的范畴均在链路层的作用范围内。
从客户端发出http请求到服务器接收,中间会经过一系列的流程。

简括就是: 从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接, 再到网络层的ip寻址,再到数据链路层的封装成帧, 最后到物理层的利用物理介质传输。

OSI七层框架: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
表示层 :主要处理两个通信系统中交换信息的表示方式,包括数据格式交换,数据加密与解密,数据压缩与终端类型转换等
会话层 :它具体管理不同用户和进程之间的对话,如控制登陆和注销过程
2.TCP协议:TCP协议为了更容易的传送大数据将数据分割,而且TCP协议能够确认数据最终是否送达到对方。
TCP协议为了将数据准确的送达到目标采用了三次握手协议:发送端首先发送一个SYN标志的数据包给对方。接收端收到后回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送方再回传一个带ACK标志的数据包,代表‘握手成功’;
注:若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。



二.简单的HTTP协议
1.作用:用于客户端和服务器端的通信
HTTP协议规定:请求从客户端发出,最后服务器响应该请求并返回数据。
HTTP协议是不保存状态的协议,即无状态协议,协议本身并不保留之前一切的请求或响应豹纹的信息。
2.客户端发送请求之请求报文:
例:GET /index.htm HTTP/1.1
HOST:harkr.jp
解析:起始行开头的GET表示请求访问服务器的类型;随后的index.htm指明了请求访问的资源对象,也就是请求的URL;最后的HTTP/1.1即HTTP的版本号
请求报文是由请求方法、请求URL协议版本、可选的请求首部字段和请求体构成
例:(稍后详解各字段含义)
POST form/entry HTTP/1.1 请求行 (1) (方法,URl,协议版本)
Host:harkr.jp 请求首部字段(2~5)
Connection:keep-alive
Connect-Type:application/x-www-form-urlencoded
Connect-Length:16
空行(6)
name-ueno&age=37 请求体(7)
3.服务器端端接收请求之响应报文:
响应报文由协议版本、状态码、用于解释状态码的原因短语、可选的响应首部字段和响应实体构成
例:HTTP/1.1 200 OK 状态行(1)(协议版本,状态码,解释状态码的原因短语)
Data:Tue,10 Jul 2017 06:50:15 GMT 响应首部字段(2~4)
Connect-Length:16
Connect-Type:text/html
空行(5)
<html> 响应主体(6)
...
4.HTTP方法
GET:获取资源
GET方法用来请求访问以被URL识别的资源。指定的资源经服务器端解析后返回响应内容。如果请求的资源是文本,那就保持原样返回;如果是像通用网关接口那样的程序,则返回经过执行后的输出结果。
例1:请求:GET /index.html HTTP/1.1
Host:www. harkr.jp
响应:返回index.html页面的资源
例2:请求:GET /index.html HTTP/1.1
Host: www. harkr.jp
If-Modified-Since: Tue,10 Jul 2017 06:50:15 GMT
响应:仅返回2017年7月10日6点50分之后更新的index.html页面的资源,如果未有内容更新,则返回状态码304
POST:传输实体主体
POST方法用于传输实体的主体。虽然GET方法也可以传输实体的主体,但一般不用GET,而用POST
例1:请求:POST /submit.cgi HTTP/1.1
Host: www. harkr.jp
Connect-Length:16
响应:返回 submit.cgi 接收数据的处理结果
PUT:传输文件
PUT方法用来传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置。
例1:请求:PUT /example.html HTTP/1.1
Host: www. harkr.jp
Connect-Type:text/html
Connect-Length:16
响应:响应返回状态码204 No Content(比如:该html已存在于服务器上)
HEAD:获得报文首部
HEAD方法和GET方一样,只是不返回报文主体部分。用于确认URI的有效性以及资源更新的日期等
例1:请求:HEAD /submit.cgi HTTP/1.1
Host: www. harkr.jp
响应:返回index.html有关的响应首部
DELETE:删除文件
DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URL删除指定的资源
例1:请求:HEAD /submit.cgi HTTP/1.1
Host: www. harkr.jp
响应:响应返回状态码204 No Content(比如:该html已存从服务器上删除)
OPTIONS:询问支持的方法(仅1.1版本)
OPTIONS方法用来查询针对请求URL指定的资源支持的方法
例1:请求:OPTIONS *HTTP/1.1
Host: www.harkr.jp
响应:HTTP/1.1 200 OK
Alllow:GET,POST,HEAD,OPTIONS
(返回服务器上服务器上支持的方法)
TRACE:追踪路径(仅1.1版本)
CONNECT:要求用隧道协议连接代理(仅1.1版本)
LINK:建立与资源之间的联系
UNLINK:断开联系
5.HTTP报文信息
请求报文:
报文首部 //服务器端或客户端需处理的请求或响应的内容及属性
空行
报文主体 //应被发送的数据
其中,请求报文包括:请求行,请求首部字段,通用首部字段,实体首部字段,其他;
请求行:包含请求的方法,URL以及HTTP版本
首部字段:包含表示请求和响应的各种条件和属性的各类首部
响应报文:
报文首部 //服务器端或客户端需处理的请求或响应的内容及属性
空行
报文主体 //应被发送的数据
其中,响应报文包括:状态行,响应首部字段,通用首部字段,实体首部字段,其他;
状态行:包含响应结果的状态码,原因短语以及HTTP版本
6.HTTP/1.1 首部字段一览
通用首部字段
首部字段名 说明
Cache-Control 控制缓存的行为
Con nection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

请求首部字段
首部字段名                   说明
Accept                         用户代理可处理的媒体类型
Accept-Charset            优先的字符集
Accept-Encoding         优先的内容编码
Accept-Language        优先的语言(自然语言)
Authorization               Web认证信息
Expect                          期待服务器的特定行为
From                             用户的电子邮箱地址
Host                              请求资源所在服务器
If-Match                        比较实体标记(ETag)
If-Modified-Since          比较资源的更新时间
If-None-Match              比较实体标记(与 If-Match 相反)
If-Range                        资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since     比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards               最大传输逐跳数
Proxy-Authorization     代理服务器要求客户端的认证信息
Range                           实体的字节范围请求
Referer                          对请求中 URI 的原始获取方
TE                                  传输编码的优先级
User-Agent                   HTTP 客户端程序的信息

响应首部字段 
首部字段名                     说明
Accept-Ranges             是否接受字节范围请求
Age                               推算资源创建经过时间
ETag                              资源的匹配信息
Location                        令客户端重定向至指定URI
Proxy-Authenticate      代理服务器对客户端的认证信息
Retry-After                   对再次发起请求的时机要求
Server HTTP                  服务器的安装信息
Vary                              代理服务器缓存的管理信息
WWW-Authenticate     服务器对客户端的认证信息

实体首部字段
首部字段名                    说明
Allow                            资源可支持的HTTP方法
Content-Encoding       实体主体适用的编码方式
Content-Language      实体主体的自然语言
Content-Length           实体主体的大小(单位:字节)
Content-Location        替代对应资源的URI
Content-MD5              实体主体的报文摘要
Content-Range            实体主体的位置范围
Content-Type              实体主体的媒体类型
Expires                         实体主体过期的日期时间
Last-Modified              资源的最后修改日期时间

部分字段详解
6.3.1  Cache-Control
通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制。

图:首部字段Cache-Control 能能够控制缓存的行为 
指令的参数是可选的,多个指令之间通过“,”分隔。首部字段 Cache-Control 的指令可用于请求及响应时。
Cache-Control: private, max-age=0, no-cache​

Cache-Control: no-cache:这个很容易让人产生误解,使人误以为是响应不被缓存。 实际上Cache-Control: no-cache是会被缓存的
只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
Cache-Control: no-store:这个才是响应不被缓存的意思。

Cache-Control 指令一览:
可用的指令按请求和响应分类如下所示。
表 6-5: 缓存请求指令
指令                                参数         说明
no-cache                          无            强制向源服务器再次验证
no-store 无 不缓存请求或响应的任何内容
max-age = [ 秒] 必需 响应的最大Age值
max-stale( = [ 秒]) 可省略 接收已过期的响应
min-fresh = [ 秒] 必需 期望在指定时间内的响应仍有效
no-transform 无 代理不可更改媒体类型
only-if-cached 无 从缓存获取资源
cache-extension - 新指令标记(token)
表 6-6: 缓存响应指令
指令                                 参数           说明
public                              无              可向任意方提供响应的缓存
private                            可省略        仅向特定用户返回响应
no-cache                        可省略        缓存前必须先确认其有效性
no-store                         无              不缓存请求或响应的任何内容
no-transform                 无               代理不可更改媒体类型
must-revalidate             无              可缓存但必须再向源服务器进行确认
proxy-revalidate             无              要求中间缓存服务器对缓存的响应有效性再进行 确认
max-age = [ 秒]             必需            响应的最大Age值
s-maxage = [ 秒]           必需             公共缓存服务器响应的最大Age值
cache-extension           -                 新指令标记(token)
6.3.2  Connection
Connection 首部字段具备如下两个作用。
  • 控制不再转发给代理的首部字段 
  • 管理持久连接
   1. 控制不再转发给代理的首部字段

在客户端发送请求和服务器返回响应内,使用 Connection 首部字段,可控制不再转发给代理的首部字段(即 Hop-by-hop 首部)。
Connection: 不再转发的首部字段名
  2. 管理持久连接 
 
Connection: close
HTTP/1.1 版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close。


Connection: Keep-Alive 
HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。为此,如果想 在旧版本的 HTTP 协议上维持 持续连接,则需要指定 Connection 首部字段的值为 Keep-Alive
如上图①所示,客户端发送请求给服务器时,服务器端会像上图②那样加上首部字段 Keep-Alive 及首部字段 Connection 后返回响应。
太多了,下边的内容只记重要的部分,做了省略。ppt 93页
6.3.3 Date 首部字段
Date 表明创建 HTTP 报文的日期和时间
6.3.4  Pragma
Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。
规范定义的形式唯一,如下所示。
Pragma: no-cache​
该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存 的资源。
所有的中间服务器如果都能以 HTTP/1.1 为基准,那直接采用 Cache-Control: no-cache 指定缓存的处理方式 是最为理想的。但要整体掌握全部中间服务器使用的 HTTP 协议版本却是不现实的。因此,发送的请求会同 时含有下面两个首部字段。
Cache-Control: no-cache
Pragma: no-cache​
6.3.5 Expires  实体主体过期的日期时间
有了Pragma来禁用缓存,自然也需要有个东西来启用缓存和定义缓存时间,对http1.0而言,Expires就是做这件事的首部字段。 Expires的值对应一个GMT(格林尼治时间),比如 Mon, 22 Jul 2002 11:12:01 GMT 来告诉浏览器资源缓存过期时间,如果还没过该时间点则不发请求。
如果Pragma头部和Expires头部同时存在,则起作用的会是Pragma,需要注意的是,响应报文中Expires所定义的缓存时间是相对服务器上的时间而言的,其定义的是资源“失效时刻”,如果客户端上的时间跟服务器上的时间不一致(特别是用户修改了自己电脑的系统时间),那缓存时间可能就没啥意义了。
注意:若报文中同时出现了 Expires 和 Cache-Control,则以 Cache-Control 为准。
  也就是说优先级从高到低分别是 Pragma -> Cache-Control -> Expires 。
6.3.6 Trailer
 

首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传 输编码时。
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Content-Type: text/html...
Transfer-Encoding: chunked
Trailer: Expires...(报文主体)...0
Expires: Tue, 28 Sep 2004 23:59:59 GMT
以上用例中,指定首部字段 Trailer 的值为 Expires,在报文主体之后(分块长度 0 之后)出现了首部字段 Expires。
6.3.7 Transfer-Encoding
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56
GMTCache-Control: public, max-age=604800
Content-Type: text/javascript;
charset=utf-8
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=bloc
kContent-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive
 cf0    ←16进制(10进制为3312) ...3312字节分块数据... 392    ←16进制(10进制为914) ...914字节分块数据... 0
以上用例中,正如在首部字段 Transfer-Encoding 中指定的那样,有效使用分块传输编码,且分别被分成 3312 字节和 914 字节大小的分块数据。
6.3.8 Upgrade
首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定 一个完全不同的通信协议。
6.3.9 Via
使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
6.3.10 Warning
HTTP/1.1 的 Warning 首部是从 HTTP/1.0 的响应首部(Retry-After)演变过来的。该首部通常会告知用户一 些与缓存相关的问题的警告。
Warning: 113 gw.hackr.jp:8080 "Heuristic expiration" Tue, 03 Jul 2012 05:09:44 GMT
Warning 首部的格式如下。最后的日期时间部分可省略。
Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])​

详细参考: https://www.cnblogs.com/jycboy/archive/2017/02/17/http_head.html
(前端小白,如有错误,欢迎指正~~)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值