精华内容
下载资源
问答
  • 在委托代理的框架下,通过构建一个n团队的委托代理模型研究团队激励机制的优化问题。通过对模型求解,得到影响团队成员激励的因素,并进一步分析了成员能力、风险态度以及团队化程度对员工相对激励强度的影响。研究...
  • NAT技术与代理服务器详解

    千次阅读 2017-06-24 19:44:24
    NAT技术原理应用1 概述1.1 简介1.1.1 名词解释公有IP地址:也叫全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址...

    NAT技术原理与应用

    1 概述

    1.1 简介

    1.1.1 名词解释

    公有IP地址:也叫全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址。

    私有IP地址:也叫内部地址,属于非注册地址,专门为组织机构内部使用。因特网分配编号委员会(IANA)保留了3块IP地址做为私有IP地址:

    10.0.0.0 ——— 10.255.255.255

    172.16.0.0——— 172.16.255.255

    192.168.0.0———192.168.255.255

    地址池:地址池是有一些外部地址(全球唯一的IP地址)组合而成,我们称这样的一个地址集合为地址池。在内部网络的数据包通过地址转换到达外部网络时,将会在地址池中选择某个IP地址作为数据包的源IP地址,这样可以有效的利用用户的外部地址,提高访问外部网络的能力。

    1.1.2关于NAT

    NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术,如下图所示。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。

    这里写图片描述

    简单地说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关(可以理解为出口,打个比方就像院子的门一样)处,将内部地址替换成公用地址,从而在外部公网(internet)上正常使用,NAT可以使多台计算机共享Internet连接,这一功能很好地解决了公共 IP地址紧缺的问题。通过这种方法,可以只申请一个合法IP地址,就把整个局域网中的计算机接入Internet中。这时,NAT屏蔽了内部网络,所有内部网计算机对于公共网络来说是不可见的,而内部网计算机用户通常不会意识到NAT的存在。如下图所示。这里提到的内部地址,是指在内部网络中分配给节点的私有IP地址,这个地址只能在内部网络中使用,不能被路由转发。

    clip_image003

    NAT 功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。比如Cisco路由器中已经加入这一功能,网络管理员只需在路由器的IOS中设置NAT功能,就可以实现对内部网络的屏蔽。再比如防火墙将WEB Server的内部地址192.168.1.1映射为外部地址202.96.23.11,外部访问202.96.23.11地址实际上就是访问访问 192.168.1.1。此外,对于资金有限的小型企业来说,现在通过软件也可以实现这一功能。Windows 98 SE、Windows 2000 都包含了这一功能。

    1.2 分类

    NAT有三种类型:静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)。

    这里写图片描述

    1.2.1静态NAT

    通过手动设置,使 Internet 客户进行的通信能够映射到某个特定的私有网络地址和端口。如果想让连接在 Internet 上的计算机能够使用某个私有网络上的服务器(如网站服务器)以及应用程序(如游戏),那么静态映射是必需的。静态映射不会从 NAT 转换表中删除。
      如果在 NAT 转换表中存在某个映射,那么 NAT 只是单向地从 Internet 向私有网络传送数据。这样,NAT 就为连接到私有网络部分的计算机提供了某种程度的保护。但是,如果考虑到 Internet 的安全性,NAT 就要配合全功能的防火墙一起使用。

    对于以上网络拓扑图,当内网主机 10.1.1.1如果要与外网的主机201.0.0.11通信时,主机(IP:10.1.1.1)的数据包经过路由器时,路由器通过查找NAT table 将IP数据包的源IP地址(10.1.1.1)改成与之对应的全局IP地址(201.0.0.1),而目标IP地址201.0.0.11保持不变,这样,数据包就能到达201.0.0.11。而当主机HostB(IP:201.0.0.11) 响应的数据包到达与内网相连接的路由器时,路由器同样查找NAT table,将IP数据包的目的IP 地址改成10.1.1.1,这样内网主机就能接收到外网主机发过来的数据包。在静态NAT方式中,内部的IP地址与公有IP地址是一种一一对应的映射关系,所以,采用这种方式的前提是,机构能够申请到足够多的全局IP地址。

    1.2.2 动态NAT

    动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。当远程用户联接上之后,动态地址NAT就会分配给他一个IP地址,用户断开时,这个IP地址就会被释放而留待以后使用。

    动态NAT方式适合于 当机构申请到的全局IP地址较少,而内部网络主机较多的情况。内网主机IP与全局IP地址是多对一的关系。当数据包进出内网时,具有NAT功能的设备对IP数据包的处理与静态NAT的一样,只是NAT table表中的记录是动态的,若内网主机在一定时间内没有和外部网络通信,有关它的IP地址映射关系将会被删除,并且会把该全局IP地址分配给新的IP数据包使用,形成新的NAT table映射记录。

    1.2.3网络地址端口转换NAPT

    网络地址端口转换NAPT(Network Address Port Translation)则是把内部地址映射到外部网络的一个IP地址的不同端口上。它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与 动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。

    NAPT是使用最普遍的一种转换方式,它又包含两种转换方式:SNAT和DNAT。

    (1)源NAT(Source NAT,SNAT):修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一具SNAT的例子。

    (2)目的NAT(Destination NAT,DNAT):修改数据包的目的地址。Destination NAT刚好与SNAT相反,它是改变第一个数据包的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT。

    源NAT举例:对于以上网络拓扑图,内网的主机数量比较多,但是该组织只有一个合法的IP地址,当内网主机(10.1.1.3)往外发送数据包时,则需要修改数据包的IP地址和TCP/UDP端口号,例如将

    源IP:10.1.1.3

    源port:1493

    改成

    源IP:201.0.0.1

    源port:1492(注意:源端口号可以与原来的一样也可以不一样)

    当外网主机(201.0.0.11)响应内网主机(10.1.1.3)时,应将:

    目的IP:201.0.0.1

    目的port:1492

    改成

    目的IP:10.1.1.3

    目的port:1493

    这样,通过修改IP地址和端口的方法就可以使内网中所有的主机都能访问外网,此类NAT适用于组织或机构内只有一个合法的IP地址的情况,也是动态NAT的一种特例。

    这里写图片描述

    目的NAT举例:这种方式适用于内网的某些服务器需要为外网提供某些服务的情况。例如以上拓扑结构,内网服务器群(ip地址分别为:10.1.1.1,10.1.1.2,10.1.1.3等)需要为外网提供WEB 服务,当外网主机HostB访问内网时,所发送的数据包的目的IP地址为10.1.1.127,端口号为:80,当该数据包到达内网连接的路由器时,路由器查找NAT table,路由器通过修改目的IP地址和端口号,将外网的数据包平均发送到不同的主机上(10.1.1.1,10.1.1.2,10.1.1.3等),这样就实现了负载均衡。

    2 NAT原理

    2.1 地址转换

    NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。

    如下图所示,NAT网关有2个网络端口,其中公共网络端口的IP地址是统一分配的公共 IP,为202.20.65.5;私有网络端口的IP地址是保留地址为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机202.20.65.4发送了1个IP包(Dst=202.20.65.4,Src=192.168.1.2)。
    这里写图片描述
    当IP包经过NAT网关时,NAT Gateway会将IP包的源IP转换为NAT Gateway的公共IP并转发到公共网,此时IP包(Dst=202.20.65.4,Src=202.20.65.5)中已经不含任何私有网IP的信息。由于IP包的源IP已经被转换成NAT Gateway的公共IP,Web Server发出的响应IP包(Dst= 202.20.65.5,Src=202.20.65.4)将被发送到NAT Gateway。

    这时,NAT Gateway会将IP包的目的IP转换成私有网中主机的IP,然后将IP包(Des=192.168.1.2,Src=202.20.65.4)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。转换示意图如下。
    这里写图片描述

    如果内网主机发出的请求包未经过NAT,那么当Web Server收到请求包,回复的响应包中的目的地址就是私有网络IP地址,在Internet上无法正确送达,导致连接失败。

    2.2 连接跟踪

    在上述过程中,NAT Gateway在收到响应包后,就需要判断将数据包转发给谁。此时如果子网内仅有少量客户机,可以用静态NAT手工指定;但如果内网有多台客户机,并且各自访问不同网站,这时候就需要连接跟踪(connection track)。如下图所示:

    clip_image015

    在NAT Gateway收到客户机发来的请求包后,做源地址转换,并且将该连接记录保存下来,当NAT Gateway收到服务器来的响应包后,查找Track Table,确定转发目标,做目的地址转换,转发给客户机。

    2.3 端口转换

    以上述客户机访问服务器为例,当仅有一台客户机访问服务器时,NAT Gateway只须更改数据包的源IP或目的IP即可正常通讯。但是如果Client A和Client B同时访问Web Server,那么当NAT Gateway收到响应包的时候,就无法判断将数据包转发给哪台客户机,如下图所示。
    这里写图片描述
    此时,NAT Gateway会在Connection Track中加入端口信息加以区分。如果两客户机访问同一服务器的源端口不同,那么在Track Table里加入端口信息即可区分,如果源端口正好相同,那么在实行SNAT和DNAT的同时对源端口也要做相应的转换,如下图所示。

    clip_image019

    3 应用

    NAT主要可以实现以下几个功能:数据包伪装、平衡负载、端口转发和透明代理。

    数据伪装: 可以将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全。同时,该功能也常用来实现共享上网。例如,内网主机访问外网时,为了隐藏内网拓扑结构,使用全局地址替换私有地址。

    端口转发: 当内网主机对外提供服务时,由于使用的是内部私有IP地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机。例如公司小王在自己的服务器上架设了一个Web网站,他的IP地址为192.168.0.5,使用默认端口80,现在他想让局域网外的用户也能直接访问他的Web站点。利用NAT即可很轻松的解决这个问题,服务器的IP地址为210.59.120.89,那么为小王分配一个端口,例如81,即所有访问210.59.120.89:81的请求都自动转向192.168.0.5:80,而且这个过程对用户来说是透明的。

    负载平衡:目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。例如1.2.3所讲的目的NAT的例子。

    失效终结:目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上,提高系统的可靠性。

    透明代理:例如自己架设的服务器空间不足,需要将某些链接指向存在另外一台服务器的空间;或者某台计算机上没有安装IIS服务,但是却想让网友访问该台计算机上的内容,这个时候利用IIS的Web站点重定向即可轻松的帮助我们搞定。

    4 NAT的缺陷

    NAT在最开始的时候是非常完美的,但随着网络的发展,各种新的应用层出不穷,此时NAT也暴露出了缺点。NAT的缺陷主要表现在以下几方面:

    (1) 不能处理嵌入式IP地址或端口

    NAT设备不能翻译那些嵌入到应用数据部分的IP地址或端口信息,它只能翻译那种正常位于IP首部中的地址信息和位于TCP/UDP首部中的端口信息,如下图,由于对方会使用接收到的数据包中嵌入的地址和端口进行通信,这样就可能产生连接故障,如果通信双方都是使用的公网IP,这不会造成什么问题,但如果那个嵌入式地址和端口是内网的,显然连接就不可能成攻,原因就如开篇所说的一样。MSN Messenger的部分功能就使用了这种方式来传递IP和端口信息,这样就导致了NAT设备后的客户端网络应用程序出现连接故障。

    clip_image020

    (2) 不能从公网访问内部网络服务

    由于内网是私有IP,所以不能直接从公网访问内部网络服务,比如WEB服务,对于这个问题,我们可以采用建立静态映射的方法来解决。比如有一条静态映射,是把218.70.201.185:80与192.168.0.88:80映射起的,当公网用户要访问内部WEB服务器时,它就首先连接到218.70.201.185:80,然后NAT设备把请求传给192.168.0.88:80,192.168.0.88把响应返回NAT设备,再由NAT设备传给公网访问用户。

    (3) 有一些应用程序虽然是用A端口发送数据的,但却要用B端口进行接收,不过NAT设备翻译时却不知道这一点,它仍然建立一条针对A端口的映射,结果对方响应的数据要传给B端口时,NAT设备却找不到相关映射条目而会丢弃数据包。
    (4) 一些P2P应用在NAT后无法进行
    对于那些没有中间服务器的纯P2P应用(如电视会议,娱乐等)来说,如果大家都位于NAT设备之后,双方是无法建立连接的。因为没有中间服务器的中转,NAT设备后的P2P程序在NAT设备上是不会有映射条目的,也就是说对方是不能向你发起一个连接的。现在已经有一种叫做P2P NAT穿越的技术来解决这个问题。

    5.结语

    NAT技术无可否认是在ipv4地址资源的短缺时候起到了缓解作用;在减少用户申请ISP服务的花费和提供比较完善的负载平衡功能等方面带来了不少好处。但是在ipv4地址在以后几年将会枯竭,NAT技术不能改变ip地址空间不足的本质。然而在安全机制上也潜在着威胁,在配置和管理上也是一个挑战。如果要从根本上解决ip地址资源的问题,ipv6才是最根本之路。在ipv4转换到ipv6的过程中,NAT技术确实是一个不错的选择,相对其他的方案优势也非常明显。

    代理服务器

    1名词解释

    我们或许会帮忙家人去办理一些杂务吧!举个例子来说,例如缴费或者是申办提款卡等等的, 由于你并不是『申请者本人』而是『代理人』的角色,
    因此有时候会需要拿出一些证件

    代理服务器(Proxy Server)与上面真实世界一样,当客户端有因特网的数据要求时, Proxy 会帮用户去向目的地取得用户所需要的数据。

    所以,当客户端指定 WWW 的代理服务器之后,用户的所有 WWW 相关要求就会通过代理服务器去捉取。
    这里写图片描述

    代理服务器会架设在整个区网的单点对外防火墙上头,而在区网内部的计算机就都是透过 Proxy 来向因特网要求数据的,这就是所谓的『代理服务器』!

    当然,上面的架构仅只是一个案例,但是这个架构比较多人用的原因, 是因为这样的Proxy server 还可以兼做高阶防火墙之用。

    客户端向外部要求的数据事实上都是 Proxy 帮用户取得的,因此因特网上面看到要求数据者,将会是 Proxy 服务器的 IP 而不是客户端的 IP。

    Proxy server 因为直接对外网,相当于当了个炮灰,外网只能找到这个代理服务器,隐藏内网的机器,从而 起到防火墙的作用。

    1.1代理服务器的运作流程

    这里写图片描述

    cache的存在,可以做假象的web加速;

    当Proxy的快取拥有用户所想要的数据时:
    a. Client 端向 Server 端发送一个数据需求封包;
    b. Server 端接收之后,先比对这个封包的『来源』与预计要前往的『目标』网站是否为可接受? 如果来源与目标都是合法的,或者说,来源与目标网站我们的 Proxy 都能帮忙取得资料时,那么 Server 端会开始替 Client 取得资料。这个步骤中比较重要的就是『比对政策』啦,有点像是认证的感觉啦;
    c. Server 首先会检查自己快取 (新的数据可能在内存中,较旧的数据则放置在硬盘上) 数据, 如果有 Client 所需的数据,那就将数据准备取出,而不经过向 Internet 要求数据的程序;
    最后当然就是将数据回传给 Client 端!

    当Proxy的快取没有用户所想要的数据时:
    1. Client 端向 Server 端发送一个数据需求封包;
    2. Server 端接收之后,开始进行政策比对;
    3. Server 发现快取并没有 Client 所需要的资料,准备前往因特网抓取数据;
    4. Server 开始向 Internet 发送要求与取得相关资料;
    5. 最后当然就是将数据回传给 Client 端啰!

    注意:
    Proxy 对于 cache 的速度是很要求的,而这个 cache 就是硬盘啦!当然,硬盘容量必需要足够大,而且还要『足够快』才行!
    因为由上面的流程当中,我们不难发现, cache 是一直被重复存取的一个地方!所以硬盘的好坏就差别很大啦!
    可以说他是影响一个 Proxy效能好坏的关键

    1.2上层代理服务器

    即,我的Proxy 代理服务器的Proxy 代理服务器。
    这里写图片描述

    由于可做为我们的上层代理服务器的主机通常是具有较高带宽的, 因此我们透过它去要求数据当然『理论上』速度会更快!而上层代理服务器最大的好处其实是在于『分流』喔

    分流的效果示意图:
    这里写图片描述

    由于代理服务器需要管控信任的来源端客户端计算机,因此各 ISP 仅能针对自家的用户来开放 Proxy 使用权而已。

    1.3常用的代理服务器
    1、Microsoft Proxy代理服务器

    Microsoft Proxy Server 是微软提供的一种代理服务器解决方案,大型的局域网可以用它作为局域网的代理服务器软件。Microsoft Proxy 除了提供传统的代理功能外,还对当前Internet一些最新的应用提供了代理服务,如IP电话(Internet Phone)、网络寻呼机(ICQ)等。

    Microsoft Proxy 包括了Web Proxy、Socks Proxy、Winsock Proxy。其中Web Proxy支持HTTP、FTP等服务,WinSock Proxy支持Telnet、电子邮件、RealAudio、IRC、ICQ等服务,Socks Proxy负责中转使用S0cks代理服务的程序与外界服务器间的信息交换。Microsoft Proxy 在运行Windows NT/2000的服务器上安装后,各工作站就可以使用Web Proxy提供的服务,上网浏览、使用FTP等。如果要使用winSock Proxy和Socks Proxy提供的服务,必须要在客户端安装配置程序,并且还要在服务器端进行设置。

    相对于SyGate、WinGate等简易的代理服务器软件,Microsoft Proxy Server功能更强大,适用于企业级或大型网吧的局域网,但由于它一定要运行在WinNT/2000上,且配置比较复杂,小型局域网使用较少。

    2、Microsoft ISA 代理服务器

    Microsoft Internet Security and Acceleration Server (简称Microsoft ISA或ISA Server)是Microsoft Proxy Server的升级换代产品。ISA Server是一个可扩展的企业防火墙和Neb缓存服务器,可与Windows 2000/2003集成,以便为连网用户实现基于策略的安全的实现、数据访问的加速。

    ISA Server 最吸引人的地方在于它和 Active Directory 的集成,这使得我们可以使用与管理其它网络和用户相同的方法来管理用户访问、 Internet 以及安全策略。ISA Server 使用 Microsoft 管理控制台(MMC), MMC 是一个界面,用来管理 Windows 2000/2003 Server 中的许多功能,而且文档十分完善。

    ISA Server构建在Windows 2000/2003安全、目录、虚拟专用网络(VPN)和带宽控制基础之上。不论是作为一组单独的防火墙还是缓存服务器来部署,还是以集成的模式来部署, ISA Server均可增强网络的安全性,实施一致的Internet使用策略,加速Internet访问,并最大限度地提高各种规模公司员工的办公效率。

    3、WinProxy代理服务器

    Winproxy 是一种常用的代理服务器软件,只要安装在局域网的服务器上就可以了,它可以让局域网的多台客户机通过服务器上网。它支持SOCKs 4 & 5,利用Winproxy的SOCKs协议可以让客户机连通QQ。

    Winproxy是一款集NAT、代理和防火墙三者为一体的代理软件,它能够支持我们提到过的多种代理方式,同样也能够支持常见的协议。从功能上看,WinProxy与WinGate十分相似,但不如WinGate强大,其性能介于WinGate和CCProxy之间,对于那些不希望使用 WinGate这么复杂软件,但还需要使用NAT共享方式的用户来说,这是一个相当不错的选择。

    4 、WinGate代理服务器

    WinGate可以作为一个坚固的防火墙,能控制企业内部网络的入出访问。相对同类软件,WinGate有很多优点,如可以限制用户对 Internet访问的能力,通过GateKeeper提供的强劲的远程控制和用户认证能力(Pro版),记录和审计能力, 一个SOCKS5服务器, HTTP缓存(节省带宽和加速访问),连接映射,可作为服务运行等等。

    如果使用的是一个十多台计算机的局域网环境,以Wingate为代理服务器通过一个Modem上网,应该说速度还是可以接受的。不过,问题就是我们刚才也提到的,在操控方面,WinGate对用户的要求似乎更高些。

    作为一款经典的代理服务软件,WinGate能够提供多种网络代理服务。其最新版除了提供常用的HTTP、Socks代理服务以外,还支持 DHCP、DNS服务。同时,它还提供了完整的POP3和SMTP服务,用户可以借此构建一个邮件服务器。WinGate还特别提供了按需拨号功能。更方便的是,WinGate还能够与Windows用户进行集成,Windows NT/2000系统用户可以直接使用已创建好的用户信息。

    5、winRoute代理服务器

    WinRoute除了具有代理服务器的功能外,还具有NAT(Network Address Translation,网络地址转换)、防火墙、邮件服务器、DHCP服务器、DNS服务器等功能,能为用户提供一个功能强大的软网关。

    WinRoute有很多选项设置,涉及到网络配置的方方面面,但是它的帮助系统却不是很完善,由于WinRoute具有DHCP服务器的功能,局域网内部的机器还可配置成由WinRoute动态分配IP地址。

    WinRoute的Commands选单比较简单,可以进行拨号、断线、收发电子邮件。总体来说,WinRoute的网络功能相当全面,是一个优秀的软网关;美中不足的就是它的用户界面显得有些简单,帮助系统不完善,从而增加了配置工作的难度。

    6、SyGate代理服务器

    SyGate 是一种支持多用户访问因特网的软件,并且是只通过一台计算机,共享因特网帐号,达到上网的目的。使用SyGate 若干个用户能同时通过一个小型网络,迅速、快捷、经济地访问因特网。易于安装 SyGate在数分钟之内便可以安装完成,并且通常不需要其他外加的设置。和其他代理服务器软件不同的是,SyGate仅安装Server便可以了。

    易于使用 SyGate拥有直观的图形化界面,懂得操作Windows的人员均会操作。SyGate启动后便在后台运行,不需要人工的干预。易于管理在TCP/IP网络上,SyGate Client能让用户从任何一台计算机上远程监察和管理SyGate Server。

    SyGate诊断程序在任何时候都能帮助你确定你的系统设置以及解决网络连接的问题。SyGate设有使用日志文件以及系统设置文件,在需要的时候可轻易地查寻与检测。尽管这些功能并非是必须的,SyGate还是能以其高度的可配适性,满足任何小型网络中的多种需要。

    7、CCProxy代理服务器

    CCProxy是一款国产的代理服务器软件,能满足小型网络用户所有的代理需求。它支持HTTP、FTP、Socks4、Socks5等多种代理协议,虽然不具备与Windows用户的集成能力,但CCProxy可以自行创建用户,并允许网管员根据需要为不同用户分配不同的权限。而通过相关规则的设定,CCProxy还能对单个用户连接数、访问网址等加以限制。

    CCProxy代理服务器于2000年6月问世,是国内最流行的下载量最大的的国产代理服务器软件。主要用于局域网内共享Modem猫代理上网,ADSL代理共享、宽带代理共享、专线代理共享、ISDN代理共享、卫星代理共享、蓝牙代理共享和二级代理等共享代理上网。

    总体来说,CCProxy可以完成两项大的功能:代理共享上网和客户端代理权限管理。CCProxy非常适合中国用户使用,无论是政府机关部门,大中小公司,学校,或是网吧,CCProxy都是实现共享上网的首选代理服务器软件。

    8、squid代理服务器

    在Unix/linux下使用的比较优秀的代理服务器软件Squid。之所以说它比较优秀,是因为它可以在代理服务器上作一个很大的缓存,可以把好多常去的网站内容存储到缓存中,这样,内部网的机器再访问那些网站,就可以从缓存里调用了。

    这样一方面可以加快内部网浏览因特网的速度,这就是所谓的提高客户机的访问命中率;另一方面,Squid不仅仅支持HTTP协议,而且还支持 FTP, GOPHER,SSL和WAIS等协议考虑到简捷实用的原则,squid作为代理服务器不仅性能优异,而且还详细的纪录了各个客户端的访问纪录。

    Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。Squid可以工作在很多的操作系统中,如 AIX, Digital Unix, FreeBSD, HP-UX, Irix, Linux, NetBSD, Nextstep, SCO, Solaris,OS/2等,也有不少人在其他操作系统中重新编译过Squid。由于它安装简单,使用方便,所以已经被广泛使用。

    代理服务器与NAT技术的差异

    在内部局域网络使用私有 IP 的客户端,不论透过 Proxy 或者 NAT 均可以直接取得 WWW 的服务,那么 NAT 与 Proxy 有没有什么不同的地方啊。

    NAT 服务器的功能:就如同第九章提到的数据, Linux 的 NAT 功能主要透过封包过滤的方式, 并使用 iptables 的 nat 表格进行 IP 伪装 (SNAT) ,让客户端自行前往因特网上的任何地方的一种方式。主要的运作行为是在 OSI 七层协议的二、三、四层。由于是透过封包过滤与伪装,因此客户端可以使用的端口口号码 (第四层) 较弹性;
    Proxy 服务器的功能:主要透过 Proxy 的服务程序 (daemon) 提供网络代理的任务,因此 Proxy 能不能进行某些工作,与该服务的程序功能有关。 举例来说,如果你的 Proxy 并没有提供邮件或 FTP 代理,那么你的客户端就是无法透过 Proxy 去取得这些网络资源。 主要运作的行为在 OSI 七层协议的应用层部分(所谓的比较“高阶”之意)

    NAT 服务器是由较底层的网络去进行分析的工作,至于通过 NAT 的封包是干嘛用的, NAT 不去管他!

    至于 proxy 则主要是由一个daemon 的功能达成的,所以必需要符合该 daemon 的需求,才能达到某些功能。

    展开全文
  • HTTP代理与HTTP区别

    千次阅读 2016-09-27 15:13:03
    HTTP代理的几种方式 Wireshark抓包 第一种方法:直接请求 普通的提交HTTP请求的过程: 直接连接远程服务器后,当连接成功时向服务器提交HTTP头,注意看看大概的格式 GET / HTTP/1.1 Accept: */* Accept-Language: ...

    HTTP代理的几种方式

    Wireshark抓包

    第一种方法:直接请求

    普通的提交HTTP请求的过程:
    直接连接远程服务器后,当连接成功时向服务器提交HTTP头,注意看看大概的格式
    GET / HTTP/1.1
    Accept: */*
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
    Host: www.baidu.com

    Connection: Keep-Alive(这个地方有的是keep-alive中间有空格


    再看看使用代理的连接方法
    先连接代理服务器(IP地址、端口),然后向代理服务器提交这样的HTTP头
    GET http://www.baidu.com/ HTTP/1.0
    Accept: */*
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
    Host: www.baidu.com
    Proxy-Connection: Keep-Alive


    区别就这么一点,
    1、连接的不是目标服务器的IP地址和端口而是代理服务器IP地址和端口
    2、提交的不是相对的地址而是绝对的HTTP地址

    3、Connection: Keep-Alive 和 Proxy-Connection: Keep-Alive 的区别



    Https:

    Https是一个基于二进制的安全http协议,当使用https通过http代理服务时,http代理会认为这是一个安全https链接,将会放行https封包,所以我们可以使用https来欺骗http代理服务器,而我们自行构建的https封包中则可以封装我们自定义协议的真实数据(因为https是二进制的)。这一切让http代理看起来就像是我们在进行安全http连接一样。

     

    以下是当浏览器使用Https连接代理服务器时发送的请求:

     

    CONNECT neurospeech.com:443 HTTP/1.0 <CR><LF>
    HOST neurospeech.com:443<CR><LF>
    [... other HTTP header lines ending with <CR><LF> if required]>
    <CR><LF>    // Last Empty Line

     

    当代理服务器收到以上指令后就认为这是一个安全的http连接(https),然后为请求中指定的服务端地址打开一个二进制流式连接,如果成功,则返回以下响应:

     

    HTTP/1.0 200 Connection Established<CR><LF>
    [.... other HTTP header lines ending with <CR><LF>..
    ignore all of them]
    <CR><LF>    // Last Empty Line

     

    现在,浏览器与远端主机(非代理服务器)的连接就建立起来了,并可以通过这个链接进行二进制数据的收发。

     

    那么,当我们自己的程序要使用https来传送自己的协议数据时应该怎么办呢?

     


    1.首先需要连接到代理服务器
    2.发送 CONNECT Host:Port HTTP/1.1<CR><LF>.
    3.发送 <CR><LF>.
    4.等待一行字符串响应. 如果包含 HTTP/1.X 200 那么就说明链接成功建立了。
    5.读取收到的响应字符串直到收到一个空行为止
    6.现在,你已经通过一个http代理连接到外面的世界了,ok,开始你自己真正的数据传送吧。、

     

    为什么百度使用https连接,却直接发GET请求,而不是先发CONNECT?

    用goagent代理打印发现,其他https链接,比如维基百科,谷歌等,都是先发一次CONNECT请求,然后goagent返回“HTTP/1.1 200\r\n”,然后建立SSL连接,再接收浏览器请求,浏览器接着发GET请求。而访问百度时,直接收到GET请求,为什么呢?
    默认排序 按时间排序

    3 个回答


    展开全文
  • NAT技术与代理服务器的区别

    千次阅读 2018-06-20 21:16:19
    ISA Server 最吸引的地方在于它和 Active Directory 的集成,这使得我们可以使用管理其它网络和用户相同的方法来管理用户访问、 Internet 以及安全策略。 ISA Server 使用 Microsoft 管理控制台(MMC), MMC ...

    NAT技术

    是当前解决IP地址不够用的主要手段, 是路由器的一个重要功能

    NAT技术能够在私有IP对外通信时, 将其转为全局IP

    也就是一种将私有IP和全局IP相互转化的技术方法

    很多学校, 家庭, 公司内部在每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP

    全局IP要求唯一, 但是私有IP不需要

    在不同的局域网中出现相同的私有IP是完全不影响的

    NAT 的 IP 转换过程

    这里写图片描述

    NAT 路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37

    NAT 路由器收到外部的数据时, 又会把目标IP从 202.244.174.37 替换回 10.0.0.10

    在NAT 路由器内部, 有一张自动生成的, 用于地址转换的表

    10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系

    如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中,

    目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机呢?

    这时候NAPT就来解决这个问题了. 它使用ip + port来建立这个关联关系

    这里写图片描述

    这种关联关系也是由NAT 路由器自动维护的

    例如: 在TCP建立连接时, 就会生成这个表项, 在断开连接后, 就会删除这个表项

    NAT 技术的缺陷

    由于NAT 依赖这个转换表, 所以有诸多限制

    无法从NAT 外部向内部服务器建立连接

    转换表的生成和销毁都需要额外开销

    通信过程中一旦NAT 设备异常, 即使存在热备, 所有的TCP连接也都会断开

    代理服务器(Proxy Server)

    是一种重要的服务器安全功能,它的工作主要在 OSI 模型的会话层,从而起到防火墙的作用

    代理服务器大多被用来连接 INTERNET(国际互联网) 和 Local Area Network(局域网)

    其功能就是代理网络用户去取得网络信息。

    形象的说:它是网络信息的中转站。代理服务器就好象一个大的Cache(高速缓存),这样就能显著提高浏览速度和效率。

    更重要的是:Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,主要的功能有:

    • 突破自身IP访问限制,访问国外站点。教育网、过去的169网等
    • 网络用户可以通过代理访问国外网站
    • 访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源 的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
    • 突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试。
    • 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
    • 隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击

    在国内,所谓中国多媒体公众信息网和教育网都是独立的大型国家级局域网,是与国际互联网隔绝的。出于各种需要,某些集团或个人在两网之间开设了代理服务器,如果我们知道这些代理服务器的地址,就可以利用它到达国外网站

    NAT 和 代理服务器的区别

    路由器往往都具备NAT 设备的功能, 通过NAT 设备进行中转, 完成子网设备和其他子网设备的通信过程

    代理服务器看起来和NAT 设备有一点相似

    客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器

    服务器返回结果后, 代理服务器又把结果回传给客户端

    两者的区别是:

    • 从应用上讲, NAT 设备是网络基础设备之一, 解决的是IP不足的问题

      代理服务器则是更贴近具体应用

      比如: 通过代理服务器进行”翻墙”, 另外像迅游这样的加速器, 也是使用代理服务器实现的

    • 从底层实现上讲, NAT 是工作在网络层的, 直接对IP地址进行替换

      代理服务器往往工作在应用层

    • 从使用范围上讲, NAT 一般在局域网的出口部署

      代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网

    • 从部署位置上看, NAT 一般集成在防火墙, 路由器等硬件设备上

      代理服务器则是一个软件程序, 需要部署在服务器上

    常见的代理服务器

    1、Microsoft Proxy 代理服务器

    Microsoft Proxy Server 是微软提供的一种代理服务器解决方案,大型的局域网可以用它作为局域网的代理服务器软件。

    Microsoft Proxy 除了提供传统的代理功能外,还对当前Internet一些最新的应用提供了代理服务

    如IP电话(Internet Phone)、网络寻呼机(ICQ)等。

    Microsoft Proxy 包括了Web Proxy、Socks Proxy、Winsock Proxy。

    其中Web Proxy支持HTTP、FTP等服务,WinSock Proxy支持Telnet、电子邮件、RealAudio、IRC、ICQ等服务,Socks Proxy负责中转使用Socks代理服务的程序与外界服务器间的信息交换。

    Microsoft Proxy 在运行Windows NT/2000的服务器上安装后,各工作站就可以使用Web Proxy提供的服务,上网浏览、使用FTP等。

    如果要使用winSock Proxy和Socks Proxy提供的服务,必须要在客户端安装配置程序,并且还要在服务器端进行设置。

    相对于SyGate、WinGate等简易的代理服务器软件,Microsoft Proxy Server功能更强大,适用于企业级或大型网吧的局域网,但由于它一定要运行在WinNT/2000上,且配置比较复杂,小型局域网使用较少。

    2、Microsoft ISA 代理服务器

    Microsoft Internet Security and Acceleration Server (简称Microsoft ISA或ISA Server)

    是Microsoft Proxy Server的升级换代产品

    ISA Server是一个可扩展的企业防火墙和Neb缓存服务器,可与Windows 2000/2003集成,以便为连网用户实现基于策略的安全的实现、数据访问的加速。

    ISA Server 最吸引人的地方在于它和 Active Directory 的集成,这使得我们可以使用与管理其它网络和用户相同的方法来管理用户访问、 Internet 以及安全策略。

    ISA Server 使用 Microsoft 管理控制台(MMC), MMC 是一个界面,用来管理 Windows 2000/2003 Server 中的许多功能,而且文档十分完善。

    ISA Server构建在Windows 2000/2003安全、目录、虚拟专用网络(VPN)和带宽控制基础之上。不论是作为一组单独的防火墙还是缓存服务器来部署,还是以集成的模式来部署, ISA Server均可增强网络的安全性,实施一致的Internet使用策略,加速Internet访问,并最大限度地提高各种规模公司员工的办公效率。

    3、WinProxy 代理服务器

    Winproxy 是一种常用的代理服务器软件,只要安装在局域网的服务器上就可以了,它可以让局域网的多台客户机通过服务器上网。

    它支持SOCKs 4 & 5,利用Winproxy的SOCKs协议可以让客户机连通QQ。

    Winproxy是一款集NAT、代理和防火墙三者为一体的代理软件,它能够支持我们提到过的多种代理方式,同样也能够支持常见的协议。

    从功能上看,WinProxy与WinGate十分相似,但不如WinGate强大,其性能介于WinGate和CCProxy之间,对于那些不希望使用 WinGate这么复杂软件,但还需要使用NAT共享方式的用户来说,这是一个相当不错的选择。

    4 、WinGate 代理服务器

    WinGate可以作为一个坚固的防火墙,能控制企业内部网络的入出访问。

    相对同类软件,WinGate有很多优点,如可以限制用户对 Internet访问的能力,通过GateKeeper提供的强劲的远程控制和用户认证能力(Pro版),记录和审计能力, 一个SOCKS5服务器, HTTP缓存(节省带宽和加速访问),连接映射,可作为服务运行等等。

    如果使用的是一个十多台计算机的局域网环境,以Wingate为代理服务器通过一个Modem上网,应该说速度还是可以接受的。

    不过,问题就是我们刚才也提到的,在操控方面,WinGate对用户的要求似乎更高些。

    作为一款经典的代理服务软件,WinGate能够提供多种网络代理服务。

    其最新版除了提供常用的HTTP、Socks代理服务以外,还支持 DHCP、DNS服务。

    同时,它还提供了完整的POP3和SMTP服务,用户可以借此构建一个邮件服务器。

    WinGate还特别提供了按需拨号功能。

    更方便的是,WinGate还能够与Windows用户进行集成,Windows NT/2000系统用户可以直接使用已创建好的用户信息。

    5、winRoute 代理服务器

    WinRoute除了具有代理服务器的功能外,还具有NAT(Network Address Translation,网络地址转换)、防火墙、邮件服务器、DHCP服务器、DNS服务器等功能,能为用户提供一个功能强大的软网关。

    WinRoute有很多选项设置,涉及到网络配置的方方面面,但是它的帮助系统却不是很完善,由于WinRoute具有DHCP服务器的功能,局域网内部的机器还可配置成由WinRoute动态分配IP地址。

    WinRoute的Commands选单比较简单,可以进行拨号、断线、收发电子邮件。

    总体来说,WinRoute的网络功能相当全面,是一个优秀的软网关, 美中不足的就是它的用户界面显得有些简单,帮助系统不完善,从而增加了配置工作的难度。

    6、SyGate 代理服务器

    SyGate 是一种支持多用户访问因特网的软件,并且是只通过一台计算机,共享因特网帐号,达到上网的目的。

    使用SyGate 若干个用户能同时通过一个小型网络,迅速、快捷、经济地访问因特网。

    易于安装 SyGate在数分钟之内便可以安装完成,并且通常不需要其他外加的设置。

    和其他代理服务器软件不同的是,SyGate仅安装Server便可以了。

    SyGate拥有直观的图形化界面,懂得操作Windows的人员均会操作。

    SyGate启动后便在后台运行,不需要人工的干预。

    易于管理在TCP/IP网络上,SyGate Client能让用户从任何一台计算机上远程监察和管理SyGate Server。

    SyGate诊断程序在任何时候都能帮助你确定你的系统设置以及解决网络连接的问题。

    SyGate设有使用日志文件以及系统设置文件,在需要的时候可轻易地查寻与检测。

    尽管这些功能并非是必须的,SyGate还是能以其高度的可配适性,满足任何小型网络中的多种需要。

    7、CCProxy 代理服务器

    CCProxy是一款国产的代理服务器软件,能满足小型网络用户所有的代理需求。

    它支持HTTP、FTP、Socks4、Socks5等多种代理协议,虽然不具备与Windows用户的集成能力,但CCProxy可以自行创建用户,并允许网管员根据需要为不同用户分配不同的权限。

    而通过相关规则的设定,CCProxy还能对单个用户连接数、访问网址等加以限制。

    CCProxy代理服务器于2000年6月问世,是国内最流行的下载量最大的的国产代理服务器软件。

    主要用于局域网内共享Modem猫代理上网,ADSL代理共享、宽带代理共享、专线代理共享、ISDN代理共享、卫星代理共享、蓝牙代理共享和二级代理等共享代理上网。

    总体来说,CCProxy可以完成两项大的功能:代理共享上网和客户端代理权限管理。

    CCProxy非常适合中国用户使用,无论是政府机关部门,大中小公司,学校,或是网吧,CCProxy都是实现共享上网的首选代理服务器软件。

    8、squid 代理服务器

    在Unix/linux下使用的比较优秀的代理服务器软件Squid

    之所以说它比较优秀,是因为它可以在代理服务器上做一个很大的缓存,可以把好多常去的网站内容存储到缓存中,这样,内部网的机器再访问那些网站,就可以从缓存里调用了。

    这样一方面可以加快内部网浏览因特网的速度,这就是所谓的提高客户机的访问命中率

    另一方面,Squid不仅仅支持HTTP协议,而且还支持 FTP, GOPHER,SSL和WAIS等协议

    考虑到简捷实用的原则,squid作为代理服务器不仅性能优异,而且还详细的纪录了各个客户端的访问纪录。

    Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。

    Squid可以工作在很多的操作系统中,如 AIX, Digital Unix, FreeBSD, HP-UX, Irix, Linux, NetBSD, Nextstep, SCO, Solaris,OS/2等,也有不少人在其他操作系统中重新编译过Squid

    由于它安装简单,使用方便,所以已经被广泛使用。

    展开全文
  • 谈谈 Java 反射机制,动态代理是基于什么原理?典型回答反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类...

    谈谈 Java 反射机制,动态代理是基于什么原理?

    典型回答

    反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。

    动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。

    实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等。

    详细答案:

    1 关于反射
    反射最大的作用之一就在于我们可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。注意:不是在编译时,而是在运行时。

    功能:
    •在运行时能判断任意一个对象所属的类。
    •在运行时能构造任意一个类的对象。
    •在运行时判断任意一个类所具有的成员变量和方法。
    •在运行时调用任意一个对象的方法。
    说大白话就是,利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。

    应用场景:
    反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。

    特点:
    由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

    2 动态代理
    为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在两者之间起到中介的作用(可类比房屋中介,房东委托中介销售房屋、签订合同等)。
    所谓动态代理,就是实现阶段不用关心代理谁,而是在运行阶段才指定代理哪个一个对象(不确定性)。如果是自己写代理类的方式就是静态代理(确定性)。

    组成要素:
    (动态)代理模式主要涉及三个要素:
    其一:抽象类接口
    其二:被代理类(具体实现抽象接口的类)
    其三:动态代理类:实际调用被代理类的方法和属性的类

    实现方式:
    实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了反射机制。还有其他的实现方式,比如利用字节码操作机制,类似 ASM、CGLIB(基于 ASM)、Javassist 等。
    举例,常可采用的JDK提供的动态代理接口InvocationHandler来实现动态代理类。其中invoke方法是该接口定义必须实现的,它完成对真实方法的调用。通过InvocationHandler接口,所有方法都由该Handler来进行处理,即所有被代理的方法都由InvocationHandler接管实际的处理任务。此外,我们常可以在invoke方法实现中增加自定义的逻辑实现,实现对被代理类的业务逻辑无侵入。

    考点分析

    这个题目给我的第一印象是稍微有点诱导的嫌疑,可能会下意识地以为动态代理就是利用反射机制实现的,这么说也不算错但稍微有些不全面。功能才是目的,实现的方法有很多。总的来说,这道题目考察的是 Java 语言的另外一种基础机制: 反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。而动态代理,则是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。

    从考察知识点的角度,这道题涉及的知识点比较庞杂,所以面试官能够扩展或者深挖的内容非常多,比如:

    • 考察你对反射机制的了解和掌握程度。

    • 动态代理解决了什么问题,在你业务系统中的应用场景是什么?

    • JDK 动态代理在设计和实现上与 cglib 等方式有什么不同,进而如何取舍?

    这些考点似乎不是短短一篇文章能够囊括的,我会在知识扩展部分尽量梳理一下。

    知识扩展

    1. 反射机制及其演进

    对于 Java 语言的反射机制本身,如果你去看一下 java.lang 或 java.lang.reflect 包下的相关抽象,就会有一个很直观的印象了。Class、Field、Method、Constructor 等,这些完全就是我们去操作类和对象的元数据对应。反射各种典型用例的编程,相信有太多文章或书籍进行过详细的介绍,我就不再赘述了,至少你需要掌握基本场景编程,这里是官方提供的参考文档:https://docs.oracle.com/javase/tutorial/reflect/index.html 。

    关于反射,有一点我需要特意提一下,就是反射提供的 AccessibleObject.setAccessible​(boolean flag)。它的子类也大都重写了这个方法,这里的所谓 accessible 可以理解成修饰成员的 public、protected、private,这意味着我们可以在运行时修改成员访问限制!

    setAccessible 的应用场景非常普遍,遍布我们的日常开发、测试、依赖注入等各种框架中。比如,在 O/R Mapping 框架中,我们为一个 Java 实体对象,运行时自动生成 setter、getter 的逻辑,这是加载或者持久化数据非常必要的,框架通常可以利用反射做这个事情,而不需要开发者手动写类似的重复代码。

    另一个典型场景就是绕过 API 访问控制。我们日常开发时可能被迫要调用内部 API 去做些事情,比如,自定义的高性能 NIO 框架需要显式地释放 DirectBuffer,使用反射绕开限制是一种常见办法。

    但是,在 Java 9 以后,这个方法的使用可能会存在一些争议,因为 Jigsaw 项目新增的模块化系统,出于强封装性的考虑,对反射访问进行了限制。Jigsaw 引入了所谓 Open 的概念,只有当被反射操作的模块和指定的包对反射调用者模块 Open,才能使用 setAccessible;否则,被认为是不合法(illegal)操作。如果我们的实体类是定义在模块里面,我们需要在模块描述符中明确声明:

    module MyEntities {
        // Open for reflection
        opens com.mycorp to java.persistence;
    }
    

    因为反射机制使用广泛,根据社区讨论,目前,Java 9 仍然保留了兼容 Java 8 的行为,但是很有可能在未来版本,完全启用前面提到的针对 setAccessible 的限制,即只有当被反射操作的模块和指定的包对反射调用者模块 Open,才能使用 setAccessible,我们可以使用下面参数显式设置。

    --illegal-access={ permit | warn | deny }
    

    2. 动态代理

    前面的问题问到了动态代理,我们一起看看,它到底是解决什么问题?

    首先,它是一个代理机制。如果熟悉设计模式中的代理模式,我们会知道,代理可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成。其实很多动态代理场景,我认为也可以看作是装饰器(Decorator)模式的应用,我会在后面的专栏设计模式主题予以补充。

    通过代理可以让调用者与实现者之间解耦。比如进行 RPC 调用,框架内部的寻址、序列化、反序列化等,对于调用者往往是没有太大意义的,通过代理,可以提供更加友善的界面。

    代理的发展经历了静态到动态的过程,源于静态代理引入的额外工作。类似早期的 RMI 之类古董技术,还需要 rmic 之类工具生成静态 stub 等各种文件,增加了很多繁琐的准备工作,而这又和我们的业务逻辑没有关系。利用动态代理机制,相应的 stub 等类,可以在运行时生成,对应的调用操作也是动态完成,极大地提高了我们的生产力。改进后的 RMI 已经不再需要手动去准备这些了,虽然它仍然是相对古老落后的技术,未来也许会逐步被移除。

    这么说可能不够直观,我们可以看 JDK 动态代理的一个简单例子。下面只是加了一句 print,在生产系统中,我们可以轻松扩展类似逻辑进行诊断、限流等。

    public class MyDynamicProxy {
        public static  void main (String[] args) {
            HelloImpl hello = new HelloImpl();
            MyInvocationHandler handler = new MyInvocationHandler(hello);
            // 构造代码实例
            Hello proxyHello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(), handler);
            // 调用代理方法
            proxyHello.sayHello();
        }
    }
    interface Hello {
        void sayHello();
    }
    class HelloImpl implements  Hello {
        @Override
        public void sayHello() {
            System.out.println("Hello World");
        }
    }
     class MyInvocationHandler implements InvocationHandler {
        private Object target;
        public MyInvocationHandler(Object target) {
            this.target = target;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            System.out.println("Invoking sayHello");
            Object result = method.invoke(target, args);
            return result;
        }
    }
    

    上面的 JDK Proxy 例子,非常简单地实现了动态代理的构建和代理操作。首先,实现对应的 InvocationHandler;然后,以接口 Hello 为纽带,为被调用目标构建代理对象,进而应用程序就可以使用代理对象间接运行调用目标的逻辑,代理为应用插入额外逻辑(这里是 println)提供了便利的入口。

    从 API 设计和实现的角度,这种实现仍然有局限性,因为它是以接口为中心的,相当于添加了一种对于被调用者没有太大意义的限制。我们实例化的是 Proxy 对象,而不是真正的被调用类型,这在实践中还是可能带来各种不便和能力退化。

    如果被调用者没有实现接口,而我们还是希望利用动态代理机制,那么可以考虑其他方式。我们知道 Spring AOP 支持两种模式的动态代理,JDK Proxy 或者 cglib,如果我们选择 cglib 方式,你会发现对接口的依赖被克服了。

    cglib 动态代理采取的是创建目标类的子类的方式,因为是子类化,我们可以达到近似使用被调用者本身的效果。在 Spring 编程中,框架通常会处理这种情况,当然我们也可以显式指定。关于类似方案的实现细节,我就不再详细讨论了。

    那我们在开发中怎样选择呢?我来简单对比下两种方式各自优势。

    JDK Proxy 的优势:

    • 最小化依赖关系,减少依赖意味着简化开发和维护,JDK 本身的支持,可能比 cglib 更加可靠。

    • 平滑进行 JDK 版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用。

    • 代码实现简单。

    基于类似 cglib 框架的优势:

    • 有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似 cglib 动态代理就没有这种限制。

    • 只操作我们关心的类,而不必为其他相关类增加工作量。

    • 高性能。

    另外,从性能角度,我想补充几句。记得有人曾经得出结论说 JDK Proxy 比 cglib 或者 Javassist 慢几十倍。坦白说,不去争论具体的 benchmark 细节,在主流 JDK 版本中,JDK Proxy 在典型场景可以提供对等的性能水平,数量级的差距基本上不是广泛存在的。而且,反射机制性能在现代 JDK 中,自身已经得到了极大的改进和优化,同时,JDK 很多功能也不完全是反射,同样使用了 ASM 进行字节码操作。

    我们在选型中,性能未必是唯一考量,可靠性、可维护性、编程工作量等往往是更主要的考虑因素,毕竟标准类库和反射编程的门槛要低得多,代码量也是更加可控的,如果我们比较下不同开源项目在动态代理开发上的投入,也能看到这一点。

    动态代理应用非常广泛,虽然最初多是因为 RPC 等使用进入我们视线,但是动态代理的使用场景远远不仅如此,它完美符合 Spring AOP 等切面编程。我在后面的专栏还会进一步详细分析 AOP 的目的和能力。简单来说它可以看作是对 OOP 的一个补充,因为 OOP 对于跨越不同对象或类的分散、纠缠逻辑表现力不够,比如在不同模块的特定阶段做一些事情,类似日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等,你可以参考下面这张图。

    

    AOP 通过(动态)代理机制可以让开发者从这些繁琐事项中抽身出来,大幅度提高了代码的抽象程度和复用度。从逻辑上来说,我们在软件设计和实现中的类似代理,如 Facade、Observer 等很多设计目的,都可以通过动态代理优雅地实现。

    今天我简要回顾了反射机制,谈了反射在 Java 语言演进中正在发生的变化,并且进一步探讨了动态代理机制和相关的切面编程,分析了其解决的问题,并探讨了生产实践中的选择考量。

    展开全文
  • 代理模式

    千次阅读 2016-05-30 22:05:09
    对于程序员来说最常接触的代理模式就是代理上网,让别人买饭也是代理,如果你碰到辞职老板不给你发工资,那么要请个律师打官司,这也是代理     二.代理模式的定义 为其他对象提供一种代理以控制对这个对象的访问...
  • div中的相对定位绝对定位

    千次阅读 2015-02-06 09:54:18
    包含的属性:relative(相对 absolute(绝对)  1.position:relative; 如果对一个元素进行相对定位,首先它将出现在它所在的位置上。然后通过设置垂直或水平位置,让这个元素“相对于”它的原始起点进行...
  • SNMP介绍,OID及MIB库 理解与关系

    千次阅读 2019-03-21 21:27:41
    因此,在这里真正需要注意的是,MIB其实只是提供给我们一张我们想从某个SNMP代理中获得的可用OID的各种值的地图。一个MIB描述了在哪里找某个值、以及返回结果是什么。我们可以不用MIB设备进行交互,只不过在理获得...
  • 我们知道TCP是端到端协议,其对中间链路是无感知的,拥塞控制机制中的cwnd如何能相对精确预知,一直是一个世界级难题。可以肯定的是,TCP两端相距越远,RTT越大,链路状况越是难以获取,误判越是会增多,而误判的...
  • 浅谈Android中的MVP动态代理的结合

    千次阅读 热门讨论 2017-09-24 00:31:56
    浅谈Android中的MVP动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右。从最开始到现在经历的几个项目中我都采用了MVP架构...
  • 一,题记所有的业务系统,都有生成ID的需求,如订单id,商品id,文章ID等。这个ID会是数据库中的唯一...著名的例子就是身份证号码,身份证号码确实是对唯一的,然而一个是可以办理多个身份证的,例如你身份证...
  • jvm的新生代、老年代、永久代关系

    万次阅读 多人点赞 2018-07-08 13:43:44
    很多认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是在新生代中...
  • OpenID Connect vs OpenID 2.0:OpenID Connect完成很多OpenID 2.0相同的任务,是API-friendly,定义了可选的签名和加密的机制;OAuth 1.0a和OpenID 2.0的集成需要扩展,而OpenID Connect协议本身就建立在OAuth ...
  • 关系抽取的论文收集

    千次阅读 2019-03-01 16:00:18
    找了ACL NACL EMNLP这两年的一些关系抽取的论文 Neural Relation Extraction with Selective Attention over Instances(16年,典型模型) 代码:(https://github.com/thunlp/NRE.) 运用attention机制来尽量减轻...
  • 动态代理和静态代理到底有什么区别,好处在哪里?
  • 深入学习JDK动态代理

    千次阅读 2018-07-22 10:51:08
    例如,明星都有经纪人,明星参演电影之前,经纪人作为明星的代理人和出资方洽谈片酬、排期等,而真正参与拍戏的还是明星本人,明星拍完戏后,由经纪人代理明星去清算片酬等。Java中的代理机制就是在目标方法执行前后...
  • 代理扫描心得

    千次阅读 2012-07-02 01:41:32
    我这个是学习笔记,希望开拓大家的思路,具体的应用还要大家自已去实践,有了好的工具技巧别忘了告诉我哈。还有就是别用此来作非法的事...... 此文是原创!转出请注明星荧,并等同加密! 一.初级代理扫描工具:...
  • 很多时候程序默认是以jmeter的bin目录为根路径的,如果参数文件或是java文件的相对路径不是以bin为开始目录,很可能在分布式测试时,就出现远程代理机所调用的文件路径本地脚本不一致。  所以最好的方式是,将...
  • 委托代理理论

    千次阅读 2007-04-15 14:29:00
    一,现代企业理论的框架 在阿罗一德布鲁...于是从20世纪印年代末70年代初开始,一批经济学家从这两方面手,深入到企业内部的关系中,也就是说深入到"黑匣子"里面研究企业中的组织结构问题,期望得到关于企业这种经济组织
  • 获取模块相对比较简单,主要功能就是从各个免费代理网站上将我们所需要的代理信息抓取下来。示例如下: import requests from pyquery import PyQuery from MysqlClient import MysqlClient from ...
  • 用Delphi实现动态代理(2):设计说明

    千次阅读 热门讨论 2005-03-05 10:19:00
    用Delphi实现动态代理(2):设计说明 [Mental Studio]猛禽[Blog]在上篇《用Delphi实现动态代理(1):概述》中,对动态代理作了一个概要的说明,比如为什么需要这样的动态代理,它有什么用等。本篇将对我实现的这个动态...
  • 因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。 "围观"设计模式(15)--结构型之桥梁模式(Bridge ...
  • 了解 OpenStack 各组件的逻辑关系;了解 OpenStack 的各组件的通信和部署关系;了解 OpenStack 的工作流程; 接下来我会掌握: OpenStack 组件间的逻辑关系;OpenStack 的API;OpenStack 组件间的通信关系;...
  • wget--Windows10下的安装使用

    千次阅读 2019-01-30 09:54:46
    文章目录一、下载安装二、使用方法wget -P 目录 网址三、详情参数 一、下载安装 GNU Wget是一个在网络上进行下载的简单而强大的自由软件,其本身也是GNU计划的一部分。它的名字是“World Wide Web”和“Get”的...
  • Java反射和动态代理详解和实例

    千次阅读 2014-09-09 14:26:14
     编写一个目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。  如果采用工厂模式和配置文件的方法进行管理,则不需要修改客户端程序,在配置文件中...
  • 设计模式之类之间的关系和六大原则1 类之间的关系1.1 继承关系1.2 实现关系1.3 依赖关系1.4 关联关系1.5 聚合关系1.6 组合关系1.7 总结2 ...类类之间的关系大概有6种,要看懂UML图,首先需要了解这几种关系。 1.1...
  • 厉害了!打工用Python分析西安市职位信息

    千次阅读 热门讨论 2020-12-05 21:54:24
    如果有一天“996”被合法化并成为一种常态,那么,我们又该如何去面对“会一天天衰老,总有一天肝不动”的客观规律呢?我注意到Boss直聘移动端会展示某个公司的作息时间,所以,我有了抓取西安市职位和公司信息并...
  • 2018年1月iOS招心得(附面试题)- 答案整理 基础不牢,地动山摇. 面试问的大多都是开发所必备的基础知识,通过面试题整理自己的技术栈是一个非常不错的途径. 这套面试题可作为开发同仁的一份复习提纲, 整理过程中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,477
精华内容 26,190
关键字:

代理人与相对人的关系