一.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请求到服务器接收,中间会经过一系列的流程。
![](https://i-blog.csdnimg.cn/blog_migrate/66c34ee9484b173cf6f5cbbfd6f817a8.jpeg)
简括就是: 从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接, 再到网络层的ip寻址,再到数据链路层的封装成帧, 最后到物理层的利用物理介质传输。
OSI七层框架:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
表示层
:主要处理两个通信系统中交换信息的表示方式,包括数据格式交换,数据加密与解密,数据压缩与终端类型转换等
会话层
:它具体管理不同用户和进程之间的对话,如控制登陆和注销过程
2.TCP协议:TCP协议为了更容易的传送大数据将数据分割,而且TCP协议能够确认数据最终是否送达到对方。
TCP协议为了将数据准确的送达到目标采用了三次握手协议:发送端首先发送一个SYN标志的数据包给对方。接收端收到后回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送方再回传一个带ACK标志的数据包,代表‘握手成功’;
注:若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
![](https://i-blog.csdnimg.cn/blog_migrate/a755f7ed15cd8060fb14450f7240cfd0.jpeg)
二.简单的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 的指令,就能操作缓存的工作机制。
![](https://i-blog.csdnimg.cn/blog_migrate/39577fd3cc203b27949ebdcd5a89a0a8.png)
图:首部字段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. 控制不再转发给代理的首部字段
![](https://i-blog.csdnimg.cn/blog_migrate/11334a07a38f793f8671f006d884a726.png)
在客户端发送请求和服务器返回响应内,使用 Connection 首部字段,可控制不再转发给代理的首部字段(即 Hop-by-hop 首部)。
Connection: 不再转发的首部字段名
2. 管理持久连接
![](https://i-blog.csdnimg.cn/blog_migrate/5f14e363e75173ada06fbc3daf8b7212.png)
Connection: close
HTTP/1.1 版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close。
![](https://i-blog.csdnimg.cn/blog_migrate/18ada67758fae8aabc3ed1afc70b3d66.png)
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
![](https://i-blog.csdnimg.cn/blog_migrate/1441e2101a7c8d02a8ba8959b2f9dea8.png)
首部字段 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://i-blog.csdnimg.cn/blog_migrate/546c2895082a018075b334c5fec867b1.png)
详细参考:
https://www.cnblogs.com/jycboy/archive/2017/02/17/http_head.html
(前端小白,如有错误,欢迎指正~~)