sock5源码
⑴ 什么是http代理服务器
我们可以将巨大的互联网比作成一张网络蜘蛛网,而网络爬虫便是在蜘蛛网上爬行的蜘蛛,把网的节点描述成为网页,我们将每日任务需求借助客户端电脑发出命令,而ip便是被执行的角色,ip带着每日任务借助因特网抵达终端服务器寻找客户端交代的每日任务,一个一个节点便是一个一个网页,如此蜘蛛借助一个节点之后,就可以沿着几点连线继续爬行抵达下个节点。也就说借助一个网页继续抓取。
爬虫首要便是要抓取终端服务器的网页,也就是抓取到网页的源代码,源代码包中抓取到实用的信息,就将实用的源代码获取,提取每日任务中所需的信息。
ip将抓取到实用的信息回到到客户端存储,随后再返回去,不断频繁的访问获得信息直到完成任务。因此ip便是负责带着每日任务寻找有价值的信息,随后将抓取到的有价值的信息数据负责带回(传输)到客户端,直到完成任务。
⑵ eMule有什么优点
eMule是一个开放的P2P档案分享软件,基于eDonkey的网络协议。eMule这个名称来源于一个动物——骡,所以中文中也称作电骡或骡子等。
eMule起源
在2002年05月13日一个叫做Merkur的人,他不满意当时的eDonkey 2000客户端并且坚信自己能做出更出色的P2P软件,于是便着手开发。他凝聚了一批原本在其他领域有出色发挥的程序员在他的周围,eMule工程就此诞生。他的目标是将eDonkey的优点及精华保留下来,并加入新的功能以及使图形界面变得更好。现在eMule的最新版本是0.47a。
现在eMule已是世界上最大并且最可靠的点对点文档共享的客户端软件。感谢开放源代码的政策,使许多开发人员能够对这个工程有所贡献,从而使发布新版本显得更有效率。
eMule特色
客户端使用多个途径搜索下载的资源,ED2K、来源交换、Kad共同组成一个可靠的网络结构。
eMule的排队机制和上传积分系统有助于激励人们共享并上传给他人资源,以使自己更容易、更快速地下载自己想要的资源。
eMule是完全免费的。也完全没有任何的广告软件。他们这么做是为了乐趣及知识,而不是为了金钱。
每个下载的文件都会自动检查是否损坏以确保文件的正确性。(FTP却不能保证精确复制)
智能损坏控制有助于快速修复损坏的部分。
自动优先权及来源管理系统允许您一次下载许多个资源而无须监视它们。
预览功能允许您在下载完成之前查看您的视频文件。
eMule的Web服务特性和Web服务器允许您快速得从网络存取资料。
能在下载时间里类别以组织和管理文件。
寻找您想要的资源,eMule提供了一个大范围的搜索方式,包含了:服务器搜索(本地和全球)、基于Web搜索(Jigle和Filedonkey)及Kad网络(仍在测试)。
eMule还允许您使用非常复杂的布林搜索使搜索更为灵活。
使用信息及好友系统,您能传送讯息到其他的客户端并可将他们加为您的好友。有好友上线的话,你就能在您的好友列表中看到他(她)。
使用内建的IRC客户端, 您能和全世界其他的共享者聊天。
在官方版基础上,有各种各样的修改版本(Mod),提供了各种不同的附加功能。并且这些Mod也都是开放源代码的,这使得eMule的发展突飞猛进。
eMule与其他P2P软件相比的优点及特色
客户端使用多个途径搜索下载的资料源,ED2K、来源交换、Kad共同组成一个可靠的网络结构。
在eMule v0.42及后续版本中,可以使用Kad。
eMule的排队机制和上传积分系统有助于激励人们共享并上传给他人资源,以使自己更容易、更快速地下载自己想要的资源。
eMule是完全免费的。官方版eMule也完全没有任何的广告软件。
每个下载的文件都会自动检查是否损坏以确保文件的正确性。(FTP却不能保证精确复制)
智慧损坏控制有助于快速修复损坏的部分。
自动优先权及来源管理系统允许一次下载许多个资源而无须监视它们。
预览功能可在下载完成之前查看影片。
eMule的Web服务特性和Web服务器允许使用者快速得从网络存取资料。
能在下载时间里类别以组织和管理文件。
寻找想要的资源,eMule提供了一个大范围的搜索方式,包含了:服务器搜索(本地和全球)、基于Web搜索(Jigle 和 Filedonkey)及Kad网络(仍在测试)。
允许使用非常复杂的布林搜索使搜索更为灵活。
使用信息及好友系统,能传送讯息到其他的客户端并可将他们加为好友。有好友上线的话,就能在好友列表中看到他(她)。
使用内建的IRC客户端, 使用者能和全世界的共享者聊天。
1)P2P到底是什么?
Peer-to-peer的缩写,指的是点对点的意思,最早是在美国由 18岁的Shawn Fanning开发出一个叫Napster的软件时,引入得概念 ,它不仅仅是一种软件架构,也是一种社会模式的体现,网络上流行的P2P软件的架构手段主要有两种:集中式和分布式。
集中式:便是利用服务器作为媒介使各个分散的节点(用户)能互相联系,生成各种服务响应。
分布式:每个节点即做服务器又做客户端,这种方式非常灵活,一个孤立的节点只要连上另一个节点便可以进行传输。
Napster可以说是第一代p2p软件。后来由于Napster陷入诉讼危机(相关版权问题),便出现了Gnutella,它吸取了Napster的失败教训,将P2P的理念更推进一步:它不存在中枢目录服务器,用户只要安装了该软件,立即变成一台能够提供完整目录和文件服务的服务器,并会自动搜寻其它同类服务器,从而联成一台由无数PC组成的网络超级服务器。传统网络的Server和Client在它的面前被重新定义。Gnutella作为第二代p2p软件,他们可以说是最早的p2p技术。然后FastTrack (即Kazaa 的底层技术)迅速掘起取代其地位。成为p2p老大。
2)emule到底是什么?
随着二代技术的普及,又一个的问题诞生了,自私的人们在利用P2P软件的时候大多只愿"获取”,而不愿"共享”,P2P的发展遇到了意识的发展瓶颈。不过,一头"骡”很快改变了游戏规则,它就是后来鼎鼎大名的 eDonkey。这标志着第三代p2p技术的兴起,eDonkey采用了以"分散式杂凑表”(distributed hash tables )为诉求的Neonet技术,改变了P2P网络上的搜索方式,理论上可以更有效率的搜索更多的电脑,以及更容易找出少见的文件。这种技术已经使eDonkey基本快要追上了P2P服务龙头业界的另一个老大Kazaa了. eDonkey由Jed McCaleb在2000年创立。他最重要的是可以同时从许多人那里下载同一个文件,并且采用了"多源文件传输协议”(MFTP,the Multisource FileTransfer Protocol)。电骡的索引服务器并不集中在一起的,而是各人私有的,遍布全世界,每一个人都可以运行电骡服务器,同时共享的文件索引为被称为"ed2k-quicklink”的连接,文件前缀"ED2K://”。同时,在协议中,定义了一系列传输、压缩和打包的标准,甚至还定义了一套积分的标准,你上传的数据量越大,积分越高,下载的速度也越快。而且每个文件都有有md5-hash的超级链接标示,这使得该文件独一无二,并且在整个网络上都可以追踪得到。EDonkey可以通过检索分段从多个用户那里下载文件,最终将下载的文件片断拼成整个文件。而且,只要你得到了一个文件片断,系统就会把这个片断共享给大家,尽管通过选项的设置你可以对上传速度做一些控制,但你无法关闭它。
在eDonkey出现后,其改良品种eMule(电骡)也出现了。可以说emule是eDonkey的升级版,是eDonkey的一个Mod,就象osp就是quake3的mod一样,它的独到之处在于开源,它的基本原理和运作方式,也都是基于eDonkey, eMule基于eDonkey网络协议,因此能够直接登录eDonkey的各类服务器。eMule同时也提供了很多eDonkey所没有的功能,比如可以自动搜索网络中的服务器、保留搜索结果、与连接用户交换服务器地址和文件、优先下载便于预览的文件头尾部分等等,这些都使得eMule使用起来更加便利,也让它得到了电骡的美誉。
总之,他们继承了第二代P2P无中心、纯分布式系统的特点,但他们它不再是简单的点到点通信,而是更高效、更复杂的网络通信;再加上eDonkey和eMule引入的强制共享机制,在一定程度上避免了前几代P2P纯个人服务器管理带来的随意性和低效率。
3)emule的下载原理?
当你在搜索列表中选取了你要的文件并开始下载后,emule会记录下这个文件的大小,文件名以及另一个叫做hash的特殊值。会向所有添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。它最棒的部分就在于:你不是只在一个用户那里下载文件,而是同时从许多个用户那里下载文件。如果另一个用户仅仅只有你要的文件的一个小小片断,他也会自动地把这个片断分享个大家,而你就可以从这个用户的机器上下载这个片断。当然你也是一样。只要你得到了一个文件片断,系统就会把这个片断共享给大家。在查找到下载源(其他客户端)后,下载就是客户端和客户端通过点对点(P2P)进行直接对话了。期间没有数据流通过服务器。
4)emule是如何工作的?
emule建立于多点文件传输协议之上。一个emule网络由服务器端和客户端两部分组成。服务器端是客户端连接的、为了搜索和查找可以下载用户的桥梁。服务器列表像电话本一样排列,客户通过浏览它而获取他需要的文件所有者的客户端信息。在download过程中,没有下载文件通过服务器端。
5)emule是如何搜索的?
每一个客户端连接到一个服务器作为他的主服务器。在连接时,由客户端告诉主服务器他share了那些文件,以及IP地址等其他信息。所以每一个服务器会记录所有登陆到他服务器上的以上信息。在本服务器搜索时,它会通过匹配记录的已知以上信息把查找结果反馈给搜索的客户端列表。当你使用扩展搜索(extend search)时,你的搜索请求和应答结果通过发送限制带宽的UDP包连接到客户端本身的服务器列表(server.met)对应的某一个ip地址的服务器。
6)emule是如何下载的?
当客户端选择了一个文件下载时,它首先收集一个拥有该文档的客户端的列表。它会先行查询主服务器所有登陆用户他们是否拥有该文件。然后再连接和查选其他服务器的登陆用户所拥有该文件的客户端列表。一旦它找到拥有该文件的其他客户端,它将请求每个客户端发送这个文件的不同片。直至最后文件由这个不同的片组装成一个完整的文件。 在进行pause/resume的时候,我们选择的下载列表已经获取,它pause的仅仅是客户端和客户端之间的TCP连接然后恢复TCP连接。这个过程只有再resume时通过客户端向服务器端发送22个字节后即可。占用的仅仅是22个字节的网络流量。在pause是甚至不通过你登陆的服务器进行,也无须你登陆的主服务器进行任何干预和操作。所以说,它并未占用主服务什么资源,只是在你已经和主服务器连接的通道上发送22个字节而已。
7)emule有什么优点?
不需要服务器来存放共享文件,节省了服务器架设、海量硬盘、网络带宽。 每个用户端节点都同时是文件下载者和提供者。实际上,在你正在下载但还没当完整个文件时,你已经可以把你已下载的部分共享给别人了! 因为emule同时从很多文件提供者那里下载所需的文件最后再拼成整个文件的。加入的人越多,下载速度越快,资源越丰富。 共享方便,每个人在自已的emule里指定一个share目录就可以把自己的文件共享给网络中的其它人了。不必再辛苦地上传到服务器上了。
以上就是关于emule的一些基础知识,希望大家看完之后,能对emule的原理,有一个本质的认识。
下面我再来说说一些很困扰,很迷惑人的问题。
1)id问题
朋友们最关心的就是这个问题,id是什么?id其实没有什么用,id就是在emule传输里面,作为地址作用的一个东西,起到寻址和寻址作用,它直接和我们ip挂钩,是由emule根据我们的ip地址,通过算法得到的一组数字。所以adsl用户经常会说,为什么我的id变了?当然要变,因为你每次上网拨号所取得的ip地址都不相同,所以id当然也要随之变化,一句话;ip不变id就不变,ip变了id就变化。
关于高id和低id,目前好多朋友也存在一个误区,认为同一个ip地址,只能而且最多只能拥有一个高id,其实这是不对的。一个公网ip地址,可以同时取得2个以上的高id,这一点我要在这里强调一下,比如,adsl用户,如果你本身是高id,那么你可以同时打开第二个emule两个同时运行,但是彼此的emule端口一定不要相同,这样你会发现两个都是高id,同一个ip地址。同样对于端口映射,同一个ip地址,也可以同时取得两个以上高id,同样端口不要相同。
对于低id用户,还存在一个误区,那就是认为只要映射了,就能变成高id,这一点我要说明一下,什么叫高id,它是一个9位以上的id数字,它代表了你的ip地址是公网独立的ip,也就是说只有前提你能够拥有公网独立的ip地址,你才能获得高id,端口映射的原理是把你的内网地址和端口,通过地址转换投影到公网干线上,使你作为一个公网节点,从而变成高id。那么这里就存在一个网络拓扑的问题,有些低id用户,不是处在公网干线的一级子网内,而是子网的下一级子网,甚至下好几级子网,拓扑的结构是层层拓扑,那么这部分用户,无论如何也无法获得高id,因为你做了映射只不过是成了上一级子网的节点,但是仍然还是内网,只不过映射了一层,你上面还有好几层,所以要正确看待映射的问题。目前,国内除了电信和网通,有好多二级运营商玩的就是这个路子,他们或者层层拓扑,或者只保留部分公网ip地址,作为机动分配,这样你运气好一拨号能得到一个公网ip,你运气不好就是内网,没有办法。
3)kad问题
好多朋友对这个东西始终不太明白,我说一下,kad和我们目前的ed2k不一样,我们目前的ed2k要通过服务器进行中转,我们都要连到服务上才能进行传输,而kad则是无服务器工作模式,它的传输可以独立进行,完全不需要服务器参与,我们只需要打开kad就可以不再需要服务器了,所以说kad是属于试验阶段,应该说他的前景最为光明,应该是p2p的未来,所以建议朋友们多多打开,对于找源很有帮助,特别是对于低id而言,vkad就是vnn+kad的模式。
4)服务器问题
这个问题论坛已经说了很多了,我主要说一些大家容易误会的地方,好多朋友经常问到,怎么我的服务器少了,或者是消失了,或者开机提示列表文件丢失,这里大家要注意在emule>选项>服务器设置里面 启用智能lowid检测这一项最好不要选 启动自动更新服务器列表也不要选 把连接到其它服务器时自动更新选上,这样你可以在服务器切换的时候,自动更新服务器列表 而不用添加什么列表的url网址之类的东西,另外对于常用的服务器,最好把他的状态选择为静态服务器,这样他就不会消失了,其实我们服务器列表有300多个服务器,能够用上的就那么几个,大家可以把他们设置成高级,静态,另外还要说一点,选择服务器的时候选择ping值小的 人数多的 文件多的 这个文件数什么意思,是连接到这个服务器的所有用户的共享文件总数,要注意服务器上没有任何文件,另外大家注意一下服务器列表里面,每个服务器还有:软性文件限制 硬性文件限制, 这个是什么意思?他代表了服务器接受你的共享文件 任务列表文件的大小限制,如果你要是超过了这个限制,就会被服务器拒绝,举个例子,如果这个值显示的是1k,那么你的共享文件数最好少于1000个,目前来看大部分都是1k。
其实对于服务器端,有好多愿意研究的朋友,很感兴趣。其实他就是edonkey的服务器,二者目前列表都一样,所以大家想要自己架设em服务器,可以上edonkey网站,下载服务器端的程序,我看了一下这个程序不大,而且也很简单,有兴趣的朋友们可以自己分析一下。
5)web服务器问题
大家都看了在emule>服务器>我的信息 最下面总是有一个web服务器的东西,这个是什么?我说一下 通常情况下我们这个禁用是正常的,Web服务器的作用是提供了远程访问eMule的功能,我们可以先在emule端配置一些相关参数,然后可以实现远程利用ie来对emule进行控制,当然了需要我们emule端要有独立的访问地址,远程控制emule可以实现emule的大部分功能,但是不是全部功能,还是有一些限制。另外对于emule端的web设置,懂行的朋友还可以自己进行编程,很有交互性,一般来讲,我们什么时候能够用上它呢?比如我们在公司开了emule,但是还想下班后继续在家里操作公司的emule,那么我们就可以使用这个功能,如此还有许多场合和环境特别利于web功能的使用,但是要注意随之带来的有关网络安全性问题也很重要。对于这个功能的使用,要是详细写出来的话,要很长需要专门的一个主题说明,由于篇幅限制,我在这里先简单说一下,如果朋友们都比较感兴趣,我考虑单独写一个主题详细说明具体设置和用法。不再赘述。
6)emule日志问题
其实这个问题没什么好说的,日志就是记载了emule的运行记录,我要强调的是好多朋友不懂得利用它,其实大部分emule遇到问题的时候,我们如果仔细注意日志记录,都会自己找到问题原因所在,如果你不懂你可以把它复制下来,发到网上,希望各位朋友以后多多注意emule的日志记录,遇到问题,多半能都自己解决。
7)任务下载问题
对于这个问题,我想说得是大家要学会使用给任务分优先级来控制下载顺序,经常有许多朋友抱怨,为什么任务结束一个,开始下一个的时候是随机开始,怎么能实现自动控制?这里我们就可以手动设置任务列表里面任务的优先级,右键就可以看到,把不同任务的优先级设置成高 中 低 这样emule在完成一个的时候自然按照优先级去选择下一个该是谁,而不会随机开始了,另外在选项里面也可以设置一下,新建任务为停止模式,或者自动开始下一个停止文件。
8)搜索问题
其实要是大家都学会了利用该功能,就会找到好多意想不到的东西,好多朋友平时很少用这个功能,其实p2p引以为自豪的就是他的搜索功能,建议大家以后多多自己搜索,搜索的时候要注意,每页都有200条的限制,所以要想看更多的可以点击旁边的"更多”,这样可以显示下一个200条,可不要以为就只有第一页的200条记录啊!对于搜索颜色问题我说明一下:
红色:代表你的任务列表里面已经有的文件 或者 你已经下载完成正在共享的文件
蓝色:普及程度较高源比较多的文件
黑色:你从来都没有下载过的文件
9)共享文件问题
这个我说明一个问题,emule 里面规定共享的单个文件,注意是"单个”文件不可以超过4g,如果超过了,则不可以进行hash,所以大家注意一下。
10)emule消息问题
经常有朋友会受到You Was Banned!!! Banreason: You use a Leecher Mod
或者Defcon Old Leecherdetection之类的消息,这是什么意思?
有些朋友以为是有人要聊天,发送过来的消息,其实误会了,这是自动发送的信息,它的意思是你用的版本是吸血的版本。你已经被ban。对于这个消息,大家可以不用理会,用emule消息过滤,把它过滤掉就可以了,为什么会如此呢?这个要是说起来也话长了,颇有点传奇色彩。我简单说说,部分mod版本呢,由于加分设置不同,逐渐分成不同的派别,这样逐渐形成了一些小圈子,后来搞出来一个所谓吸血的东西,只下载不上传,或是该版本群体上传远远小于下载,等等这里面有好多渊源,后来官方公开封禁了一些,再后来自然被封的不服,然后就是妖魔和反妖魔大家互相封禁,互相职责,后来斗争扩大化,导致其他版本也跟着遭殃,我们就是属于被误伤的,现在这种争斗仍然在继续,而且波及越来越广,这就是我对这个消息的原因的简单解释,好多内幕的东西,说起来挺多,不多说了。
11)代理问题
这里我要说明一点,好多朋友使用代理运行emule,比如一些公司内网的朋友,你们在寻找代理的时候,尽量使用sock5的代理,当然sock4和http也可以,但是要注意好多http代理本身不支持udp协议,所以导致了emule无法运行,大家要注意,选择支持udp协议的代理。而且多找几个,留作备用。
12)统计信息问题
这个问题,我要说两点
(1)上传:下载比例问题 之前好多朋友对这个有很多误会,这里我要说明这个比例大于1说明你的贡献大于索取,等于1,说明你的贡献和索取一致。小于1,则说明了你是一个索取的人,对p2p的贡献为负。大家一定要注意谁比谁,哪个是分母,哪个是分子,那么这有什么用呢?要注意p2p是一个讲究奉献,讲究积分的东西,你的上传多,你的下载快,这个比例也说明了使用者素质问题,另外对于这个比例,我们也有一些奖惩措施,比如 上传:下载大于2,也就是说明了你的上传量是下载量的2倍,这个时候你在排队的时候,就可以享受优先排队待遇,这个比值越大越好,不存在什么限制,越大说明你的上传量越多,说明你的积分越多,你的贡献越多,当然你排队的时间就越少。如果这个比值小于1,而且越来越小,那么同样你的速度也会越来越慢,这个你怨不了谁。
(2)速度大小的问题 好多朋友往往只关注了那个最大速度,但是实际上那个数值没有什么意义,他只是一个曲线峰值,往往一闪即逝,或者最多持续几秒,我们要关注的是我们的平均速度,这个二元值包含了时间的因素,所以他才能说明我们emule的整体速度大小。
13)积分问题
积分不是你对所有人的积分,只是在你机器下载的人他们的EM对你的积分,比如你开放的带宽大,小A在你那里下的很舒服,你就在小A那里的分数高。同样,小A那里也有一群人在下他的资料其中也有你,由于你开放的带宽多小A在你那里下的多,你在小A那里的积分就高,你就比其他在小A那里下载东西的人有优先下载小A资料的权限(小A可以设置高、普通这些的,设置高的时候就只有积分高的人优先下了)。
自己是无法看自己的积分的,因为这个积分不是永恒的,只是暂时针对一个文件的。
14)好友通道问题
我说明一点,加为好友开通通道,起到的作用只是,可以缩短你的排队时间,使你的信用积分突然变大,此外没有任何作用,他和速度没有本质的联系。
15)tag问题
好多朋友到现在也不明白为什么要有个[chn]有个[VeryCD],这个有什么用,其实这个名称是任意的,甚至重名都没有问题,因为p2p世界里面判断你的标志是userhash,而不是用户名,用户名你随便改,一天一个新名字也不会影响你的积分,tag的作用是为了让一些服务器判断,从而可以连接该服务器,有的服务器就是规定了如果你不加[*****]就是不让你连接,所以就加上他连接方便点,另外有的mod可以实现对有相关[****]进行加分,比如我们vc版本对有[chn]的朋友就有固定的加分设置,它可以使所有有这个[chn]的朋友积分比没有这个的人多,从而达到中国人优先下载优先上传的问题,当然了这个问题,现在在世界范围内,仍是一个争论的话题,到底是否应该加分,大家也是众说纷纭。其实,懂行的朋友可以自己设置加分,可以随心所欲给任何[*****]加分减分,也可以给任意userhash加分减分,以达到优先上传优先下载的目的,甚至可以达到任意ban人的目的。当然了,这个问题不合适公开讨论,有违背p2p的根本,这里点到为止。
16)对于如何隐藏emule头像的问题
对于一些在公司工作的朋友,这一直是一个困扰很久的问题,如何还能下载,还不让老板发现。这里我说两个解决方案
(1)使用第三方软件解决 可以使用SysTrayX软件,这个软件,国内大型软件站都有下载,它是一个管理系统托盘的软件,非常简单,具体使用方法,大家一看就明白了,他可以做到隐藏emule头像的问题,
(2)使用系统服务解决 我们知道在2000以上系统中都有srvany服务,借助这个服务,也可以实现隐藏头像 不借助第三方软件 同样server系统可以用终端服务来实现隐藏头像,另外还可以借助instsrv服务来实现隐藏头像,原理和前面一样,其实就是一个东西,这种方法原理,常见于一些黑客网站,其实有些木马软件,或者后台软件,就是用的这个方案。大家有兴趣可以上一些黑客网站研究研究。
17)关于emule和bt的相关问题
好多朋友都在使用bt的同时,也在使用emule,我这里说一点,对于bt文件,如果我们下到了一半,没有种了,或者非常慢,我们可以把它导入emule下载,用dmTorrent2Par和Jcd2Met或者 Edonkeydoctor或者MetFileRegenerator,都可以实现该功能,很简单,另外emule的文件同样也可以导入bt进行下载,二者可以相互转换。为什么要说这一点呢,是要提醒大家,其实有好多emule的辅助工具,都可以帮我们更好的使用emule,它不是孤立的,只不过国内兴起的比较晚,目前来看,只要edonkey能用的相关软件,emule都能使用。比如,关于重建met的edonkeydoctor软件,就可以使一些下载了很多的错误文件,直接进行修复而不是像以前那样把辛苦下到的删掉。是我们遇到问题需要关闭的时候,不用再担心要删除文件了
⑶ 如何设置代理IP 什么是DNS服务器地址
代理服务器的设置方法
http://www.xdl8.home.sunbo.net/
--------------------------------------------------------------------------------
ADSL代理服务器的设置方法
1、在桌面上用鼠标右键单击‘Internet Explorer’图标,并选择‘属性’。
2、单击‘连接’标签。
3、选中使用的连接,如:‘我的连接’,单击‘设置’按钮。
4、单击‘鼠标左键’,选择‘使用代理服务器’的选项,单击‘确定’按钮。
5、单击‘确定’按钮。
LAN局域网用户代理服务器设置方法
1、在桌面上用鼠标右键单击‘Internet Explorer图标’,并选择‘属性’。
2、单击‘连接’标签。
3、单击‘局域网设置’按钮。
4、单击‘鼠标左键’,去掉‘使用代理服务器’的选项,单击‘确定’按钮。
5、单击‘确定’按钮。
Modem拨号代理服务器设置方法
Internet Exploer 4.01
IE4.01:菜单栏“查看”->下拉菜单“Internet选项”->选项卡“连接”->在“代理服务器”一栏选中“通过代理服务器访问Internet”,输入代理服务器地址和端口号。->确定
Internet Exploer 5.0以上版本
IE 5.0:菜单栏“工具”->下拉菜单“Internet选项”->选项卡“连接”->在“拨号设置”中选中您目前使用的连接,然后点击右侧的“设置”->在中间的“代理服务器”栏选中“使用代理服务器”->在“地址”和“端口”栏输入代理服务器->确定->确定。
微软IE设置代理
(一)菜单选择“工具”,选“Internet选项(O)”。
(二)选“连接”,单击“设置(S)...”
(三)在“代理服务器”组,把“对此连接使用代理服务器”打钩,然后填上HTTP的地址和端口。
(四)如果有更齐全的代理数据,如SOCK及FTP等,可单击“高级(C)...”,分别填入对应的代理数据。(这项一般不填)
(五)单击“确定”就可以了。
腾讯TT设置代理
(一)主菜单选择“工具”,选“WWW代理”,选“代理设置...”
(二)点击“新增”,然后在“地址”那填上代理的IP以及端口,单击“确定”,代理就可以生效。
(三)当使用代理的时候,菜单上代理名称前面有“钩”,当向要取消代理或者再次使用代理,点击菜单就行,很方便。
QQ设置代理
● QQ设置SOCK5代理
(一)打开参数设置。
点击QQ的“QQ2000”,选择“系统菜单”。
(二)输入代理参数。
选择“网络参数”,在腾讯的服务器地址填上绝对IP(“***.***.***.***形式的”),下面有腾讯服务器域名转换绝对IP的表,随便选择一个就行。“使用SOCK5代理服务器”打钩,填上代理服务器的地址和端口参数。把用户名和密码输入框清空(假如是使用有密码的代理,则填上代理的用户名和密码)。
sz.tencent.com => 61.144.238.145
sz2.tencent.com => 61.144.238.146
sz3.tencent.com => 202.104.129.251
sz4.tencent.com => 202.104.129.254
sz5.tencent.com => 61.141.194.203
sz6.tencent.com => 202.104.129.252
sz7.tencent.com => 202.104.129.253
(三)测试代理参数。
点击测试。假如出现“代理服务器正常”,则这个代理是可用的。假如出现“无法连接代理服务器”,则说明这个代理不能使用,重新输入另外的代理参数,重新测试。
(四)使代理生效。
要使刚刚输入的参数生效,必须下线一次,再上线,这样才能改变QQ的传输状态,使代理生效。如果不能上线,请多换几个代理试试。
● QQ设置HTTP代理
(一)打开参数设置。
点击QQ的“QQ2000”,选择“系统菜单”。
(二)设置代理参数
选择“会员功能”,把“使用HTTP协议登陆”打钩,选择“通过HTTP代理”,填入HTTP代理的IP以及端口参数,清空用户名称和密码。
(三)测试代理参数。
按“测试”,测试该HTTP代理能不能用,出现“测试成功,请返回”,则该代理能用。否则表示该代理不能用,换别的代理。
(四)使代理生效。
要使刚刚输入的参数生效,必须下线一次,再上线,这样才能改变QQ的传输状态,使代理生效。如果不能上线,请多换几个代理试试。
ICQ设置代理
使用的是ICQ2000中文版。ICQ能使用的代理比较多,可以用HTTP、SOCK4、SOCK5等。在ICQ中,代理也称作防火墙。
(一)打开参数设置。
点击“主菜单”,选择“参数选择”。
(二)输入代理参数。
选“连接”,在“代理设置”,选择“使用防火墙”和“使用代理服务器”,在“代理服务器”选择代理的类型,可以是SOCK4、SOCK5、HTTP等,但一定要和你准备的代理的类型是一 致的。
在“防火墙”组,选择代理的类型,和输入代理的IP及端口的参数
(四)使代理生效。
跟QQ一样,要使得代理生效,必须先下线再上线,假如不能上线就是代理不行,换一个代理重新设置。
UC设置代理
(一)打开参数设置。
点击“UC”,选择“系统参数”。
(二)输入代理参数。
选择“网络”,选“局域网”,“使用SOCK5代理”打钩,填上代理IP和端口的参数,清空用户名和密码。(假如是使用有密码的代理,则填上代理的用户名和密码)。
(三)测试代理参数。
点击测试。假如出现“代理服务器正常”,则这个代理是可用的。假如出现“无法连接代理服务器”,则说明这个代理不能使用,重新输入另外的代理参数,重新测试 。
(四)使代理生效。
要使刚刚输入的参数生效,必须下线一次,再上线,这样才能改变UC的传输状态,使代理生效。如果不能上线,请多换几个代理试试。
MSN设置代理
(一)打开参数设置。
点击“MSN”,选择“选项(O)...”。
(二)输入代理参数。
“我使用的代理服务器”打钩,选“SOCK5”,填上代理IP和端口的参数,清空用户名和密码。(假如是使用有密码的代理,则填上代理的用户名和密码)。 当然还可以选择HTTP或SOCK4代理,填上相应的参数就行。
(四)使代理生效。
按“确定”就行了。
2003版QQ设置代理
2003版QQ,普通用户除了可以使用SOCK5代理之外,还可以使用HTTP代理,会员用户可以使用VIP的HTTP代理。
(一)打开参数设置
点击QQ的“QQ2003”,选择“系统菜单”。
(二)设置代理参数
选择“网络设置”。上网类型要设置为“局域网”。如果使用SOCK5代理的就把“SOCK5代理设置”打钩,填入代理服务器的IP和端口的参数。假如使用HTTP代理的就选“HTTP代理设置”,填入参数 。用户名称和密码一般留空,不用填。
(三)测试代理参数。
按“测试”,试试该代理能否成功连接。假如出现“不能连接代理服务器”的就换别的代理试试。
(四)使代理生效。
要使刚刚输入的参数生效,必须下线一次,再上线,这样才能改变QQ的传输状态,使代理生效。如果不能上线,请多换几个代理试试。
FTP软件中如何使用代理上传
在FTP软件中我们可以使用SOCKS4/SOCKS5代理服务器,常见的FTP工具中的代理设置方法如下:
1.FlashFXP3.0以前版本中设置代理:菜单栏“选项”——》参数设置——》代理和防火墙,然后在“代理服务器”项中选择代理类型,填写代理
2.FlashFXP3.0以后版本中设置代理:菜单栏“选项”——》参数设置——》连接,然后在“代理服务器”项中选择代理类型,填写代理
3.CuteFTP XP 5.0.2 中文版中设置代理:菜单栏“编辑”——》设置——》连接——》SOCKS--》选择代理类型,如SOCKS4或者SOCKS5,并填写代理
4.LeapFtp中设置代理:菜单栏“选项”——》参数设置——》常规——》代理,将“使用代理”前面的方框钩上,然后填写代理,并将SOCKS防火墙钩上。
MyIE2中设置代理服务器
MyIE2中设置代理服务器:菜单栏“选项”——》“代理服务器”——》“代理设置”——》在输入框中输入标准格式的代理服务器,如XXX.XXX.XXX.XXX:端口,然后“确定”并退出,继续,菜单栏“选项”——》“代理服务器”——》然后选择刚才输入的代理服务器,最后“确定”即可。
NETSCAPE 4.x的代理设置方法
选择主菜单上的“Edit”→“Preferences”→“advanced”→“proxies”→“Manual proxy configuration”→“View”,将你找到的代理服务器地址和端口填入,按“OK”完成。
.
Opera的代理设置方法
选择主菜单上的“设置”→“Proxy选项”,将你找到的代理服务器地址和端口填入即可。
网络蚂蚁的代理设置方法
在主菜单上选择“选项设置”→“参数设置”→“代理”→“添加”,然后将可用的代理服务器地址根据类型填入,如该服务器需要输入用户名和密码,选中代理服务器选项下的“认证”,填入即可。大多数下载软件的代理设置与网络蚂蚁相似,如FlashGet。
DNS服务器
到现在为止我们通过DHCP给客户端配置的DNS服务器仍然是直接用电信公司给的DNS,一般来说这已经可以了。但有如下两种情况可以让我们有足够的理由设置一个自己的DNS服务器:
l 想给内部网的服务器做本地的名称解析,方便访问内部服务器;
l 和我一样不幸在使用电信公司提供给的几个不太稳定的DNS服务器,并且维护着一个比较大的网络(终端遍布在N区N县),总不能在某个DNS宕掉后通知各用户挨个修改吧?(不要试图在Windows里设置多个DNS来解决这个问题,你试试就知道了)所以有必要设置一个可以转发DNS查询请求的本地DNS,这样对内部用户来说,只要设置好DNS指向内部DNS地址就可以了,剩下的事情由管理员根据情况修改这个本地DNS把解析请求转发到最佳的公网DNS上。
在众多 Internet 服务器当中DNS服务是所有服务的基础,它最主要的职责之一是完成从主机域名到IP地址的映射关系的查询。DNS系统管理域名采用一个树状结构,DNS树的最上面是一个无名的root域,用“.”来表示。这个域只用来定位,并不包含任何信息,它由NIC来管理控制。Root下是分层的domain组成树状结构,一个DNS域(domain)是DNS树状结构中的一个分枝,domain中包含很多被授权管理的区域(zone),它是每个授权单位所管理的主机和IP地址的集合,我们平时说的域,实际上就是zone。比如,把www.silly.com这个URL地址拆解开:
.com domain
.silly.com zone
www 则是.silly.com区域内的一台具体的主机
Linux上最常用的DNS服务器软件是BIND(Berkeley Internet Name Domain),BIND在不断的更新和完善,在http://www.isc.org/procts/BIND/上可以获得它的最新源代码和文档。Red Hat Linux 7.3自带的是bind9.2。
§§ 安装bind软件包
首先来安装bind软件包
[root@rh73 /mnt/cdrom/RedHat/RPMS]# rpm -ivh bind-9.2.0-8.i386.rpm
Preparing... ########################################### [100%]
1:bind ########################################### [100%]
§§ 了解bind的配置文件/etc/named.conf
为了将来维护的方便,我打算把内部的某些主机做本地的名称解析,假定本地域为silly.com,我要把ns和firewall两个主机名都指向接入服务器的地址192.168.100.254:
ns.silly.com 192.168.100.254
firewall.silly.com 192.168.100.254
Linux上的DNS软件包是bind,但服务进程的名字为named,首先来看一下/etc/named.conf,该文件是bind最主要的配置文件,这里定义了域名服务器的类型,以及相应的数据库文件所在目录等内容。
该文件开始是options设定部分:
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
其中directory设定指出了named的数据资源文件存放在/var/named目录下面。也就是说,named进程会在这个目录里查找相关文件获得DNS数据,然后在后面设置数据文件时,可以直接放在这个目录里,不需要再使用绝对路径。
接下来的一段文字是说如果你的DNS服务器是bind 8.1之前的版本,并且和客户端之间如果隔着防火墙的话,要将// query-source address * port 53;前面的//拿掉(去掉注释)。我们使用的是9.2版的软件,所以不需要更改这个设置。
//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
controls和文件最后的include "/etc/rndc.key";是bind 9.x版本的新功能,是有关DNS更新以及更新时加密处理的,暂时我们用不到,先不管它。
zone "." IN {
type hint;
file "named.ca";
};
这部分设置定义了DNS系统中的root区域“.”(root zone),其类型为hint。本地DNS无法解析到的非本地区域的内容,都会根据named.ca的里设定到root区域负责查询。
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
这两段定义了本机名称的DNS解析,第一个zone是localhost的解析,其类型为master,数据文件是/var/named/localhost.zone。第二个zone是本机区域的反向解析,即根据IP地址反查域名的数据。
include "/etc/rndc.key";
下面看看localhost.zone的内容:
[root@rh73 /var/named]# cat localhost.zone
$TTL 86400
$ORIGIN localhost.
@ 1D IN SOA @ root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
1D IN NS @
1D IN A 127.0.0.1
第一行是TTL(Time To Live)设定,以秒为单位,这里定义为86400秒,也就是一天。每一个DNS服务器都有缓存非本地域名信息的功能,TTL指出了解析结果在缓存中保留的时间。平时你可能注意到了,第一次访问某个站点可能需要较长的时间才能打开,接下来再访问时就快一点,这就是DNS缓存功能的作用,它减少了第二次解析域名到IP地址的时间。
第二行是ORIGIN,指出下面的主机记录属于哪个域。在下面的@是它的替代符号。
第三行开始的@是ORIGIN的替代符,这里是指localhost。接下来的1D(1day,一天,也可以写成秒为单位的数字,如86400)是TTL值,可以不指定,如果没有指定,则参考前面设定的TTL值,如果前面也没定义,则参考后面要介绍的minium tll的值。你可以单独为每一个记录设定TTL,只要将要设定的值放在“IN”之前就可以了。
IN后面的SOA(Start Of Authority)是指这一行记录的类型,表示当前区域的授权记录开始。每一个数据文件只能有一个SOA,不能重复,并且必须是所负责zone中的第一个记录。
SOA后面指定了这个区域的授权主机和管理者信箱,这里分别是@(localhost.)和root@localhost。root如果写全了应该是root.localhost,这里用“.”代替“@”。SOA的授权主机名称必须在DNS系统中有一个A记录。
接下来的 SOA 设定是被括在"( )"之间的 5 组数字,主要作为和 slave 服务器同步 DNS 数据所使用的数据而设定的:
Serial:其格式通常是“年月日+修改次数”。当 slave 要进行数据同步的时候,会比较这个数值。如果发现在这里的数值比它那边的数值“大”,就进行更新,否则忽略。serial不能超过 10 位数字。
Refresh:这里是是告诉 slave 隔多久进行一次数据同步(是否同步要看 Serial 的比较结果)。
Retry:slave 在进行更新失败后,要隔多久再进行重试。
Expire:这是记录逾期时间;当 slave 一直未能成功与 master 取得联络,那到这里就放弃retry,同时这里的数据也将标识为过期(expired)。
Minimum:这是最小预设 TTL 值,如果在前面没有用“$TTL”来定义,就会以此值为准。
以上的数字都是以秒为单位,也可以用 H(小时)、D(天)、W(星期)来做单位,如:3H 和 259200 是一样的。无论用什么单位来设定,都要遵守下面的规则:
expire >= refresh + retry
expire >= 10 * retry
请注意:SOA 记录中这对“()”符号中的左括号“(”一定要和 SOA 写在同一行!
最后两行表示负责localhost.这个记录的Name Server(NS)是localhost这台主机,localhost的IP地址(Address)是127.0.0.1。
named.local在/etc/named.conf里定为“0.0.0.127.in-addr.arpa”zone的反向解析数据文件,其内容如下:
[root@rh73 /var/named]# cat named.local
$TTL 86400
@ IN SOA localhost. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS localhost.
1 IN PTR localhost.
来看最后一行“1 IN PTR localhost.”,这个记录类型是PTR(Pointer),通常用在反向解析时,将IP指向主机名称(和A记录正好相反)。前面的设置中,我们知道127.0.0.1对应的主机名称是localhost,反向查询时,IP地址应该倒过来写1.0.0.127.in-addr.arpa,由于这里的ORIGIN(@)是“0.0.127-in-addr.arpa.”,所以在写PTR记录时,只需要写1,后面会自动补上0.0.127-in-addr.arpa.
§§ 实现本地域主机的解析
了解了上面的内容,我们来看看如何做本地的域名解析。我们要做的工作是:
在/etc/named.conf里添加两个zone设置:
zone "silly.com" IN {
type master;
file "silly.zone";
allow-update { none; };
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "named.silly";
allow-update { none; };
};
设置/var/named/下的数据文件:
[root@rh73 /var/named]# cat silly.zone
$TTL 86400
$ORIGIN silly.com.
@ IN SOA ns.silly.com. root.silly.com. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.silly.com.
ns IN A 192.168.100.254
firewall IN CNAME ns
CNAME记录用来定义一个主机域名的别名。当多个主机名指向同一个地址的时候,这个记录类型可以方便设置。
设置反向解析zone:
[root@rh73 /var/named]# cat named.silly
$TTL 86400
@ IN SOA ns.silly.com. root.silly.com. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.silly.com.
254 IN PTR ns.silly.com.
§§ 转发解析请求
为了提高我们这个DNS服务器的查询效率,我们会采取这样的措施:把非本地域的解析请求转发到我们的ISP提供的DNS。
这个功能是由forwarder选项来完成的。所谓的 forwarder,就是当某一台 NS 主机遇到非本机负责的 zone ( slave zone 也属于本机负责的范围) 查询请求的时候,将不直接向 root zone 查询而把请求转交给指定的 forwarder (一台或多台) 主机代为查询。如果你不了解 DNS 的查询模式,那么很难理解这个 forwarder 的意义和好处。
我们知道,当DNS服务器接到客户端主机的查询请求时,首先会检查这个查询是否属于本机管辖,否则将转向 root zone 再逐级的查询下去,最后再把查询结果告诉客户端。在这个过程之中,DNS服务器还会将查询到的结果存放到缓存中。只要缓存中的 TTL 没过期,在下次遇到同样查询的时候,就可以直接将结果响应给客户端,而无需再重复上次的查询流程。如果DNS服务器上指定了forwarder,那这个DNS发现缓存中没有记录时,将不向 root 查询,而是向 forwarder 送出同样的请求(转发),然后等待查询结果,即把逐级往下查询这个耗费精力的动作,交给 forwarder 负责。但无论这个结果是自己直接查询得来的,还是 forwarder 送回来的,DNS服务器都会保存一份数据在缓存中。这样,以后的相同查询就快多了,这对于DNS所服务的 客户端而言查询效率会提高很多。
forwarder 机制的好处并非仅是上面所提到的效率提升,对于整个网络流量(尤其是对外的流量)也是有帮助的。比方说,你的内部网络需要 10 台 DNS 来提供服务,你只需在某一台能直接与外界沟通的计算机上架设 DNS 服务,然后将其它内部DNS的 forwarder 指向该服务器就行了。这样可能本来需要 10 次的 root 查询,在 forwarders 的机制下,就只需 1 次而已。连同下层的往返查询来计算的话,总体上所省下的对外查询就更多了,再加上缓存带来的好处,forwarder 所降低的 DNS 流量是非常显着的。
事实上,在本章开始我们就提到如何集中管理内部局域网用户域名解析问题,解决的方法就是:在本地DNS的 forwarder 设定为 ISP 的 DNS,局域网用户把DNS都设置成本地DNS地址,在进行外部域名解析时,我们的DNS把解析请求转发给ISP的DNS;又因为 ISP 上的 DNS 也有缓存的关系,所以这样设置查询还可以提高速度。
罗嗦了半天,现在看看如何配置。具体的设置很简单:在named.conf的options部分添加这样一行:
forwarders { 211.136.17.107; 202.102.152.3; };
如此设置完毕,那么所有非本区域的查询都会直接转发到forwarders指定的DNS服务器上去。
§§ 测试DNS
全部设置完后,把named进程重起一下,使设置生效:
[root@rh73 /var/named]# /etc/rc.d/init.d/named restart
现在测试一下刚才的设置是否正确:
设置Linux主机的DNS客户端
[root@rh73 ~]# vi /etc/resolv.conf
其实在系统安装设置网卡参数时我们已经设置了这个文件,其内容可能是:
nameserver 202.102.152.3
nameserver 202.102.134.68
现在把这两行内容去掉(或注释掉,在行首加“#”),然后写上:
nameserver 192.168.100.254
即使用我们刚才设定的192.168.100.254这个DNS服务器。
在Linux上我们可以用ping、nslookup、dig、host等命令来测试DNS是否工作正常,这些小工具都很简单,以host为例:
[root@rh73 ~]# host ns.silly.com
ns.silly.com has address 192.168.100.254
[root@rh73 ~]# host firewall.silly.com
firewall.silly.com is an alias for ns.silly.com.
ns.sill
⑷ OkHttp源码解析 (三)——代理和路由
初看OkHttp源码,由于对Address、Route、Proxy、ProxySelector、RouteSelector等理解不够,读源码非常吃力,看了几遍依然对于寻找复用连接、创建连接、连接服务器、连接代理服务器、创建隧道连接等逻辑似懂非懂,本篇决定梳理一遍相关的概念及基本原理。
● HTTP/1.1(HTTPS)
● HTTP/2
● SPDY
一个http请求的流程(直连):
1、输入url及参数;
2、如果是url是域名则解析ip地址,可能对应多个ip,如果没有指定端口,则用默认端口,http请求用80;
3、创建socket,根据ip和端口连接服务器(socket内部会完成3次TCP握手);
4、socket成功连接后,发送http报文数据。
一个https请求的流程(直连):
1、输入url及参数;
2、如果是url是域名则解析ip地址,可能对应多个ip,如果没有指定端口,则用默认端口,https请求用443;
3、创建socket,根据ip和端口连接服务器(socket内部会完成3次TCP握手);
4、socket成功连接后进行TLS握手,可通过java标准款提供的SSLSocket完成;
5、握手成功后,发送https报文数据。
1、分类
● HTTP代理:普通代理、隧道代理
● SOCKS代理:SOCKS4、SOCKS5
2、HTTP代理分类及说明
普通代理
HTTP/1.1 协议的第一部分。其代理过程为:
● client 请求 proxy
● proxy 解析请求获取 origin server 地址
● proxy 向 origin server 转发请求
● proxy 接收 origin server 的响应
● proxy 向 client 转发响应
其中proxy获取目的服务器地址的标准方法是解析 request line 里的 request-URL。因为proxy需要解析报文,因此普通代理无法适用于https,因为报文都是加密的。
隧道代理
通过 Web 代理服务器用隧道方式传输基于 TCP 的协议。
请求包括两个阶段,一是连接(隧道)建立阶段,二是数据通信(请求响应)阶段,数据通信是基于 TCP packet ,代理服务器不会对请求及响应的报文作任何的处理,都是原封不动的转发,因此可以代理 HTTPS请求和响应。
代理过程为:
● client 向 proxy 发送 CONNET 请求(包含了 origin server 的地址)
● proxy 与 origin server 建立 TCP 连接
● proxy 向 client 发送响应
● client 向 proxy 发送请求,proxy 原封不动向 origin server 转发请求,请求数据不做任何封装,为原生 TCP packet.
3、SOCKS代理分类及说明
● SOCKS4:只支持TCP协议(即传输控制协议)
● SOCKS5: 既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。
SOCK4能做到的SOCKS5都可得到,但反过来却不行,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据。
有了上面的基础知识,下面分析结合源码分析OkHttp路由相关的逻辑。OkHttp用Address来描述与目标服务器建立连接的配置信息,但请求输入的可能是域名,一个域名可能对于多个ip,真正建立连接是其中一个ip,另外,如果设置了代理,客户端是与代理服务器建立直接连接,而不是目标服务器,代理又可能是域名,可能对应多个ip。因此,这里用Route来描述最终选择的路由,即客户端与哪个ip建立连接,是代理还是直连。下面对比下Address及Route的属性,及路由选择器RouteSelector。
描述与目标服务器建立连接所需要的配置信息,包括目标主机名、端口、dns,SocketFactory,如果是https请求,包括TLS相关的SSLSocketFactory 、HostnameVerifier 、CertificatePinner,代理服务器信息Proxy 、ProxySelector 。
Route提供了真正连接服务器所需要的动态信息,明确需要连接的服务器IP地址及代理服务器,一个Address可能会有很多个路由Route供选择(一个DNS对应对个IP)。
Address和Route都是数据对象,没有提供操作方法,OkHttp另外定义了RouteSelector来完成选择的路由的操作。
1、读取代理配置信息:resetNextProxy()
读取代理配置:
● 如果有指定代理(不读取系统配置,在OkHttpClient实例中指定),则只用1个该指定代理;
● 如果没有指定,则读取系统配置的,可能有多个。
2、获取需要尝试的socket地址(目标服务器或者代理服务器):resetNextInetSocketAddress()
结合Address的host和代理,解析要尝试的套接字地址(ip+端口)列表:
● 直连或者SOCK代理, 则用目标服务器的主机名和端口,如果是HTTP代理,则用代理服务器的主机名和端口;
● 如果是SOCK代理,根据目标服务器主机名和端口号创建未解析的套接字地址,列表只有1个地址;
● 如果是直连或HTTP代理,先DNS解析,得到InetAddress列表(没有端口),再创建InetSocketAddress列表(带上端口),InetSocketAddress与InetAddress的区别是前者带端口信息。
3、获取路由列表:next()
选择路由的流程解析:
● 遍历每个代理对象,可能多个,直连的代理对象为Proxy.DIRECT(实际是没有中间代理的);
● 对每个代理获取套接字地址列表;
● 遍历地址列表,创建Route,判断Route如果在路由黑名单中,则添加到失败路由列表,不在黑名单中则添加到待返回的Route列表;
● 如果最后待返回的Route列表为空,即可能所有路由都在黑名单中,实在没有新路由了,则将失败的路由集合返回;
● 传入Route列表创建Selection对象,对象比较简单,就是一个目标路由集合,及读取方法。
为了避免不必要的尝试,OkHttp会把连接失败的路由加入到黑名单中,由RouteDatabase管理,该类比较简单,就是一个失败路由集合。
1、创建Address
Address的创建在RetryAndFollowUpInteceptor里,每次请求会声明一个新的Address及StreamAllocation对象,而StreamAllocation使用Address创建RouteSelector对象,在连接时RouteSelector确定请求的路由。
每个Requst都会构造一个Address对象,构造好了Address对象只是有了与服务器连接的配置信息,但没有确定最终服务器的ip,也没有确定连接的路由。
2、创建RouteSelector
在StreamAllocation声明的同时会声明路由选择器RouteSelector,为一次请求寻找路由。
3、选择可用的路由Route
下面在测试过程跟踪实例对象来理解,分别测试直连和HTTP代理HTTP2请求路由的选择过程:
● 直连请求流程
● HTTP代理HTTPS流程
请求url: https://www.jianshu.com/p/63ba15d8877a
1、构造address对象
2、读取代理配置:resetNextProxy
3、解析目标服务器套接字地址:resetNextInetSocketAddress
4、选择Route创建RealConnection
5、确定协议
测试方法:
● 在PC端打开Charles,设置端口,如何设置代理,网上有教程,比较简单;
● 手机打开WIFI,选择连接的WIFI修改网络,在高级选项中设置中指定了代理服务器,ip为PC的ip,端口是Charles刚设置的端口;
● OkHttpClient不指定代理,发起请求。
1、构造address对象
2、读取代理配置:resetNextProxy
3、解析目标服务器套接字地址:resetNextInetSocketAddress
4、选择Route创建RealConnection
5、创建隧道
由于是代理https请求,需要用到隧道代理。
从图可以看出,建立隧道其实是发送CONNECT请求,header包括字段Proxy-Connection,目标主机名,请求内容类似:
6、确定协议,SSL握手
1、代理可分为HTTP代理和SOCK代理;
2、HTTP代理又分为普通代理和隧道代理;普通代理适合明文传输,即http请求;隧道代理仅转发TCP包,适合加密传输,即https/http2;
3、SOCK代理又分为SOCK4和SOCK5,区别是后者支持UDP传输,适合代理聊天工具如QQ;
4、没有设置代理(OkHttpClient没有指定同时系统也没有设置),客户端直接与目标服务器建立TCP连接;
5、设置了代理,代理http请求时,客户端与代理服务器建立TCP连接,如果代理服务器是域名,则解释代理服务器域名,而目标服务器的域名由代理服务器解析;
6、设置了代理,代理https/http2请求时,客户端与代理服务器建立TCP连接,发送CONNECT请求与代理服务器建立隧道,并进行SSL握手,代理服务器不解析数据,仅转发TCP数据包。
如何正确使用 HTTP proxy
OkHttp3中的代理与路由
HTTP 代理原理及实现(一)