当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就会呈现出我们需要的web界面,那么,这个界面是怎么产生的?
web的界面是根据我们输入的URL(网址、地址),浏览器从服务器端获取对应的文件资源等信息,然后显示在浏览器上面。
像这种通过发送请求获取服务器资源的web浏览器等,都可以称之为客户端(client)
计算机与网络设备之间互相通信,双方就必须基于同样的方法。比如:如何发现通信目标、由谁发起通信、使用什么语言通信、怎么结束通信都需要事先确定,所有这些都需要一种规则,
这就是协议。协议中存在多种的内容;从电缆的规格到ip地址的选定方法,寻找异地用户的方法,建立通信的顺序,以及web页面显示需要处理的步骤等等
tcp/ip的分层
tcp/ip很重要的一个特点就是分层。按照层次分为以下四层:应用层,传输层,网络层和数据链路层
分层的好处:如果互联网只由一个协议统筹,那么某一地方出问题,整体都会出现问题,无法使用;分层后,只需替换出现问题的或者需要修改的即可,而且分层后针对具体的设计也变得更为简单
应用层:体系的最高层,应用进程间通信交互的规则
tcp/ip协议族预存了各类通用的应用服务,比如:
ftp:文件传输协议
dns:域名系统协议
smtp:电子邮件协议
以上几种是常用的几种,还有很多其他的协议,感兴趣的可以找找其他专业的书籍看看
传输层:提供处于网络连接中的两台计算机间的数据传输,其中包括tcp和udp两种性质不同的协议
tcp:传输控制协议,传输的单位为报文段,提供面向连接的,可靠的数据传输服务
udp:传输单位为用户数据报,它是尽最大努力的提供数据传输服务,不保证可靠性
网络层:又名网络连接层
用来处理在网络上流动的数据包(封装)。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机并把数据包传给对方
链路层:又名数据链路层,网络接口层
处理连接网络的硬件部分。比如控制操作系统、硬件的驱动、网络适配器、光钎等
数据的封装:
用户端发送一个请求,从应用层开始,一直到链路层,每一层都会被打上该层所属的首部信息;反之,接收端在层与层之间传输时,每经过一层会去掉该层的首部信息,这种做法叫做封装
IP协议:位于网络层,作用是把各种数据包传送给对方,而要准确的把数据传送给对方,就需要满足各类条件,其中有2个很重要的条件:ip地址和mac地址
ip地址相信有点基础的人都知道,就是节点被分配到的地址,mac地址则是指网卡所属的固定地址,ip和mac地址可以进行配对
ip间的通信依赖于mac地址,在信息传输中,有时候由于中转太多,因此会采用ARP协议,这是个用来解析地址的协议,通过ip地址就可以反查出对应的mac地址
tcp协议:位于传输层,确保传输的可靠性
数据传输中为了传输方便,会将大块数据分割成报文段,而tcp协议能确认数据最终是否传送给对方
为了准确传输,传输中采用了三次握手策略(这种手段可以理解为多次确认,来确保数据传输的可靠性)
dns协议:负责域名解析,位于应用层,提供域名到ip地址间的解析
通过域名查找ip地址,或者逆向从ip地址反查域名
URL和URI
URL:统一资源定位符:表示资源的地点,具体指向(门牌号)
URI:统一资源标识符:用字符串标识某些互联网资源(该门牌号的地方具体有什么资源)
URL是URI的子集
下面就是客户端和服务端之间简单的通信过程
PS:请求必须从客户端建立通信,服务端没收到请求之前不会发送响应
下面先来说说请求的构成:
1)请求方法URI协议/版本
2)请求头(RequestHeader)
3)请求正文
下面是一个请求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;WindowNT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
以上请求中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。
根据HTTP标准,HTTP请求可以使用多种请求方法。具体的方法以及区别后面我们介绍。
2)请求头
请求头和请求正文之间是一个空行,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
在以上的例子中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。
HTTP响应与HTTP请求相似,HTTP响应也由3个部分构成:
1)状态行
2)响应头
3)响应正文
在接收和解释请求消息后,服务器会返回一个HTTP响应消息。
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。
格式:HTTP-VersionStatus-CodeReason-PhraseCRLF
例如:HTTP/1.1200OK
状态代码:
状态代码由3位数字组成,表示请求是否被理解或被满足。
状态描述:
状态描述给出了关于状态代码的简短的文字描述。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。
第一个数字有五种可能的取值:
-1xx:指示信息—表示请求已接收,继续处理。
-2xx:成功—表示请求已经被成功接收、理解、接受。
-3xx:重定向—要完成请求必须进行更进一步的操作。
-4xx:客户端错误—请求有语法错误或请求无法实现。
-5xx:服务器端错误—服务器未能实现合法的请求。
状态代码状态描述说明
200OK客户端请求成功
400BadRequest由于客户端请求有语法错误,不能被服务器所理解。
403Forbidden服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404NotFound请求的资源不存在,例如,输入了错误的URL。
500InternalServerError服务器发生不可预期的错误,导致无法完成客户端的请求。
响应头
响应头可能包括:
Location:响应报头域用于重定向接受者到一个新的位置。
Server:响应报头域包含了服务器用来处理请求的软件信息。它和User-Agent请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息。
Content-Encoding:实体报头域被使用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
Content-Language:实体报头域描述了资源所用的自然语言。Content-Language允许用户遵照自身的首选语言来识别和区分实体。
Content-Length:实体报头域用于指明正文的长度,以字节方式存储的十进制数字来表示,也就是一个数字字符占一个字节,用其对应的ASCII码存储传输。
要注意的是:这个长度仅仅是表示实体正文的长度,没有包括实体报头的长度。
Content-Type:实体报头域用语指明发送给接收者的实体正文的媒体类型。
Expires:Thu,15Sep200516:00:00GMT
下面是一个HTTP响应的例子:
HTTP/1.1200OK
Server:ApacheTomcat/5.0.12
Date:Mon,6Oct200313:23:42GMT
Content-Length:112
1)无状态
这种设置的好处是:更快的处理更多的请求事务,确保协议的可伸缩性
不过随着web的不断发展,有时候,需要将这种状态进行保持,随即,就引入了cookie技术,cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。
有关cookie的内容后面我们再说。。。
2)持久性
3)管线化
4)内容编码
例如上面的报文信息中,Accept-Encoding就定义了内容编码的格式:gzip
有下面几种方式:
gzip:GNU压缩格式
compress:UNIX系统的标准压缩格式
deflate:是一种同时使用了LZ77和哈弗曼编码的无损压缩格式
identity:不进行压缩
5)多部分对象集合
有的时候传输的内容,不仅仅是一些字符串,还有可能是一些图片,字符,音乐二进制等混杂的内容。
这就需要使用多部分对象集合,multipart,例如在使用java编写web上传文件的代码时,需要在form中指定form的编码格式。
设置form的enctype属性的值为multipart/form-data。
这是因为默认的情况下form使用的编码格式是:applicatin/x-www-form-urlencoded,这种编码格式会把所有的内容进行编码,不适合上传文件这种情况。
这两种编码格式的区别主要是:
multipart/form-data会以控件为基准,编码form中的内容。
application/x-www-form-urlencoded会把form中的内容编码成键值对的形式。
6)范围请求
1)GET:获取资源
GET方法用来请求访问已被URL识别的资源
2)POST:传输实体主体
POST方法用来请求服务器传输信息实体的主体
GET和POST的区别:
首先,使用目标不同:GET方法只是用来查询,不会对浏览器上的信息产生影响,每次GET的方法都是相同的
其次,大小不同:GET是放在URL首部,因此大小随着浏览器而定,而POST则是在报文中,只要没有具体限制,文件的大小是没限制的
然后,安全性不同:GET采用的是明文传输,而POST是放在报文内部,无法看到
接下来介绍其他几种数据传输方式:
3)PUT:传输文件
PUT要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置
处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法
4)HEAD:获得报文首部
5)DELETE:删除文件
DELETE是与PUT相反的方法,是按请求URI删除指定的资源
6)OPTIONS:询问支持的方法
用来查询针对请求URI指定的资源支持的方法
7)TRACE:追踪路径
是让web服务器端将之前的请求通信还回给客户端的方法
发送请求时,在Max-Frowards首部字段中填入数值,每经过一个服务器端就-1,当数值为0时,停止传输,最后收到服务器返回状态码200OK的响应
但是,这种方法基本很少使用,而且很容易引起XST(跨站追踪)攻击,就更不会用到了。
8)CONNECT:要求采用隧道协议连接代理
该方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经过网络传输。
其中,LINK和UNLINK已被HTTP1.1废弃,不再支持!
状态码的类别如下:
1、2XX成功:请求被正常处理
1.1200OK
表示从客户端发来的请求在服务器端被正常处理
1.2204NoContent
表示服务器接收的请求以成功处理,但没有资源可返回,即:响应报文中不含实体的主体部分
1.3206PartialContent
表示客户端进行了范围请求且服务器成功执行了这部分的GET请求,响应报文中包含由Content_Range指定范围的实体内容
“Content_Range为请求首部的一种类型,后面的随笔会讲到”
2.1301MovedPermanently
永久性重定向:表示请求的资源已被分配了新的URI,以后应使用资源现在的URI,如果已经保存了书签,这时候应该按照Location首部提示的URI重新保存
2.2302Found
临时性重定向:表示请求的资源已被分配到了新的URI,希望(本次)能使用新的URI访问
2.3303SeeOther
表示请求对应的资源存在另一个URI,应该使用GET方法定向获取请求的资源
PS:当301、302、303响应状态码返回,几乎所有浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求自动再次发送
301、302标准禁止将POST改为GET,但实际中都会允许这么做~~~GG
2.4304NotModified
表示客户端发送得附带条件的请求时,服务器运行请求访问,但未满足条件的情况,304返回时,不包含任何响应的主体部分
附带条件:采用GET方法的请求报文中包含If-......条件的任一首部,后面的随笔中介绍
2.5307TemporaryRedirect
临时重定向:禁止将POST转换为GET,该状态码会严格遵守浏览器标准
3、客户端错误:4XX的响应结果表明客户端是发生错误的原因所在
3.1400BadRuquest
请求报文存在语法错误
3.2401Unauthorized
PS:若之前已经进行了一次请求,则表示用户认证失败
返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用来质询用户信息
3.3403Forbidden
对请求资源的访问被服务器拒绝(服务端没有必要给出拒绝的详细理由,如果想做说明,可在实体主体部分对原因进行描述)
3.4404NotFound
服务器上无法找到请求的资源
4、5XX服务器错误:服务器本身发生错误
4.1500InternalServerError
服务器端执行请求时发生错误
4.2503ServerUnavailable
服务器暂时处于超负载或者正在停机维护,现在无法处理请求
比如提供web托管服务的供应商,可以用一台服务器为多为客户服务,也可以以每位客户持有的域名运行各自不同的网站,这里利用了虚拟服务器的功能。。。
在互联网上,域名通过DNS服务映射到IP地址之后访问目标网站,可见,请求发送到服务器时,已经是以IP地址形式访问
所以,如果一台服务器内托管了www.baidu.com和www.sina.com这两个域名,收到请求时就需要搞清楚究竟要访问哪个域名
在相同的IP地址下,发送请求时,必须在Host首部内完成指定主机名或者域名的URI。
2、通信数据的转发程序
2.1代理:具有转发功能的应用程序
扮演了客户端和服务器“中间人”的角色,接受请求并转发给服务器,同时也接受响应并返回给客户端
代理不会改变URI,会直接将请求发送给持有资源的源服务器,然后响应通过代理服务器后再传给客户端
代理服务器的优点:利用缓存技术(下文)减少网络带宽流量,组织内部针对特定网站的访问控制,获取访问日志为主要目的等
缓存代理:预先将资源的副本缓存在代理服务器上,再次受到对相同资源的请求时,可以将自己的缓存返回
透明代理:转发请求或者响应时,不对报文做任何加工的代理类型
2.2网关:转发其他服务器通信数据的服务器
接受客户端发来的请求,就像自己拥有资源的服务器一样处理请求
特点:提高通信安全性,可以在客户端和网关之间通信线路上加密以确保连接安全。
2.3隧道:在客户端和服务器之间进行中转,并保持双方通信连接的应用程序
特点:可以使用SSL等加密手段进行通信,确保客户端能与服务器进行安全的通信
3、资源的缓存
缓存是指代理服务器或者客户端本地磁盘内保存的资源副本。
3.1缓存的有效期
3.2客户端的缓存
缓存不仅可以存与代理服务器内,还可以存在客户端浏览器中。如果缓存有效,就可以直接从本地磁盘中读取资源
同样,当缓存过期,还是需要向源服务器请求资源
首先来看看报文结构吧
下面给大家示例一个访问my_view_page.php的请求报文首部信息
GET/my_view_page.phpHTTP/1.1
Host:10.0.17.183:8000
Connection:keep-alive
Cache-Control:max-age=0
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/51.0.2704.106Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
关于报文的首部信息,稍微详解
以下是刚才访问my_view_page.php时服务器返回的响应报文首部信息:
Cache-Control:no-store,no-cache,must-revalidate
Date:Tue,26Jul201609:32:11GMT
Expires:Tue,26Jul201609:32:12GMT
Vary:Accept-Encoding
Content-Encoding:gzip
Content-Length:3892
Content-Type:text/html;charset=utf-8
Last-Modified:Tue,26Jul201609:32:12GMT
3.1首部字段结构
首部字段名:字段值
例如:以Content-Type来表示报文主体的对象类型
Content-Type:text/html
Keep-Alive:timeout=15,max=100
3.2.1通用首部字段
定义:请求和响应报文都会使用的首部
3.2.2请求首部字段
3.2.3响应首部字段
3.2.4实体首部字段
3.2.5End-to-end首部和Hop-by-hop首部
端到端首部(End-to-endHeader)
此类别中的首部会转发给请求/响应对应的最终接受目标,而且必须保存在由缓存生成的响应中,另外规定它必须被转发。
逐跳首部(Hop-by-hopHeader)
Connection:
Keep-Alive
Proxy-Authenticate
Proxy-Authorization
Trailer
TE
Transfer-Encoding
Upgrade
通用首部字段的意思,就是:请求和响应报文双方都会使用的首部
1、Cache-Control
通过指定它的指令,能操作缓存的工作机制
指令参数是可选的,多个指令通过“,”分隔
Cache-Control:private,max-age=0,no-cache
Cache-Control指令一览:
1.1缓存请求指令
指令
参数
说明
no-cache
无
强制向源服务器再次验证
no-store
不缓存请求或相应的任何内容
max-age[秒]
必须
相应的最大Age值
max-stale(=[秒])
可省略
接收已过期的响应
min-fresh=[秒]
no-transform
代理不可更改媒体类型
only-if-cached
从缓存获取资源
cache-extension
新标记指令(token{-})
1.2缓存响应指令
public
可向任意方提供响应的缓存
private
仅向特定用户返回响应
缓存前必须先确认其有效性
不缓存请求或响应的任何内容
must-revalidate
可缓存但必须再向源服务器进行确认
proxy-revalidate
要求中间缓存服务器对换缓存的响应有效性再次确认
max-age=[秒]
必需
响应的最大Age值
s-maxage=[秒]
公共缓存服务器响应的最大Age值
新指令标记(token{-})
1.3public
共享、公开的缓存状态,与private相反
Cache-Control:public
1.4private
指定缓存对象,需要验证
Cache-Control:private
1.5no-cache
防止从缓存中返回过去的资源,请求中如包含该命令,表示客户端不会接收缓存过的响应,必须向源放武器转发请求
如果响应中包含该命令,那么缓存服务器不能对其资源进行缓存,且源服务器也将不在对缓存服务器请求中提出的资源有效性进行确认,且禁止其对相应资源进行缓存操作
Cache-Control:no-cache=Location
由服务器返回的响应报文首部字段中,若Cache-Control中对no-cache字段名具体制定参数值,那么客户端在收到这个被指定参数值的首部字段对应的报文后,就不能缓存
换言之,无参数值的首部字段可以使用缓存,只能在响应中制定该参数
1.6no-store
请求中包含机密信息,缓存不能在本地存储请求或响应的任一部分k
Cache-Control:no-store
1.7s-maxage
一般指代理服务器
与max-age指令相同,不同点在于s-maxage只适用于供多位用户使用的公共缓存服务器
当使用该指令时,直接忽略对Expires首部字段及max-age指令的处理
Cache-Control:s-maxage=604800(单位:秒)
1.8max-age
Cache-Control:max-age=604800(单位:秒)
1.9min-fresh
Cache-Control:min-fresh=60(单位:秒)
1.10max-stale
规定缓存的有效期,如指令中没有参数,则无论多久,客户端都可以接受响应,如指定了参数,即使过了有效期,只要在指令的范围内,客户端都可以接受响应
Cache-Control:max-stale
1.11only-if-cached
表示客户端只在缓存服务器有对应资源的情况下才接受响应,若无,则返回504
Cache-Control:only-if-cached
1.12must-revalidate
代理向客户端返回响应前再次向源服务器确认资源的有效性,若无,则返回504,且该指令会忽略请求中的max-stale指令
Cache-Control:must-revalidate
1.13proxy-revalidate
要求所有的缓存服务器在向客户端返回响应之前再次向源服务器确认资源的有效性
Cache-Control:proxy-revalidate
1.14no-transform
要求无论请求还是响应,都不能改变实体主体的媒体类型,防止缓存或者代理压缩图片等操作
Cache-Control:no-transform
2、Connection
该首部字段具备下面2个作用
1)控制不再转发给代理的首部字段
Connection:不再转发的字段名(即删除后再转发)
2)管理持久连接
Connection:close
Connection-Keep-Alive
3、Date
Date:Sun,31Jul201601:28:48GMT
4、Pragma
Pragma:no-cache
只用于客户端发送的请求中,客户端要求所有的中间服务器不返回缓存的内容
5、Trailer
6、Transfer-Encoding
规定报文主体的编码方式
Transfer-Encoding:chunked
7、Upgrade
客户端请求:
GMT/index.htmHTTP/1.1
Upgrade:TLS/1.0
Connection:Upgrade
服务器响应:
HTTP/1.1101SwitchingProtocols
Upgrade:TLS/1.0,HTTP/1.1
上面的例子中,首部字段Upgrade指定的值为TLS/1.0,这里的两个首部字段的对应关系,Connection的值被指定为Upgrade。
Upgrade对象仅限于客户端和邻近服务器之间,因此,使用首部字段Upgrade时,还需要额外指定ConnectionUpgrade
对于附有首部字段Upgrade的请求,服务器可以用101SwitchProtocols状态码作为响应返回
8、Via
使用首部字段Via是为了追踪客户端与服务器间的请求和响应报文的传输路径
Via不仅用于追踪报文的转发,还可避免请求回环的发生,因此,必须在经过代理时附加该首部字段内容
9、Warning
Warning的首部格式如下,日期部分可省略
另外,警告码具备扩展性,今后有可能追加新的警告
请求首部字段
1、Accept
通知服务器用户代理可处理的媒体类型及媒体类型的相对优先级,可使用type/subtype这种形式,一次指定多种媒体类型
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
q表示权重,默认值为1.0,当服务器提供多种内容时,将会有优先返回权重值最高的媒体类型
下面举几个例子:
文本文件:
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...
2、Accept-Cherset
通知服务器用户代理支持的字符集及字符集的相对优先级,可一次性指定多个字符集。
该首部字段可用权重q值来表示相对优先级
该首部字段应用于内容协商机制的服务器驱动协商
Accept-Charset:iso-8859-5,unicode-1-1;q=0.8
3、Accept-Encoding
告知服务器用户代理支持的内容编码及内容编码优先级顺序,可一次性指定多种内容编码
常用的几种编码格式:
gizp:由文件压缩程序gzip(GUNzip)生成的编码格式
compress:由UNIX文件压缩程序compress生成的编码格式
deflate:组合使用zlib格式及由deflate压缩格式生成的编码格式
jdentity:不执行压缩或不会变化的默认编码格式
同样,这里可以使用q值表示相对优先级,也可以使用(*)作为通配符,指定任意的编码格式
4、Accept-Lanuage
告知服务器用户代理能够处理的自然语言集,以及其相对有限集,可一次指定多种自然语言集
同样可使用权重值q表示相对优先级
Accept-Lanuage:zh-cn,zh;q=0.7,en=us,en;q=0.3
5、Authorization
告知服务器用户代理的认证信息(证书值)。
通常想要通过验证的用户代理会在接受到第一次返回的401状态码响应后,把首部字段加入请求中,共用缓存接收到含有该字段的请求时操作处理会有所差异
6、Expect
客户端使用该字段告知服务器,期望出现某种特定行为
如果服务器无法理解期望作出回应而发生错误,会返回状态码417ExpectFailed,客户端可以利用该字段,写明所期望的扩展
Expect:100-continue
7、From
告知服务器使用用户代理的用户垫子邮件地址
目的:显示搜索引擎等用户代理的负责人的电子邮件联系方式
From:IMyalost@163.com
8、Host
告知服务器请求的资源所处的互联网主机名和端口号
Host首部字段是在HTTP/1.1规范内唯一一个必须被包含在请求内的首部字段
Host:www.baidu.com
9、If-Match
格式如If-xxx这样的请求首部字段,都可以称之为条件请求,服务器收到请求,只有判定条件为真时,才会执行请求
该字段告知服务器匹配资源所用的实体标记(ETag)值,这时无法使用弱ETag值
如果判断条件不为真,则返回412PreconditionFailed响应
还可以使用(*)指定If-Match的字段值,这种情况下服务器将忽略ETag值,只要资源存在就处理请求
If-Match:"123456"
10、If-Modified-Since
用于确认代理或者客户端拥有的本地资源的有消息
If-Modified-Since:Thu,15Apr200400:00:00GMT
11、If-None-Match
条件请求,和If-Match作用相反。当该字段值的实体标记(ETag)值与请求资源的ETag不一致时,告知服务器处理该请求
在GET或HEAD方法中使用该字段可获取最新的资源
12、If-Range
条件请求,告知服务器若指定的值和请求资源的值一致,则作为范围请求处理,反之,则返回全部资源
request:response:
GET/index.html206PartialContent
If-Range:"123456"Content-Range:bytes5001-10000/10000
Range:bytes=5001-10000Content-Length:5000
上面的请求和资源匹配一致,那么久作为范围请求处理
13、If-Unmodified-Since
条件请求,该字段和If-Unmodified-Since字段作用相反,作用是告知服务器,指定的请求资源只有在字段值内指定的日期之后,未发生更新的情况下,才能处理请求。
If-Unmodified-Since:Thu,03Jul201600:00:00GMT
14、Max-Forwards
通过TRACE或者OPTIONS方法,发送包含该字段的请求时,该字段以十进制整数形式指定可经过的服务器最大数目
简单来讲,就是指定Max-Forwards的值,每经过一次转发,就-1.当值变为0.直接返回响应
Max-Forwards:10
15、Proxy-Authorization
收到代理服务器发来的认证质询时,客户端向代理服务器发送包含首部字段的请求,以告知服务器所需要的认证的信息
Proxy-Authorization:BasicdGLwoPNLAGKGFY5
16、Range
对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围
接收到附带Range字段的服务器,会返回206PartialContent的响应;无法处理请求时,则返回200OK的响应及全部资源
Range:bytes=5001-10000
17、Referer
告知服务器请求的原始资源的URI
Referer:www,baidu.com/index.xml
18、TE
告知服务器客户端能够处理响应的传输编码方式及相对优先级
TE:gzip,deflate;q=0.5
该字段还可以指定伴随trailer字段的分块传输编码的方式
TE:trailers
19、User-Agent
该字段会将创建请求的浏览器和用户代理名称等信息传给服务器
如果由网络爬虫发起请求,可能会在请求中添加爬虫作者的垫子邮件地址。因此,如果请求经过代理,那么中间也很可能被添加上代理服务器名称
User-Agent:Mozilla/5.0(windowsNT6.1;WOW64;rv13.0)Gecko/=20100101Firfox/13.0.1
响应首部字段:
服务器向客户端返回响应报文中所使用的字段,用于补充的附加信息、服务器信息、以及对客户端的附加要求等
1、Accept-Ranges
告知客户端服务器能否处理范围请求,以指定获取服务器的某部分资源
可指定的字段值分2种:
1.1bytes:可处理范围请求
1.2none:不能处理范围请求
Accept-Ranges:bytes
2、Age
告知客户端源服务器创建响应多久了,单位S
Age:600
3、ETag
告知客户端实体标识。
这是一种将资源以字符串形式做唯一标识的一种方式,服务器会为没份资源分配对应的ETag值
另外,当资源更新时,ETag值也需要更新
ETag:"82e22293907ce725faf67773957acd12"
强ETag值和弱ETag值
3.1强ETag值:不论实体发生多么细微的变化,都会改变其值
ETag:"usagi-1234"
3.2弱ETag值
只提示资源是否相同;只有资源发生了根本改变,产生差异才会改变ETag值,此时,会在字段值最开始处附加W/
ETag:W/"usagi-1234"
4、Location
将响应接受方引导至某个与请求URI位置不同的资源
基本上该字段都会配合3xx:Redirction的响应,提供重定向的URI
5、Proxy-Authenticate
把代理服务器所要求的认证信息发给客户端,他的认证行为在客户端与代理间进行
Proxy-Authenticate:basicrealm="UsagidesignAuth"
6、Retry-After
告知客户端在多久之后再次发送请求,主要配合状态码503ServiceUnavailable响应,或者3XXRedirect响应一起使用
Retry-After:120
7、Server
Server:Apache/2.2.17(Unix)
Server:Apache/2.2.6(Unix)PHP/5.2.5
8、Vary
控制缓存。源服务器向代理传达关于本地缓存使用方法的命令
客户端收到从代理服务器收到的从源服务器返回的包含该字段指定项的响应之后,若再次进行缓存,仅对请求中含有相同字段的请求返回缓存
Vary:Accept-Language
9、WWW-Authenticate
HTTP访问认证。告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的查询
状态码401Unauthorized响应中,肯定包含该字段
1、定义
2、Allow
Allow:GET,HEAD
3、Content-Encoding
告知客户端服务器对实体的主体部分的选用的内容编码方式
内容编码指在不丢失实体信息的前提下所进行的压缩
主要采用以下这四种内容编码方式
gizp,conpress,deflate,identity
Content-Encoding:gizp
4、Content-Lanuage
告知客户端实体主体使用的自然语言(优先接收的语言)
Content-Lanuage:zh-CN
5、Content-Length
表明实体主体部分的大下(单位是字节)
若对实体主体进行编码传输,不能使用该字段
Content-Length:15000
6、Content-Location
给出了与报文主体部分相对应的URI。与Location不同,该字段表示的是报文主体返回资源的URI
7、Content-MD5
由一串由MD5算法生成的值,其目的在于检查报文主体在传输中是否保持完整,以及确认传输到达。
Content-MD5:OFJKGKLDFUIGNG35565FGNHLDGNH==
8、Content-Range
告知客户端作为响应返回的实体的哪个部分符合范围请求,(单位:字节),表示当前发送部分及整个实体大小
Content-Range:bytes5001-10000/10000
9、Expires
告知客户端资源失效的日期
如果首部字段存在Cache-Control有指定max-age指定时,会优先处理max-age指令
Expires:Wed,04Jul201609:26:05GMT
10、Last-Modified
Last-Modified:Wed,04Jul201609:26:05GMT
这部分主要是附带说说,一般工作中不常用到,但了解也是很有好处的--
为Cookie服务的首部字段
Cookie的工作机制是用户识别及状态管理。
实现原理:方便管理用户状态,通过web浏览器将一些数据临时写入用户的计算机内,当用户访问时可通过通信方式取回之前发送的Cookle
调用Cookie的时候,由于可以调用Cookie的有效期,以及发送方的域、路径、协议等信息,所以正规发布的Cookie不是因为来自其他web站点和攻击者的攻击而泄漏
为Cookle服务的首部字段:
1、Set-Cookie字段的属性:
1)expires
指定浏览器可发送Cookie的有效期
一旦Cookie从服务端发送到客户端,服务器就不存在可显式删除Cookie的方法,但可通过覆盖已过期的Cookie,实现对客户端的实质性删除
2)path
用于限制指定Cookie发送范围的文件目录
3)domain
通过该属性指定的域名可做到与结尾匹配一致
除了针对具体指定的多个域名发送的Cookie外,不指定domain属性显得更安全
4)secure
限制web界面仅在HTTPS安全连接时,才可以发送Cookie
发送Cookie时,指定属性的方法如下:
Set-Cookie:name=value;secure
5)HttpCookie
Cookie的扩展功能,使JavaScript脚本无法获得Cookie。主要目的是为了防止跨站脚本攻击对Cookie的信息窃取
发送指定HttpOnly属性的方法如下:
Set-Cookie:name=value;HttpOnly
2、Cookie
△通信使用明文(不加密),内容可能会被窃听
△不验证通信方的身份,因此可能遭遇伪装
△无法证明报文的完整性,所以有可能已被篡改
其他未加密的协议也存在这类问题
△某些特定web服务器和特定web浏览器存在安全漏洞
1、通信使用明文可能被窃听
TCP/IP协议族的通信机制:通信内容在所有通信线路上都可能被窥视
应对措施:对通信进行加密处理防止被窃听
加密对象:
①.通信的加密
②.内容的加密
主要应用于WEB服务中(但仍然有被篡改的风险)
2、不验证通信方身份,可能遭遇伪装
任何人都可以发起请求,服务器只要接收到请求,不管对方是谁都会返回一个响应(仅限于发送端IP和端口号没有被WEB服务器设定限制访问的前提下)
①.无法确定请求发送至目标的web服务器是否是按真实意图返回响应的服务器;有可能是已伪装的服务器
②.无法确定响应返回到的客户端是否是按真实意图接受响应的那个客户端;有可能是已伪装的客户端
③.无法确定正在通信的对方是否具备访问权限;因为某些web服务器保存有重要信息,只发给特定用户通信的权限
④.无法判断请求来自何方
⑤.即使时无意义的请求也会接收,无法阻止海量请求下的D0S攻击(DenialofService:拒绝服务攻击)
3、无法证明报文完整性,可能已遭篡改
完整性:指信息的准确度,若无法证明其完整性,意味着无法判断信息是否正确
称为中间人攻击(Man-in-the-Middleattack,MITM)
防止篡改:常用的方法有MD5和SHA-1等散列值校验的方法,以及来确认文件的数字签名方法
二、HTTP+加密+认证+完整性保护=HTTPS
3、加密技术
SSL采用公开密钥加密(Public-keycryptography)的加密处理方式,加密方法中加密算法是公开的,但密钥是保密的,以保持加密方法的安全性(密钥用来对已经加密的内容进行解密)
加密和解密通用一个密钥的方式称为共享密钥加密(Commonkeycryptosystem),也称为对称密钥加密
公开密钥加密方式:
公开密钥加密使用一对非对称密钥,一把叫做私有密钥(privatekey),一把叫做公开密钥(publickey)
过程:发送密文的一方使用对方公开的密钥进行加密,对方收到被加密信息后,使用自己的私有密钥进行解密(要想根据密文和公开密钥解密,理论上可以,但实际操作起来,非常困难)
HTTPS采用混合加密机制
实际运用中应该合理运用两种加密机制的优势,组合起来进行通信(交换密钥环节利用公开密钥加密方式,建立通信交换报文阶段使用共享加密机制)
4、证书
处于客户端和服务器双方都可信赖的第三方机构立场,对通过申请的服务器公开密钥做数字签名,分配该公开密钥,将其与共钥证书绑定,然后服务器传给客户端,以进行公开密钥加密方式通信;
收到证书的客户端使用数字证书认证机构的公开密钥,对服务器证书的数字签名进行认证,然后明确2点:
①.认证服务器的公开密钥是真实有效的数字证书认证机构
②.服务器的公开密钥是指的信赖的
作用:
①.证明通信方的服务器是否规范
②.确认对方服务器背后运营的企业是否真实存在(拥有该功能的证书就是EVSSL证书:ExtendedValidationSSLCetificate);特点:浏览器背景色是绿色的
5、HTTPS安全通信机制
HTTPS通信过程:
①.客户端发送ClientHello报文开始通信,报文中包含客户端支持的SSL指定版本、加密组件、列表等
②.服务器接收到请求报文时,在响应报文中包含SSL版本以及加密组件发送ServerHello(加密组件内容从接收到的客户端加密组件中筛选出来)
然后服务器发送Certificate报文,其中包含公开密钥证书
最后服务器发送ServerHelloDone报文通知客户端,最初阶段的SSL握手协商部分结束
③.第一次握手结束,客户端ClientKeyExchange报文回应,报文中包含通信加密中使用的一种名为Pre-mastersercet的随机密码串(该报文已用上一步骤的公开密钥进行加密)
接着客户端你继续发送ChangeCipherSpec报文,该报文提示服务器,在此报文之后的通信采用Pre-mastersercet密钥加密
最后客户端发送Finished报文;该报文包含通信连接至今全部报文的整体校验值(这次握手能否成功,以服务器是否可以正确解密报文为判断标准)
④.服务器同样发送ChangeCipherSpec报文
服务器同样发送Finisher报文
⑤.服务器和客户端Finished报文交换完成后,SSL连接完成,通信收到SSL保护,
⑥.应用层协议开始通信,即HTTP请求
⑦.最后由客户端断开连接;断开连接时,发送close_notify报文,然后发送TCPFIN报文关闭与TCP的通信
上面的通信过程中,应用层发送数据时会附加MAC(MessageAuthenticationCode)报文摘要,MAC可查询报文是否遭受篡改,保护报文完整性
通信流程图(服务器公开密钥证书建立HTTPS的过程)
HTTPS使用SSL(SecureSocketLayer:安全套接字层)和TLS(TransportLayerSecurity:安全层传输协议)这两种协议
△:使用SSL时,处理速度回变慢
①.通信慢:通信时候大量消耗CPU及内存资源,相比较HTTP而已,网络负载可能变慢2-100倍(通信量增加)
②.加密处理:在服务器和客户端都要进行加密和解密,更多的消耗了服务器和客户端硬件资源,导致负载增强
改善方案:使用SSL加速器(专用服务器),为SSL通信专硬件,可以提高数倍SSL计算你速度,仅在SSL通信处理时发挥作用,以分担负载。
参考书籍——《HTTP权威指南》
1、web客户端和服务器
2、资源
web服务器是web资源的宿主,源头;最简单的web资源就是服务器文件系统中的静态文件,其中可能包含很多内容:文本文件、HTML文件、word文件、图片文件、Adobe的acrobat文件等
但资源不局限于静态文件,它还可以根据需要生成软件程序(比如照相机中活生生的照片、股票交易、房产交易的数据库、在线商店中的礼物等等)
2.1媒体类型
MIME:多用途英特网邮件扩展
web浏览器每次从服务器取回一个对象时,会先查看其MIME类型,看看能否处理该类型;大多数浏览器都可以处理数百种常见的对象类型
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔,例如
HTML格式的文本文档:text/html
普通的ASCII文本文档:text/plain
图片类型:image/jpeg、image/gif
2.2URI
每个服务器资源都有一个名字,这样客户端就可以说明它对什么资源感兴趣
服务器资源名称被称为:统一资源标识符(UniformResourceIdentifier,URI)
URI就像因特网上的邮政地址一样,在世界范围内唯一标识并且定位信息资源
2.3URL
URL:统一资源定位符是资源最常见的形式,它描述了一台特定服务器上某资源的特定资源,明确说明了如何从一个精确、固定的位置获取资源
上图的URL说明了协议、服务器和本地资源
大部分URL遵循一种标准格式,该格式包含三个部分:
第二部分:地址;比如:www.baidu.com
第三部分:指定服务器上某个资源,比如:specisal/saw-blade.gif
2.4URN
URI的第二种方式就是URN:统一资源名;URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关,使用URN,可以将资源四处转移,还可用同一个名字通过多种网络协议来访问资源
URN还处于试验阶段,因为其有效的工作需要一个支撑架构来解析资源的位置。而此类架构比较缺乏,后面详解介绍
3、事务
事务也可以理解为从客户端到服务器再到客户端,一次完整通信的过程
3.1方法
3.2状态码
每条响应报文都会携带一个状态码,用以告知客户端,请求结果,或是否需要其他动作,之前也有介绍过这几种状态码;
3.3一个web界面中可以包含多个对象
通常并不是单个资源,而是一组资源的集合(一个事务获得一种资源,不同的资源【甚至分布在不同服务器上】组合构成一个界面)
4、报文
构成:一行行简单的字符串组成
特点:纯文本,方便读写
请求报文(requestmessage):从客户端发往服务器
响应报文(responsemessage):从服务器发往客户端
起始行:报文第一行,用来说明要做什么,出现了什么情况
首部字段:位于起始行后面,有零个或者多个,每个首部字段都包含一个名字和一个值,便于解析,之间用冒号(:)隔开,以一个空行结束
主体:空行下面为报文主体,其中包含了所有类型的数据
5、连接协议
5.1TCP/IP
TCP特点:1)无差错的数据传输
2)按序传输(按照数据发送顺序到达服务器)
3)未分段的数据流(任意时刻任何大小将数据发出去)
英特网是全世界计算机和网络设备最常用的层次化分组交换网络协议集,其隐藏了网络和硬件的特点和弱点,使各类型的计算机和网络都能进行可靠的通信
下面是互联网协议的五层协议栈
5.2连接、IP地址及端口号
客户端向服务器发送请求报文之前,需要用网际协议(InternetProtocol,IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接通道
URL是资源的地址,自然能够为我们提供储存资源的机器的地址,看下面几个URL:
第一个使用了机器的IP地址207.200.83.29,以及端口号80
第二个使用了文本形式的域名(主机名:IP地址比较人性化的别称)。通过域名服务(DomainNameService,DNS)机制对主机名进行转换,后面详细介绍这一部分
第三个没有端口号,这种情况一般默认端口号为80。
步骤如下:
1)浏览器从URL中解析出服务器主机名;
2)浏览器将主机名转换为服务器的IP地址;
3)浏览器将端口号(如果有)从URL中解析出来;
4)浏览器建立一条与服务器的连接TCP连接通道;
7)结束通信,关闭连接,浏览器显示具体资源;
6、协议版本
7、web的结构组件
web的应用程序,除了浏览器和服务器之外,还有其他几个很重要的组件(以前的博客中有介绍,所以这里就大致说下,后面具体解释他们的功能用处)
web安全、应用集成以及性能优化的重要组成模块
出于通信安全考虑,会将代理做为转发所有web数据流的可信任中间节点使用,还可对请求响应进行过滤,后面详细介绍
web缓存或者代理缓存,可以将经过代理传送的常用的允许缓存的资源保存下来,下一个请求若有相同的资源,可直接享受该资源
7.3网关:连接其他应用程序的特殊web服务器
关于具体的网关的内容,后面详细介绍
自动搜索引擎“网络蜘蛛”就是Agent代理,可以全世界范围内获取web页面
一、URL的语法
URL是互联网资源的标准化名称
大部分URL都遵循通用的语法,而且不同URL方案风格和语法都有重叠
大多数URL协的语法都建立在下面9个部分构成的通用格式上:
其中最重要的3个部分是:方案(scheme)、主机(host)和路径(path)
通用URL组件:
1、方案-使用什么协议
方案:实际上规定了如何访问指定资源的主要标识符,它告诉负责解析URL的应用程序应该是用什么协议
方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL其余部分分隔开来。(方案名大小写不敏感)
2、主机与端口
想要在往上寻找到资源,应用程序需要知道哪台机器装载了资源,以及在机器的什么地方可以找到对目标资源进行访问的服务器,URL的主机和端口提供这2点信息
主机组件标识了往上能访问资源的宿主机器。可用主机名或者IP地址来表示主机名。比如下面2个URL就是指向同一个资源
IP指向:161.58.228.45:80/index.html
3、用户名和密码
有些服务器都要求输入用户名和密码才允许用户访问数据,比如FTP(文件传输协议),如下面几个例子
ftp://ftp.prep.ai.mit.edu/pub/gnu
没有用户名和密码,只有标准的协议、主机和路径;如果某个应用程序使用的URL协议要求输入用户名密码,但用户没有提供,通常会插入一个默认的用户名和密码,比如FTP
ftp://anonymous@ftp://ftp.prep.ai.mit.edu/pub/gnu
指定了一个用户名anonymous,与主机组合在一起,看起来像一个email地址一样;字符“@”将用户名和密码组件与其他部分分隔开来
ftp://anonymous:my_password@ftp://ftp.prep.ai.mit.edu/pub/gnu
指定了用户名和密码,两者之间由字符“:”隔开
4、路径
路径说明了请求的资源位于服务器的什么地方,通常是一个分级的文件系统路径;比如:
这个URL中的资源路径就是seasona/index-fall.html,很像Unix文件系统中的文件系统路径
5、参数
对很多协议来说,只有简单的主机名和到达对象路径的是不够的,除了端口和用户名密码,还需要更多的内容才可以访问
有些负责解析URL的应用程序需要协议参数才能工作;否则服务器不会提供服务,或者提供错误的服务,比如
ftp协议有两种传输方式:二进制和文本。如果用文本形式传送二进制图片,结果很难预料有多糟糕
参数组件是URL中的名值队列表,由“/”将其与其他部分分隔开,比如
ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d
参数为type=d,其中参数名为type,值为d
6、查询字符串
在我们发送请求时,很多的资源,比如数据库服务,都可以通过查询来缩小请求资源的类型范围,例如
问号(?)右边的内容就是这个URL的查询组件。URL的查询组件和标识网关资源的URL路径组件一起被发送给网关资源。可以将网关当做访问其他应用程序的访问点
如下图:查询目的是检查清单中是否size为large、color为blue的条目
网关基本都是希望查询字符串以一系列“名/值”对的形式出现,名值对之间用“&”分隔
上面的例子,查询组件有2个名/值对:item=12731和color=blue
7、片段
有些资源类型,比如HTML,除了资源级意外,还可以进一步划分,比如一个带有章节的大型文本文档,资源的URL会指向整个文档,但理想情况,可以指向资源中的章节
为了方便引用,URL允许使用片段(frag)组件来表示资源内的一个片段,片段挂在URL右边,最前面有一个字符“#”,比如:
这个例子中,片段引用了joes-hardwareweb服务器上页面/tools.html中的一个部分,这部分名字叫drills
服务器处理的是整个对象,URL片段仅由客户端使用并展示
二、URL快捷方式
web可以理解并使用URL的快捷方式,比如缩略,自动扩展(用户输入关键部分,浏览器负责填充)
1、相对URL
URL有2种方式:绝对的和相对的。目前为止,我们使用的URL基本都是绝对的,它包含了访问资源所需的全部信息
相对URL是不完整的,要从相对URL中获取访问资源的全部信息,就必须相对于另一个基础(base)的URL进行解析
相对URL是URL的一种便捷缩略记法,下面是一个嵌入了相对URL的HTML文档实例
toolspage
hammers
joe'shardwareonlinehasthelargestselectionof
虽然看起来不完整,但实际上是合法的相对URL,这个URL可以相对于它所在的文档中的URL对其进行解释
使用缩略形式的相对URL语法,写HTML时就可以省略URL中的方案、主机和其他一些组件,这些组件可以从所属资源的基础URL中推导出来,其他资源的URL也可以用这种缩略形式来表示
下图说明了如何从基础URL中推导出缺失的组件信息
相对URL只是URL的片段或一小部分,处理URL的应用程序需要在相对和决定URL之间进行转换
PS:相对URL为了保持一组资源(HTML页面)的便捷性提供了一种便捷方式,如果使用相对URL,可以在搬移一组文档时,仍保持链接的有效性;
因为相对URL是相对于新基础进行解释的,类似于在其他服务器提供镜像内容等功能
1.1基础URL
基础URL是作为相对URL的参考点来使用的,可以来自以下不同的地方:
在资源中显式提供:有些资源会显式指定基础URL
比如:HTML文档中可能会包含一个定义了基础URL的HTML标记
封装资源的基础URL:如果在一个没有显式指定基础URL的资源中发现一个相对URL,如上面的HTML文档所示,可将其所属资源的URL作为基础
没有基础URL:某些情况没有基础URL,一般意味着你有一个相对URL,但有时可能只是一个不完整或者损坏的URL
1.2解析相对引用
解析:要将相对URL转换为一个决定URL,需要将相对URL和决定URL划分成组件段,这样,实际上只是在解析URL,但这种做法会将其划分为一个个组件,可以称之为解析/分解URL
将基础和相对URL划分成组件,可以下用下图的算法来完成转换
这个算法将一个相对URL转换成了其绝对模式,之后,就可以用其引用资源
2、自动扩展URL
很多浏览器会在用户提交URL/输入URL时尝试自动扩展URL,这样为用户提供便捷,用户不需要输入完整的URL,浏览器自动扩展
自动扩展特性有以下2种方式:
2.1主机名扩展
2.2历史扩展
将以前用户访问过的URL记录储存起来,当用户输入URL时将其与历史记录中的URL前缀进行匹配,并提供一些完整的选项供用户选择
PS:与代理一起使用时,URL自动扩展的行为可能有所不同,后面详细解释
三、URL字符集
URL是可移植的:它命名了互联网上所有的资源,需要通过各种不同协议来传输资源,资源在传输时采取了不同的机制,因此,信息的安全传输就很重要
安全传输意味着URL传输不能丢失信息,但有些协议,比如SMTP(简单邮件传输协议),传输方法就是剥去一些特点的字符
URL是可读的:因此,即使不可见、不可打印的字符能穿过邮件程序,从而成为可移植的,也不能在URL中使用
URL是完整的:有人希望URL中包含初通用的安全字母表之外的二进制数据或字符,因此需要一种转义机制,将不安全的字符编码为安全字符再传输
1、URL字符集
1.1很多计算机应用程序使用的都是ASCII字符集,ASCII使用7位二进制码来表示大多数按键和少数不可控字符,其移植性也很好,但考虑到全球用户太多,以及有时候URL中会包含任意二进制数据
就需要将转义序列集成进来,通过转义序列将ASCII字符集的有限子集对任意字符值或数据进行编码,这样就实现了可移植和完整性
1.2编码机制
为了避开安全字符集带来的限制,人们设计了“转义”表示法来表示不安全字符,其中包含一个百分号(%),后面跟2个表示字符ASCII码的十六进制数,下面是几个例子
1.3字符限制
URL中,有几个字符被保留起来,有着特殊含义。有些字符不在定义的ASCII字符集中,还有些字符会和某些协议网关产生混淆,因此不赞成使用
四、常见协议
下面附录一个关于常用常见的协议列表
五、URL未来发展
URL可用来命名所有现存对象,其还提供一种可在各种协议间共享的统一命名机制,但并不完美;因为URL只表示实际地址,而不是准确的名字,意味着如果资源地址有变化,URL就无法对其进行定位
永久统一资源定位符(PURL),其本质是搜索资源过程中引入一个中间层,通过一个中间资源定位符(resourcelocator)服务器对资源的实际URL进行登记和追踪
客户端可以向定位符请求一个永久的URL,定位符可以以一个资源为响应,将客户端重定向到资源当前的URL去
一、报文流
可选的数据部分,这些报文在客户端、服务器和代理之间流动;常说的术语“流入”、“流出”、“上游”、“下游”就是描述报文方向的
1、报文流入源服务器
2、报文向下游流动
不管是请求还是响应报文,所有报文都会向下游流动,所有报文发送者都在接收者的上游,如下图
二、报文的组成
每条报文包含一个客户端请求或者服务端响应,由三部分组成:1)对报文进行描述的起始行;2)包含属性的首部(header)模块;3)可选的,包含数据的主体(body)部分
起始行和首部就是由行分隔的ASCII文本。每行都以一个由2个字符组成的行终止序列作为结束,包括一个回车符(ASCII码13)和一个换行符(ASCII码10),这个行终止
序列可以写为CRLF。(稳健的应用程序也应该接受单个换行符作为行的终止)
实体或报文的主体是一个可选数据块,与起始行和首部不同的是,主体中可包含文本或二进制数据,也可以为空
如上图,Content-type行说明了主体是一个纯文本文档,Content-length说明了主体有19字节
1、报文的语法
这是请求报文的格式这是响应报文的格式
下面是对各部分的简述:
方法(method):客户端希望服务器对资源执行的动作,是一个单独的词,比如GET、HEAD、POST等
请求URL(request-URL):命名了请求资源,或者URL路径组件的完整URL;如果直接与服务器进行对话,只要URL的路径是决定路径,通常不会出现问题(上一篇随笔有详细介绍URL......)
状态码还有一种可读版本,包含终止序列之前的版本;比如HTTP/1.1200NOTOK和HTTP/1.1200OK中原因短语不同,但同样被当做成功指示处理
首部(header):可以有0个或多个首部,每个首部包含一个名字,后面跟一个冒号,然后一个可选空格,接着一个值,最后是CRLF。首部由一个空行(CRLF)结束,表示首部列表的结束和实体主体的开始。
实体主体(entity-body):包含一个由任意数据组成的数据块。
2、起始行
2.1请求行
请求报文请求服务器对资源进行一些操作。请求报文起始行,称为请求行,包含一个方法和一个请求。
2.2响应行
2.3方法
具体的方法介绍下面会介绍
2.4状态码
状态码用来告诉客户端,发生了什么事;状态码位于响应的起始行中。状态码在每条响应报文的起始行中返回的,以一个数字和一个可读的状态组成;数字码便于程序进行差错处理,原因短语则便于理解
下面列出状态码的分类:
2.5原因短语
原因短语为状态码提供了文本形式的解释,和状态码成对出现,是状态码的可读版本,应用程序将其传给客户,说明在请求期间发生了什么;稍后会整理出一些状态码和其建议使用的一些原因短语
2.6版本号
通信时最好使请求和响应的版本号保持一致,否则很容易造成误解,使程序无法识别
PS:版本号不会被当做分数处理,每个数字都是独立的,比如,HTTP/2.22版本高于HTTP/2.3
3、首部
3.1首部分类
通用首部:即可出现在请求报文中,也可出现在响应报文中
请求首部:提供更多有关请求的信息
响应首部:提供更多有关响应的信息
实体首部:描述主体的长度和内容,或者资源本身
扩展首部:规范中没有定义的新首部
3.2首部延续行
将长的首部行分为多行可提高可读性,每行前面至少有一个空格或制表符(tab),例如
Conteng-Type:image/gif
Content-Length:8572
Server:TestServer
Version1.0
上面的例子,响应报文中包含一个Server首部,其值被划分为多个延续行,该首部完整值为Server:TestServerVersion1.0
4、实体的主体部分
三、方法
1、GET
GET是最常用的方法,通常用于请求服务器发送某个资源(资源是已被服务器识别或标识的)给客户端;如下图
服务器在获取GET请求参数时用Request.QueryString,意思为获取地址栏中的参数,就是“?”后面的参数,如果是多个,就用&连起来
2、HEAD
HEAD和GET方法类似,但在响应中只返回首部,不返回实体的主体部分。使用HEAD方法,可以
*在不获取资源的情况下了解资源的实际情况(资源类型)
*通过查看状态码,确认资源是否存在(有效性)
3、PUT
与GET相反,PUT方法会向服务器写入文档(有些系统会允许用户创建web界面,并用PUT方法直接将其安装到web服务器上)
PUT方法实际上就是让服务器用请求中包含的主体部分来创建一个由请求的URL命名的新文档;或者URL已存在的话,就用这个主体来替代它。
4、POST
5、TRACE
6、OPTIONS
请求web服务器告知其支持的各种功能;可以询问服务器支持哪些方法,或者对某些特殊资源支持哪些方法(有些服务器可能只支持对一些特殊类型的对象使用特定操作)
为客户端提供了一种手段:不用实际访问资源就可判定访问各种资源的最优方式
7、DELETE
8、扩展方法
下表列出了一些常用的扩展方法:
不是所有的扩展都是在正式规范中定义的,因此,扩展方法秉持“对发送内容要求严格,对所接受的内容宽容点”来处理一般的HTTP扩展方法很重要
四、状态码
响应报文的返回状态码分为五类,之前的随笔进行了介绍,这里就当做是补充吧
状态码是一种理解事务处理结果的便捷方式;下面列出一些常见的原因短语例子,都是目前最常用的HTTP/1.1规范推荐使用的
1、100~199——信息性状态码
1.1客户端与100Continue
如果客户端向服务器发送一个实体,并愿意在发送前等待100Continue响应,那么客户端就要发送一个携带了值为100Continue的EXpect请求首部;如果客户端没发送实体,
就不应发送100ContinueExpect首部。因此客户端只有在避免向服务器发送一个服务器无法处理或使用的较大的实体时,才应使用100Continue
1.2服务器与100Continue
如果服务器收到带有值为100Continue的Expect首部请求,它会用100Continue或一条错误码来响应;服务器永远不应向没有发送100Continue请求的客户端发送100Continue状态码
如果服务器在发送100Continue响应前收到部分或全部实体,说明客户端决定继续发送数据,此时,服务器不需要发送这个状态码,但读完请求,应继续返回一个最终状态码(跳过100Continue状态)
如果服务器收到带有100Continue的请求,且它决定在读完实体主体前结束请求,就不应仅仅发送一条响应并关闭连接,这样会影响客户端接收响应
1.3代理与100Continue
代理从客户端收到带有100Continue期望的请求,有以下几种情况:
2、200~299——成功状态码
下面列车一些服务器用来表示成功的状态码,分别对应不同的请求
3、300~399——重定向状态码
告知客户端使用替代位置来访问它感兴趣的资源;或提供一个替代的响应而不是资源内容
或在资源已被移动情况下,发送一个重定向状态码和一个可选的Location首部告知客户端,资源已被移动,且在哪里可以找到寻找的资源,如下图:将请求重定向到新的位置
总之,对那些包含了重定向状态码的非HEAD请求进行响应时,最好包含一个实体,其实体中包含描述信息和指向(多个)重定向URL的链接——如上图第一个响应报文
下表列出已定义的重定向状态码:
上面302、303于307状态码之间存在一些交叉,区别在于HTTP/1.0和HTTP/1.1对其的处理方式:
当HTTP/1.0发起一个POST请求,并在响应中收到302重定向状态码时,它会接受Location首部重定向的URL,并向那个URL发起一个GET请求
如果HTTP/1.0服务器收到来自HTTP/1.0客户端的POST请求之后,发出302状态码,服务器希望客户端能接受重定向URL并向重定向URL发一个GET请求
但是,HTTP/1.1规范使用303状态码来实现以上行为(服务器发送303状态码重定向客户端的POST请求,在其后面跟上一个GET请求)
为规避上述问题,HTTP/1.1规范:对于HTTP/1.1客户端,用307来取代302状态码进行重定向(保存302状态码,留待HTTP/1.0使用→→服务器遇到类似情况需要先检查客户端HTTP版本)
4、400~499——客户端错误状态码
有时候客户端会发送一些服务器无法处理的请求,比如格式错误的报文或者不存在的URL,服务器会返回给我状态码告诉我们它的反应
很多客户端错误都由浏览器处理,只有少量错误,比如404,会被用户看到;下表列出各种客户端错误状态码
5、500~599服务器错误状态码
有时客户端发起一个请求,但服务器由于本身缺陷或子元素出错时,会出现此类问题,服务器返回5XX代码来描述遇到的问题
下表列出一些已定义的服务器错误状态码
之前写的关于报文首部的传送门:
首部:首部和方法配合,共同决定和客户端和服务器能做什么事情
一、通用首部
客户端和服务器都可以使用的首部;在客户端、服务器和其他应用程序间提供一些非常有用的通用功能
1.1通用的信息性首部
1.2通用缓存首部
基本的缓存首部
二、请求首部
请求报文特有的首部;为服务器提供一些额外信息,比如:客户端希望接收什么类型的数据、谁发的请求、客户端优先接收类型等
2.1请求的信息性首部
2.2Accept首部
2.3条件请求首部
2.4安全请求首部
2.5代理请求首部
三、响应首部
响应首部有自己的首部集,以便为客户端提供信息;比如谁在发送响应,响应的功能,特殊指令等;其有助于客户端处理响应,将来发起更好的请求
3.1响应的信息性首部
3.2协商首部
3.3安全响应首部
四、实体首部
4.1实体的信息性首部
4.2内容首部
4.3实体缓存首部
五、扩展首部
Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。IETFRFC2965HTTPStateManagementMechanism是通用cookie规范;
网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。
具体来说cookie机制采用的是在客户端保持状态的方案。它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持。cookie的作用就是为了解决HTTP协议
无状态的缺陷所作的努力;正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。
然而纯粹的客户端脚本如JavaScript也可以生成cookie;而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,
关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。
而session机制采用的是一种在服务器端保持状态的解决方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于
cookie机制来达到保存标识的目的。而session提供了方便管理全局变量的方式。
session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,
这个值也可能设置为由get来返回给服务器。
就安全性来说:当你访问一个使用session的站点,同时在自己机子上建立一个cookie,建议在服务器端的session机制更安全些,因为它不会任意读取客户存储的信息。
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为sessionid),如果已包含则说明以前已经为此客户端
创建过session,服务器就按照sessionid把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个
保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。
但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。
经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,
以便在表单提交时能够把sessionid传递回服务器。Cookie与Session都能够进行会话跟踪,但是完成的原理不太一样。普通状况下二者均能够满足需求,但有时分不能够运用Cookie,有时分不能够运用Session。
cookie和session的特性:
1.存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,
运用Cookie是比拟艰难的。而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管JavaBean乃至任何Java类,
对象等,运用起来十分便当,能够把Session看做是一个Java容器类。
2.隐私策略的不同
Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,
不存在敏感信息泄露的风险。假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,
提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。
因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。
而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。5.浏览器支持的不同Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。关于WAP上的应用,常规的Cookie就派不上用场了。假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。
但Session只能在本阅读器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session。(IE8下不同窗口Session相干)6.跨域支持上的不同Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,
例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。
仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。
参考书籍为《图解tcp/ip》-第五版。这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述)、OSI参考模型、网络概念的本质、网络构建的设备等
下面是协议层从底层至顶层的一个模型图:
一、计算机网络的背景
1.1计算机的发展
有人说:“20世纪最伟大的发明就是计算机”,自诞生伊始,计算机经历了一系列发展,从大型通用计算机、超级计算机、小型机、个人电脑、工作站以及现如今笔记本、平板、智能手机等,
计算机已经彻底融入了我们的生活
1.2计算机的发展模式
起初,计算机只是以单机模式(独立模式)被广泛应用,随着发展,计算机被一个个的连接起来,形成了一个计算机网路,从而实现了信息共享,远距离传递信息等工作
计算机网络,根据规模可分为2种:
WAN:WideAreaNetwork(广域网)
LAN:LocalAreaNerwork(局域网)
二、计算机与网络发展的七个阶段
1.1批处理
BatchProcessing:事先将用户程序和数据装入卡带或磁带,由计算机按一定顺序读取,使用户要执行的程序和数据能够一并批量得到处理的方式
1.2分时系统TSS
TimeSharingSystem:多个终端和同一个计算机相连,允许多个用户同时使用一台计算机系统
特性:多路性、独占性、交互性、及时性
1.3计算机间的通信
1.4计算机网络
窗口系统的产生,方便了用户操作,用户不仅可以同时执行多个程序,还能自由切换作业
窗口系统:在计算机上可以打开多个图形窗口进行处理的系统。代表性的有常用于Unix上的XWindowSystem、微软的Windows、苹果的MacOSX等
1.5互联网的出现
异构型计算机连接和电子邮件、万维网等信息传播方式促使互联网开始从大到整个公司小到一个家庭内部开始普及互联网,实现了世界各地用户通过接入互联网而即时沟通与交流
1.6互联网技术为中心的时代
1.7“单纯建立连接”到“安全建立连接”
互联网时代给人带来了高度便捷的信息网络环境,但也带来了负面的问题:计算机病毒、信息泄露、网络欺诈等,出于个人信息安全以及数据通信更加安全便捷,安全建立连接自然而然的出现了
三、协议
1.1随处可见的协议
互联网中常用的代表性的协议有IP、TCP、HTTP等,LAN中常用协议有IPX、SPX等
“计算机网络体系结构”将这些网络协议进行了系统的归纳;TCP/IP就是这些协议的集合
其中,还有Novell公司的IPX/SPX、苹果公司的AppleTalk(仅限苹果公司计算机使用)、IBM开发的用于构件大规模网络的SNA以及前DEC公司开发的DECnet等
1.2协议的必要性
简单来说,协议就是计算机之间通过网络实现通信时事先达成的一种“约定”;这种“约定”使那些由不同厂商的设备,不同CPU及不同操作系统组成的计算机之间,只要遵循相同的协议就可以实现通信
协议可以分很多种,每一种协议都明确界定了它的行为规范:2台计算机之间必须能够支持相同的协议,并且遵循相同的协议进行处理,才能实现相互通信
1.3分组交换协议
计算机通信会在每一个分组中附加上源主机地址和目标主机地址送给通信线路;这些发送端地址、接收端地址以及分组序号写入的部分就是“报文首部”
一个较大的数据被分为很多个分组,为了标明原始数据的归属,有必要将分组序号写入包中,接收端会根据序号,分组按序重新装配为原始数据
协议中,通常会规定报文首部应写入哪些信息,如何处理;相互通信的每台计算机则根据协议构造报文首部,读取首部等内容,发送和接收方必须对报文首部和主体保持一致的定义和解释
四、协议的标准化
计算机通信诞生之初,系统化与标准化未收到重视,不同厂商只出产各自的网络来实现通信,这样就造成了对用户使用计算机网络造成了很大障碍,缺乏灵活性和可扩展性
为解决该问题,ISO(国际标准化组织)制定了一个国际标准OSI(开放式通信系统互联参考模型)
TCP/IP并非ISO指定,是由IETF(国际互联网工程任务组)建议、致力推进标准化的一种协议,其中,大学等研究机构和计算机行业是推动标准化的核心力量,现已成为业界标准协议
协议的标准化也推动了计算机网络的普及
五、协议分层和OSI参考模型
1.1协议的分层
概念:ISO在指定标准的OSI之前,提出了作为通信协议设计指标的OSI参考模型,将协议分为七层,使得原来复杂的网络协议更加简单化
定义:在七层模型中,每个分层都接受由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务,上下层之间进行交互所遵循的约定叫做“接口”,同一层之间的交互所遵循的约定叫做“协议”
协议分层的优点:
每个分层可以独立使用,其实系统中某些分层发生变化,也不会影响整个系统,因此可以构造一个扩展性和灵活性都比较强的系统;
此外,通过分层可以细分通信功能,更易于单独实现每个分层的协议,界定各个分层的具体责任和义务
协议分层的劣势:
过分模块化,处理变得更加沉重,以及每个模块都不得不事先相似的处理逻辑等
1.2OSI参考模型
实际上,分组通信协议很复杂,OSI参考模型将其分为了易于理解的七个分层,如下图:
不过,OSI参考模型只是一个模型,对各层只做了粗略的定义,并没有对接口和协议做详细的定义,想深入了解还需要学习具体的协议规范
1.3OSI参考模型中每个分层的作用
下图表述了简单的每个分层的作用:
①:超文本传输协议HTTP:这是一种最基本的客户机/服务器的访问协议;浏览器向服务器发送请求,而服务器回应相应的网页
②:文件传送协议FTP:提供交互式的访问,基于客户服务器模式,面向连接使用TCP可靠的运输服务
主要功能:减少/消除不同操作系统下文件的不兼容性
④:简单邮件传送协议SMTP:Client/Server模式,面向连接
基本功能:写信、传送、报告传送情况、显示信件、接收方处理信件
⑤:DNS域名解析协议:DNS是一种用以将域名转换为IP地址的Internet服务
⑥:简单文件传送协议TFTP:客户服务器模式,使用UDP数据报,只支持文件传输,不支持交互,TFTP代码占内存小
⑦:简单网络管理协议(SNMP):SNMP模型的4个组件:被管理结点、管理站、管理信息、管理协议
SNMP代理:运行SNMP管理进程的被管理结点
对象:描述设备的变量
管理信息库(MIB):保存所有对象的数据结构
⑧DHCP动态主机配置协议:发现协议中的引导文件名、空终止符、属名或者空,DHCP供应协议中的受限目录路径名Options–可选参数字段,参考定义选择列表中的选择文件
1.3.2表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式;主要负责数据格式的转换,确保一个系统的应用层信息可被另一个系统应用层读取
具体来说,就是将设备固有的数据格式转换为网络标准传输格式,不同设备对同一比特流解释的结果可能会不同;因此,主要负责使它们保持一致
PS:其实在应用层、表示层、会话层这三层,协议可以共用:
1.3.4传输层:只在通信双方的节点上(比如计算机终端)进行处理,而无需在路由器上处理,传输层是OSI中最重要、最关键的一层,是唯一负责总体的数据传输和数据控制的一层;
传输层提供端到端的交换数据的机制,检查分组编号与次序,传输层对其上三层如会话层等,提供可靠的传输服务,对网络层提供可靠的目的地站点信息主要功能
在这一层,数据的单位称为数据段(segment)
主要功能:
①:为端到端连接提供传输服务
②:这种传输服务分为可靠和不可靠的,其中Tcp是典型的可靠传输,而Udp则是不可靠传输
③:为端到端连接提供流量控制,差错控制,服务质量(QualityofService,QoS)等管理服务
包括的协议如下:
TCP:传输控制协议,传输效率低,可靠性强
DCCP、SCTP、RTP、RSVP、PPTP等协议
1.3.5网络层:将数据传输到目标地址;目标地址可以使多个网络通过路由器连接而成的某一个地址,主要负责寻找地址和路由选择,网络层还可以实现拥塞控制、网际互连等功能
在这一层,数据的单位称为数据包(packet)
网络层协议的代表包括:IP、IPX、RIP、OSPF等
1.3.6数据链路层:负责物理层面上的互联的、节点间的通信传输(例如一个以太网项链的2个节点之间的通信);该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
在这一层,数据的单位称为帧(frame)
数据链路层协议的代表包括:ARP、RARP、SDLC、HDLC、PPP、STP、帧中继等
1.3.7物理层:负责0、1比特流(0/1序列)与电压的高低、逛的闪灭之间的转换
规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性;该层为上层协议提供了一个传输数据的物理媒体。只是说明标准
在这一层,数据的单位称为比特(bit)
属于物理层定义的典型规范代表包括:EIA/TIARS-232、EIA/TIARS-449、V.35、RJ-45、fddi令牌环网等
六、传输方式的分类
网络通信科根据数据发送方法进行多种分类,分类方法很多,下面列举几种常见的:
1.面向有连接型和面向无连接型
1.1面向有连接型
发送数据之前,需要在收发主机之间建立一条通信线路,在通信传输前后,专门进行建立和断开连接的处理,如果与对端之间无法通信,可避免发送无谓的数据
1.2面向无连接型
这种类型不要求建立和断开连接,发送端可任何时候发送数据,接收端也不知道自己何时从哪里接受数据,这种情况下,接收端需要时常确认是否收到数据,彼此也不需要确认对方是否存在
2.电路交换和分组交换
软件通信方式大致分为2种:电路交换和分组交换,TCP/IP协议组,采用的就是分组交换
2.1电路交换
电路交换中,交换机主要负责数据的中转处理;计算机与交换机相连接,交换机之间由众多通信线路连接,计算机发送数据时,需要先连接电路,建立连接,即可进行通信,直到连接被断开
2.2分组交换
最初,一台计算机收发信息时会独占整个电路,其他计算机只能等待,且无法预测何时结束通信,为解决这个问题,将发送的数据分为多个数据包,按一定的顺序排列后发送,这就是分组交换
分组交换中,由分组交互机(路由器)连接通信线路;在每个分组首部写入发送端与接收端地址(即同一条线路同时为多个用户服务),也可以确认区分每个分组的数据目的地,以及它与哪台计算机通信
分组交换的大致处理过程:发送端将数据分组分给路由器,路由器收到后缓存到自己的缓冲区,然后再转发给目标计算机;因此,分组交换也称为:蓄积交换
路由器收到收据会按照顺序进行缓存至相应队列,然后以先进先出顺序将其逐一发送(有时会优先发送目标地址较特殊的数据)
电路交换和分组交换的特点:
3.根据接收端数据分类
3.1单播
3.2广播
将消息从一台主机发送给与之相连的其他所有主机;典型例子就是电视播放(将电视信号一齐发送给非特定的多个连接对象)
3.3多播
与广播类似,也是将消息发送给多个相连接的接收主机;不同之处在于多播要限定某一组主机作为接收端
3.4任播
在特定的多台主机中选择一台作为接收端的一种通信方式(从目标主机群中选择一台最符合的主机作为目标主机发送消息,一般被选中的主机将返回一个单播信号,随后发送端只会和这台主机通信)
在实际的应用中有DNS根域名解析服务器
PS:几种不同方式的思维逻辑图:
七、地址
通信传输中,发送端和接收端可以被视为通信主体,它们由“地址”加以标识,在计算机通信中,每一层协议的地址都不同
1.地址的唯一性
通信地址必须明确的表示一个主体对象,以便确认通信主体,同一个网络中不允许有2个相同的通信主体存在,这就是地址的唯一性
2.地址的层次性
地址总数不多的情况下,有了唯一地址就可以定位相互通信的主体;如果地址总数比较多,那么想要高效的定位通信主体,就需要让地址具有层次性
比如:MAC和IP地址在标识一个通信主体时都具有唯一性,但只有IP地址具有层次性
MAC地址由制造商制造的网卡,通过识别制造商号,制造商内部产品编号以及产品通用编号来确保MAC地址的唯一性
IP地址由网络号和主机号2部分组成,即通信主体IP地址不同,若主机号不同,网络号相同,说明其处于同一个网段
网络通信中,每个节点都会根据分组数据的地址信息,参考一个发出接口列表,来判断报文应该由哪个网卡发送出去,其中,MAC和IP的区别在于:
MAC:寻址参考的表叫做地址转发表,其中所记录的实际上MAC地址本身
IP:寻址参考的表叫做路由控制表,其中所记录的IP地址是集中了之后的网络号(网络号与子网掩码)
八、网络的构成要素
搭建一套网络环境需要涉及到很多电缆和网络设备,下面只介绍下连接计算机和计算机的硬件设备:
搭建网络的主要设备及其作用:
1.通信媒介与数据链路
计算机之间通过电缆相互连接,电缆可以分为很多种,根据数据链路不同,选用的电缆类型也不同,而媒介本身也可被划分为电波、微波等不同类型
各种数据链路一览:
传输速率又称为带宽,带宽越大网络传输能力就越强
吞吐量:主机之间实际的传输速率称为吞吐量,单位为bps
吞吐量不仅衡量带宽,同时还有主机的CPU处理能力、网络拥堵程度、报文中数据字段的占有份额(不含报文首部,只计算数据字段本身)等信息
2.网卡
任何计算机连接网络时,必须使用网卡(全称网络接口卡,也称为网络适配器、网卡、LAN卡)
3.中继器
OSI模型中第一层——物理层面上延长网络的设备;由电缆传过来的波信号或光信号,经由中继器波形调整和放大再传给两一个电缆
一般情况下,中继器两端连接的是相同的通信媒介(有些中继器也可完成不同通信媒介之间的转接工作)
有些中继器可提供多个端口服务,被称为中继集线器(Hub)或者集线器,每个端口都可称为一个中继器
4.网桥/2层交换机
网桥是在OSI模型第二层——数据链路层面上连接2个网络的设备;它可以识别数据链路层中的数据帧,并将数据帧临时存储于内存,再重新生成一个全新帧转发给相连的另一个网段
网桥能够连接不同传输速率的数据链路,并且不限制连接网段的个数
数据链路中有个数据帧叫做FCS,用以校验数据是否正确送达目的地;网桥通过检查该域中的值,将损坏的数据丢弃,此外,还能通过地址自学机制和过滤功能控制网络流量
地址:MAC地址、硬件地址、物理地址及适配器地址,也就是网络上针对NIC分配的具体地址
自学式网桥:自行判断是否将数据报文发送给相邻的网段的网桥(记住曾通过自己转发的所有数据帧的MAC地址,并存储到自己的内存表中)
以太网等网络中经常使用交换集线器(Hub),也属于网桥的一种;交换集线器中连接电缆的端口都能提供类似网桥的功能
5.路由器/3层交换机
路由器:OSI模型第三层——网络层面上连接2个网络、并对分组报文进行转发的设备,根据IP地址进行处理;TCP/IP中网络层地址就成为了IP地址
路由器可以连接不同的数据链路,它还有分担网络负荷的作用(某些路由器具备一定的网络安全功能)
6.4~7层交换机
4~7层交换机负责处理OSI模型中从传输层至应用层的数据;即以TCP等协议的传输层及其上面的应用层为基础,分析收发数据,并对其进行特定的处理(例如:负载均衡器)
应用场景:带宽控制、广域网加速器、特殊应用访问、防火墙等
7.网关
网关:OSI模型中负责将从传输层到应用层的数据进行转换和转发的设备;处理传输层及以上的数据
网关不仅转发数据还对其进行转换,通常会使用一个表示层或应用层网关,在不能直接通信的协议间进行翻译,最终实现通信
代理服务器:
使用万维网(www)时,为控制网络流量和处于安全考虑,使用代理服务器(也是网关的一种,称为应用网关)
使用代理服务器,客户端与服务器之间不需要直接通信,而是从传输层到应用层对数据和访问进行各种控制处理,防火墙就是一种通过网关通信,针对不同应用提高安全性的产品
代理服务如下图:
各种设备及其对应网络分层预览图:
九、现代网络
1.网络的构成
核心网(数据传输核心)+边缘网络(传输节点)+接入层(汇聚层:连接边缘网络的部分)
2.互联网通信
实际的网络构成图:
3.移动通信
移动通信示意图:
4.信息发布以及数据中心
数据中心由大型服务器、存储以及计算机网络构成(某些大型数据中心甚至连接到“主干网”)
数据中心结构图:
今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰。。。
然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题。。。。。。
一、TCP/IP的标准化
1、TCP/IP的含义
一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称。
具体点,IP或ICMP、TCP或UDP、TELENT或FTP、以及HTTP等都属于TCP/IP协议,而TCP/IP一词泛指这些协议,有时称它们为TCP/IP为网际协议族/TCP/IP协议族
如下图所示:
2、标准化的精髓
特性:开放性、注重实用性(被标准化的协议能否被实际运用)
TCP/IP协议由IETF(国际互联网工程任务组)讨论制定;即将协议的大致规范定下来,然后进行通信试验,及时修订
3、规范——RFC
RFC通过编号组织每个协议的标准化请求;其编码是既定的,一旦成为某个RFC的内容,就不能再对其进行修改;若要修改已有某个协议内容,则需要重新发行一个新的RFC文档,同时,老的RFC文档作废
新的RFC文档会明确规定是扩展了哪个已有RFC以及要作废哪个已有RFC
基于每次修改RFC时都会产生新的RFC编号太麻烦,为此,采用了STD(standard)方式管理编号,其作用是:用来记录哪个编号制定哪个协议
4、TCP/IP的标准化流程
TCP/IP的标准化流程大概分为以下几个阶段:
①.互联网草案阶段:从提出开始不断进行讨论实验,有了一定成熟度,觉得实际可行,认为其可以进行标准化,可进入下一阶段
②.提议标准阶段:计入RFC,开始进入众多设备厂商生产环节,投入试验使用,一般为6个月,当所有参与协议的人觉得其“实用性强,不存在太多问题”,则进入下一阶段
③.草案标准阶段:一般为期4个月,在经过不断的使用和讨论改进后,被大众所使用接受,那么这个草案标准就进入下一个阶段
④.标准阶段:到这个阶段,意味着该标准已广泛被使用且具有很强的实用性
5、RFC获取方法
ftp://ftp.rfc-editor.org/in-notes/
②.STD或FYI以及ID获取地址
关于STD、FYI、ID也可以从以下网站获取,其概览一分别记录在std-index.txt、fyi-index.txt等文件中
JPNIC的ftp服务器中的目录:
STD获取网址:ftp://ftp.nic.ad.jp/rfc/std/
FYI获取网址:ftp://ftp.nic.ad.jp/rfc/fyi/
ID获取网址:ftp://ftp.nic.ad.jp/internet-drafts/
二、互联网基础知识
1、互联网定义
互联网,英文单词为Internet;Internet指的是将多个网络连接使其构成一个更大的网络,所以Internet本意为网际网
“互联网”是指由ARPANET发展而来、互联全世界的计算机网络;互联全世界的计算机网络,现在“互联网”对应的英文单词为“TheInternet”
与Internet对应的另一种网络叫做intranet,该网络指使用Internet技术将企业内部组织机构连接起来形成一个企业范围的内部网络,提供面向企业内部的通信服务
2、互联网与TCP/IP关系
互联网进行通信时,需要相应的网络协议,TCP/IP是为使用互联网而开发定制的协议族;因此,互联网的协议就是TCP/IP
3、互联网的结构
小范围内的网络连接形成机构内部网络,机构内部网络连接形成区域网络,各个区域相互连接,则形成连接全是的互联网;互联网是一个有层次的网络
互联网中每个网络都是由骨干网(BackBone)和末端网(Stub)组成;每个网络之间通过NOC相连;如果运营商不同,则网络连接方式和使用方法也不同。异构网络需要有IX支持
互联网就是众多异构网络通过IX互联的一个巨型网络
△NOC:NetworkOperationCenter(网络操作中心)
△IX:InternetExchange:网络交换中心
4、ISP和区域网
连接互联网需要向ISP(internetserviceprovider:互联网服务提供商)或区域网提出申请,不同的ISP提供的互联网接入服务也不同
区域网指的是特定区域内由团体或志愿者提供的网络服务,通常价格比较便宜,但有时会出现连接方式复杂或者使用有限制的情况
当申请网络服务时,建议确认了解一下提供的具体服务条目、服务的细则(接入方式、条件、费用)等,再决定
三、TCP/IP协议分层模型
1、TCP/IP与OSI参考模型
TCP/IP与OSI在分层模块上的区别:
OSI:注重通信协议必要的功能是什么
TCP/IP:在计算机上实现协议应该开发哪种程序
2、硬件(物理层)
3、网络接口层(数据链路层)
利用以太网中的数据链路进行通信,属于接口层;将其当做“驱动程序”也可以(驱动程序是在操作系统与硬件之前起桥梁作用的软件)
PS:有时也将硬件层和网络接口层合并起来,称为“网络通信层”
4、互联网层(网络层)
互联网层使用IP协议,相当于OSI中的第三层模型;IP协议基于IP地址转发分包数据
IP协议的作用:将分组数据包发送到目的主机
TCP/IP分层中的互联网层与传输层的功能通常由操作系统提供,尤其是路由器,它必须得实现通过互联网层转发分组数据包的功能
连接互联网的所有主机跟路由器必须都实现IP功能,其他链接互联网的网络设备(网桥、中继器)则不是必须
IP:跨越网络传送数据包,使整个互联网都能收到数据的协议;传送数据时,IP地址作为主机的标识
IP还隐含数据链路层的功能:通过IP,相互通信的主机之间不论经过怎样的数据链路,都可以实现通信
IP是分组交换的一种协议,但是不具有重发机制;即使分组数据包未到达对端主机也不会重发;属于非可靠性传输协议
ICMP:IP数据包发送过程中一旦发生异常导致无法到达对端目标地址时,需要给发送端一个发生异常的通知,ICMP就是为了该功能而定制;有时可用来诊断网络健康状况
ARP:从分组数据包的IP地址解析出物理地址(MAC地址)的一种协议
5、传输层
TCP/IP传输层有TCP和UDP两个具有代表性的协议,主要功能是让应用程序之间实现通信;其通信逻辑如下图:
TCP:面向有连接的传输层协议,可以保证通信两端主机之间的通信可达;可以正确的处理传输过程中丢包、传输乱序等异常情况;还能有效利用带宽,缓解网络拥堵。
6、应用层(会话层以上的分层)
TCP/IP分层中,将OSI中的会话层、表示层、应用层都集中到了应用程序中实现
TCP/IP应用的架构绝大多数术语客户端/服务端模型;提供服务的程序叫服务端,接受服务的程序叫客户端,服务器会预先部署到主机上,等待接收任何时刻客户端发送的请求
常见的应用层协议:
HTTP协议:(HyperTextTransferProtocol)
文件传输协议:FTP(FileTransferProtocol)
传输过程可以选择用二进制还是文本方式,传输时会建立两个TCP连接:发送传输请求时用到的控制连接和实际传输时用到的数据连接
电子邮件协议:SMTP(SimpleMailTransferProtocol)
可以发送声音图像文字,甚至改变文字大小、颜色等
网络管理协议:SNMP(SimpleNewworkManagementProtocol)
在TCP/IP进行网络管理时,采用该协议,其中使用SNMP管理的主机。网桥、路由器等称作SNMP代理(Agent),进行管理的那一段叫做管理器(Manager)
在SNMP代理端,保存着网络接口信息、通信数据量、异常数据量以及设备温度等信息,这些信息通过MIB访问,在TCP/IP中,SNMP属于应用协议,MIB属于表示层协议
MIB(ManagementInformationBase):可透过网络的结构变量
四、TCP/IP分层模型
1、数据包首部
每个分层都会对所发送的数据附加一个首部,首部中包含该层必要的信息;通常为协议提供的信息为包首部,所要发送的内容为数据
关于包、帧、数据报、段、消息的概述:
包:一个概括性术语,指数据整体
帧:数据链路层中包的单位
数据报:IP和UDP等网络层以上分层中包的单位
段:TCP数据流中的信息
消息:应用协议中数据的单位
2、发送数据包
假设A发送邮件“早上好”给B,那么它的通信过程大概如下:
①.应用程序处理
应用程序启动,新建邮件及内容,点击发送,应用程序对邮件进行编码处理,然后发送给下一层TCP
②.TCP模块的处理
根据上层应用发来的指示,建立负责建立连接、发送连接及断开连接;TCP提供将应用层发来的数据顺利发送至对端的可靠传输
为了实现该功能,会在应用层数据前端加一个TCP首部,首部包括源端口号和目标端口号。序号以及校验,随后将附加了TCP首部的包发送给IP
③.IP模块的处理
IP将TCP传递的首部和数据合并,并在首部之前加上自己的IP,IP包生成后,参考路由控制表决定接受此IP包的路由或者主机,随后,IP包将被发送给连接这些路由或主机网络接口的驱动程序,实现发送数据
④.网络接口(以太网驱动)的处理
以太网接受到的IP包,对其来说就是数据,会给其加上以太网首部并进行发送处理,首部中包含接收端MAC地址,发送端MAC地址以及标志以太网类型的以太网数据协议
3、数据包接收处理
①.网络接口(以太网驱动)的处理
主机收到以太网包,首先找到MAC地址判断是否为发送给自己的,如果不是则丢弃数据
如果是,则确认数据类型,然后将数据包发送给对应的类型处理程序处理
②.IP模块的处理
收到数据包先进行判断处理,如果包首部IP地址与自己匹配则接受数据并寻找到上一层协议,并转发给上一层进行处理
③.TCP模块的处理
接收到数据包首先计算校验和,判断数据包是否被破坏,然后检查是否按序接受数据,最后检查端口号,确定具体应用程序
数据接受完毕,接收端发送一个“确认回执”个发送端
④.应用程序的处理
接收端应用程序会直接接收发送端的数据,并进行解析处理
几乎所有的HTTP通信都是由TCP/IP承载的,TCP/IP是全球计算机网络设备都在使用的一种分组交换网络分层协议集。
它的特点是只要连接建立,客户端与服务器之间的报文交换就永远不会丢失、受损或失序。
一、TCP连接
1、TCP是可靠数据通道
TCP是英特网上的可靠连接,TCP为HTTP提供了一条可靠地比特传输通道,从TCP连接一端填入的字节会从另一端以原有的顺序、正确的传送出来。
TCP会按序、无差错的承载HTTP数据,如下图:
2、TCP流是分段的,由IP分组传送
TCP的数据是通过名为IP分组的小数据块发送的,HTTP就是“HTTPoverTCPoverIP”这个“协议栈”中的最顶层,其安全版本HTTPS就是在HTTP和TCP之间插入一个(TLS或SSL)密码加密层。
HTTP在传送一条报文时,会以流的形式将报文数据通过打开的TCP连接按序传输。TCP收到数据流之后,将其划分为被称为段的小数据块,封装在IP分组中,通过英特网进行传输。
每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址,其中包括:
①、一个IP分组首部(通常为20字节):包含源和目的IP地址、长度和其他一些标记;
②、一个TCP段首部(通常为20字节):包含TCP端口号、TCP控制标记以及用于数据排序和完整性检查的数据值;
③、一个TCP数据块(0个或多个字节);
3、保持TCP连接不断运行
TCP通过端口号来保持连接持续不断的运行。IP地址可以连接到正确的计算机,端口号可以连接到正确的应用程序,TCP连接通过四个值来识别:
<源IP地址、源端口号、目的IP地址、目的端口号>
这四个值唯一的定义了一个连接(两条不同的TCP连接不能拥有4个完全相同的地址组件值,不同连接部分可以拥有同样的值)。
4、TCP套接字
操作系统提供了一些操纵TCP连接的编程接口,即套接字API,这个套接字API隐藏了所有的TCP和IP实现细节,下表是一些套接字API的主要接口:
套接字API允许用户创建TCP的端点数据结构,将其与远程服务器的TCP端点进行连接,并对数据流进行读写。
TCPAPI隐藏了所有底层网络协议的握手细节,以及TCP数据流与IP分组之间的字段和重装细节。
二、TCP性能
1、HTTP事务的时延
首先来看一个HTTP请求的过程,如下图:
2、性能聚焦区域
①、TCP连接建立握手;
如下图,新建TCP连接时会交换一系列的IP分组,对连接的有关参数进行沟通,如果连接只用来传送少量数据,交换的过程就会严重降低HTTP性能。
②、TCP慢启动拥塞机制;
③、数据聚集的Nagle算法;
④、用于捎带确认的TCP延迟确认算法;
⑤、TIME_WAIT时延和端口耗尽;
三、HTTP连接处理
目前现存和常用的连接方法大概有一下四种:
1、串行连接
最早的连接方式,即HTTP事务需要按顺序进行传输,等待服务端完成处理并回传,如下图所示:
这样做有两个缺点:
①、TCP性能时延会不断叠加;
②、在请求处理完成之前,客户端无法对结果进行提前展示,只能被动等待;
2、并行连接
通过多条TCP连接发情并发的HTTP请求,如下图所示:
并行连接有如下几个特点:
②、可以让用户“感觉更快”(与WEB页面渲染的异步展示类似的原理),但实际上,由于TCP慢启动特性的存在,每个新连接的性能都会有所降低,且并行链接数量有限;
③、并行连接不一定比串行连接块(受限于带宽,可能造成资源竞争);
3、持久连接
重用TCP连接,以消除连接及关闭时延,持久连接+并行连接,可能是最高效的连接方式,如下图所示:
持久连接有两种方式,分别为HTTP/1.0+的“Keep-alive”连接,以及HTTP/1.1的“persistent”连接。
Keep-alive:该首部只是请求将连接保持在活跃状态,客户端和服务端可以随时关闭空闲的Keep-alive连接。
限制和规则:
①、必须客户端发送一个Connection:Keep-alive请求首部来激活Keep-alive连接;
②、该首部必须随请求的报文一起发送;
③、只有在确定实体主体部分大小的情况下,连接才能保持在打开状态;
④、代理和网关必须执行Connection首部的规则;
Persistent:该首部默认情况下是激活的,除非特别指明,否则HTTP/1.1假定所有连接都是持久的。
①、如果需要在事务处理结束后将连接关闭,则应用程序必须向报文中显式的添加一个Connection-close首部;
②、只有当连接上所有报文都有正确的、自动以报文长度时,连接才能持久保持;
③、每个持久连接都只适用于一跳传输;
④、应用程序可以在任意时刻关闭连接,但应该能够从异步关闭中恢复,重试这条请求;
⑤、一个客户端对任何服务器或代理最多只能维护2条持久连接;
4、管道化连接
通过共享TCP连接发起并发的HTTP请求,这也是在持久连接的基础上对性能的一种优化。
①、如果HTTP客户端无法确认连接是持久的,就不应使用管道连接;
②、必须按照与请求相同的顺序回送HTTP响应;
③、客户端必须做好连接会在任何时刻关闭的准备,以及重发所有未完成的管道化请求;
④、HTTP客户端不应用管道化的方式发送非幂等性请求(比如POST);
四种不同连接方式的区别:
某些关于请求和响应首部的字段详细介绍,可以参考《HTTP权威指南》这本书中的内容。。。
web代理服务器是网络的中间实体,位于客户端和服务器之间,扮演“中间人”的角色,作用是在各端点之间来回传送报文。
其原理是:客户端向代理服务器发送请求报文,代理服务器正确的处理请求和连接,然后返回响应;同时代理服务器自身要向web服务器发送请求并接收响应。
即:代理即是服务器,又是客户端。如下图所示:
一、代理的类型
1、私有代理
定义:单个客户端专用的代理被称为私有代理。
2、公共代理
定义:多个客户端共享的代理被称为公共代理,也称为“集中式代理”。
优点:节省成本,效率更高,方便管理,比如:“高速缓存代理服务器”。
二、代理和网关的区别
代理:连接两个或多个使用相同协议的应用程序;
网关:连接两个或多个使用不同协议的端点(可以理解为“协议转换器”);
相同点:代理和网关之间的区别很模糊,代理经常也会做一些协议转换的工作,比如:支持SSL协议、SOCKS防火墙、FTP访问等。
三、代理的特点
1、资源访问控制
利用过滤器代理进行身份权限验证,或使用代理服务器在大量的web服务器和资源之间实现统一的访问控制策略,创建审核跟踪机制,对所有访问控制功能进行配置,特别体现在大型环境或其他分布式机制的服务中。
2、提高安全性
利用代理服务器在网络中的单一安全节点上限制哪些应用层协议的数据可以流入或者流出,还可以提供用来某些防范和杀毒的挂钩程序,以便对流量进行详细的检查。
3、web缓存
可以利用缓存服务器维护存储常用资源的本地副本,并将其按需提供,以减少连接,缩短连接时延,提高性能。
4、反向代理
代理可以扮演服务器的角色接收发送给web服务器的真实请求,也可以发起与其他服务器的通信,以便按需定位所请求的内容;可以利用反向代理来提高访问web服务器上公共资源时的性能。
或者将其和内容路由功能配合使用,以创建分布式网络。
5、内容路由器
代理服务器可以作为“内容路由器”使用,根据因特网的流量以及内容类型将请求导向特定的web服务器(类似负载均衡),也可以用来实现各种服务级的请求。
6、转码器
代理服务器也可以在将内容发送给客户端之前,修改内容的主体格式,对其进行透明转换,我们称之为转码(比如更改图片格式,文件编码类型等)。
7、匿名
可以利用代理从HTTP报文中删除身份特性(比如IP、cookie),从而提供高度的私密性和安全性。
四、代理服务器的部署
1、出口代理
将代理固定在本地网络出口点,以便控制本地网络和大型英特网之间的流量,提供针对企业外部恶意攻击的防火墙保护;或降低带宽费用,提高性能。
2、访问(入口)代理
将代理放在ISP访问点上,用来处理来自客户端的聚合请求,ISP使用缓存代理来存储常用的资源副本,提高用户下载速度,降低带宽耗费等。
3、反向代理
将代理部署在网络便边缘,web服务器之前,作为反向代理处理所有传给web服务器的请求,并只在必要时向web服务器请求资源;反向代理可以提高服务器的安全性和性能。
4、网络交换代理
将具有足够处理能力的代理服务器放在网络上的对等交换点,通过缓存来减轻网络堵塞,并对流量进行监视。
5、层级代理
通过代理的层次结构将代理级联起来,既可以是静态的也可以是动态的,直到将报文发送到原始服务器。
下图是一个三级代理的层级结构示意图:
下图是一个静态动态代理结合的结构示意图:
6、常见的几种动态选择父代理方式
①、负载均衡
子代理可能会根据当前父代理上的工作负载级别来决定如何选择一个父代理,以达到负载均衡。
②、地理位置附近的路由
子代理可能会选择负责原始服务器所在物理区域的父代理。
③、协议/类型路由
子代理可能根据URI将报文转发到不同的父代理和原始服务器上,某些特定类型的URI可能要通过一些特殊的代理服务器转发请求,以便进行特殊的协议处理。
④、基于订购的路由
如果发布者为高性能服务额外付费了,他们的URI就会被转发到大型缓存或者压缩引擎上,以提高性能。
PS:在不同的产品中,动态父路由逻辑的实现方式各有不同,包括使用配置文件、脚本语言和动态可执行插件等。
五、代理如何获取流量
1、修改客户端配置
很多web客户端都支持手工和自动的代理配置,如果将客户端配置为使用代理服务器,客户端会将HTTP请求直接发送给代理,而不是原始服务器。
2、修改网络,拦截代理
依赖于监视HTTP流量的交换设备及路由设备,在客户端不知情的情况下,对其进行拦截,并将流量导入一个代理。
修改DNS的命名空间,假扮原始服务器的名称和IP地址,这样所有的请求都会发送给这些反向代理服务器,而不是原始服务器。
4、重定向
可以将某些web服务器的配置为向客户端发送一条HTTP重定向命令,将客户端请求重定向到一个代理上,收到重定向命令后,客户端会与代理进行通信。