为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

P2P技术穿透防火墙及代码的简单实现.doc

2017-11-15 10页 doc 27KB 13阅读

用户头像

is_721103

暂无简介

举报
P2P技术穿透防火墙及代码的简单实现.docP2P技术穿透防火墙及代码的简单实现.doc P2P 技术穿透防火术及代术的术术术术 首先先介术一些基本念,概 NAT(Network Address Translators)~术地址术术,术地址术术是在网网IP地址日益缺乏的情况下术生的~的主要目的就是术了能术地址重用。它NAT分术大术~基本的两NAT和NAPT(Network Address/Port Translator)。 最术始NAT是行在路由器上的一功能模术。运个 最先提出的是基本的NAT~的术生基于如下事术,一私有术它个网 ;域,中的术点中只有少的术点需要外...
P2P技术穿透防火墙及代码的简单实现.doc
P2P技术穿透防火墙及代码的简单实现.doc P2P 技术穿透防火术及代术的术术术术 首先先介术一些基本念,概 NAT(Network Address Translators)~术地址术术,术地址术术是在网网IP地址日益缺乏的情况下术生的~的主要目的就是术了能术地址重用。它NAT分术大术~基本的两NAT和NAPT(Network Address/Port Translator)。 最术始NAT是行在路由器上的一功能模术。运个 最先提出的是基本的NAT~的术生基于如下事术,一私有术它个网 ;域,中的术点中只有少的术点需要外术接;呵呵~术是在上世术很与网90年代中期提出的,。那术术子中其术只有少的术点需要全球唯一的个网数IP地址~其他的术点的IP地址术术是可以重用的。 因此~基本的NAT术术的功能术术~在子使用一保留的很网内个IP子网段~术些IP术外是不可术的。子只有少一些网内数IP地址可以术术到正全球唯真一的 IP地址。如果术些术点需要术术外部术~那术基本网NAT就术术术术点的子术将个网内IP术化术一全球唯一的个IP然后术送出去。(基本的NAT改术会IP 包中的原IP地址~但是不改术会IP包中的端口) 术于基本的NAT可以看参RFC 1631 外一术另NAT叫做NAPT~名上我术也可以看得出~从称NAPT不但改术术术术会个NAT术术的IP据术的数IP地址~术改术会IP据术的 数TCP/UDP端口。基本NAT的术术可能我术术的不多;呵呵~我有术到术,~没NAPT才是我术正术术真的主角。看下术, Server S1 18.181.0.31:1235 | ^ Session 1 (A-S1) ^ | | 18.181.0.31:1235 | | v 155.99.25.11:62000 v | | NAT 155.99.25.11 | ^ Session 1 (A-S1) ^ | | 18.181.0.31:1235 | | v 10.0.0.1:1234 v | | Client A 10.0.0.1:1234 有一私有术个网10.*.*.*~Client A是其中的一台术算机~术术的术;一个网网个NAT术术,的外网IP是155.99.25.11(术术术有一的个内网IP地址~比如10.0.0.10)。如果Client A中的某术程;术术程术建了一个个个UDP Socket,术个Socket术定1234端口,想术术外主机网18.181.0.31的1235端口~那术据包通术当数NAT术术生什术事情,会呢 首先NAT改术术据包的原会个数IP地址~改术155.99.25.11。接着NAT术术术术术建一术会个个Session;Session是一抽象的念~如果是个概TCP~也术 Session是由一个SYN包术始~以一个FIN包术束。而UDP~以术呢个IP的术端个 口的第一个UDP术始~术束~呵呵~也术是分术~也术是小术~术要看具的术呢几几体 术了,且术术并个Session分配一端口~比如个62000~然后改术术据包的源端口个数 术62000。所以本是;来10.0.0.1:1234->18.181.0.31:1235,的据包到了互术上数网 术术了;155.99.25.11:62000->18.181.0.31:1235,。 一旦NAT术建了一个Session后~NAT术住会62000端口术术的是 10.0.0.1的1234端口~以后从18.181.0.31术送到 62000端口的据被数会NAT自 术的术术到10.0.0.1上。;注意,术里是术18.181.0.31术送到62000端口的据被术数会 术~其他的 IP术送到术端口的据被个数将NAT抛,术术弃Client A就与Server S1建立以了一术接。个 呵呵~上面的基术知术可能多人都知道了~那术下面是术术的部分了很。 看看下面的情,况 Server S1 Server S2 18.181.0.31:1235 138.76.29.7:1235 | | | | +----------------------+----------------------+ | ^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^ | 18.181.0.31:1235 | | | 138.76.29.7:1235 | v 155.99.25.11:62000 v | v 155.99.25.11:62000 v | Cone NAT 155.99.25.11 | ^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^ | 18.181.0.31:1235 | | | 138.76.29.7:1235 | v 10.0.0.1:1234 v | v 10.0.0.1:1234 v | Client A 10.0.0.1:1234 接上面的例子~如果Client A的原那来个Socket(术定了1234端口的那个UDP Socket)又接着向外一另个Server S2术送了一个UDP包~那术术个UDP包在通术NAT术术术术,会怎呢 术术可能有术情术生~一术是会两况NAT再次术建一个Session~且再并 次术术个Session分配一端口;比如,个号62001,。外一术是 另NAT再次术建一个 Session~但是不新分配一端口~而是用原分配的端口会个号来号62000。前一术 NAT叫做Symmetric NAT~后一术叫做Cone NAT。我术期望我术的NAT是第二术~呵呵~如果的你NAT术好是 第一术~那术可能有多很会很P2P术件失。;可以术幸的是~术在术大多的灵数NAT 属即于后者~Cone NAT, 好了~我术看到~通术NAT,子的术算机向外术术是容易的网内很 ;NAT相于透明的~子的和外的术算机不用知道当网内网NAT的情,。况 但是如果外部的术算机想术术子的术算机就比术困术了;而术正是网内 P2P所需要的,。 那术我术如果想外部术送一据术术的术算机有什术术法,首从个数内网呢 先~我术必术在的内网NAT上打上一“洞”;也就是前面我术术的在个NAT上建立一 个Session,~术洞不能由外部打~只能由的主机打。而且术个来内网内来个 洞是有方向的~比如部某台主机;比如,从内192.168.0.10,向外部的某个IP(比如,219.237.60.1)术送一个UDP包~那术就在术的个内网NAT术术上打了一个方向术219.237.60.1的“洞”~;术就是术称UDP Hole Punching的技术,以后219.237.60.1就可以通术术洞的个与内网192.168.0.10术系了。;但是其他的IP不能利用术洞,。个 呵呵~术在术术到我术的正术P2P了。有了上面的理术~术术的两个内网主机通术就差最后一步了,那就是术生蛋术是蛋生术的术术了~术都无法主术术出术接术两 求~术也不知道术的公地址~那我术如何打术洞,我术需要一中术人术系网来个呢个来 术主机。两个内网 术在我术看看一来个P2P术件的~以下术术例, Server S ;219.237.60.1, | | +----------------------+----------------------+ | | NAT A (外网IP:202.187.45.3) NAT B (外网IP:187.34.1.56) | (内网IP:192.168.0.1) | (内网IP:192.168.0.1) | | Client A (192.168.0.20:4000) Client B (192.168.0.10:40000) 首先~Client A登术服术器~NAT A术术次的Session分配了一端口个60000~那术Server S收到的Client A的地址是202.187.45.3:60000~术就是Client A的外地址了。网同术~Client B登术Server S~NAT B术此次Session分配的端口是40000~那术Server S收到的B的地 址是187.34.1.56:40000。 此术~Client A与Client B都可以与Server S通信了。如果Client A此术想直接术送信息术Client B~那术他可以从Server S那术得儿B的公地址网 187.34.1.56:40000~是不是Client A向术地址术送信息个Client B就能收到了,是不行~因术如呢 果术术术送信息~NAT B术信息术;因术术术的信息是不术自的~术了会将个弃来数安全~大多术NAT都术行术术会弃作,。术在我术需要的是在NAT B上打一方向术个202.187.45.3;即Client A的外地址,的洞~网那术Client A术送到187.34.1.56:40000的信息,Client B就能收到了。术打洞个命令由术术~呵呵~术然是来呢当Server S。 术术一下术术程,如果个Client A想向Client B术送信息~那术Client A术送命令术Server S~术求Server S命令Client B向Client A方向打洞。呵呵~是不是术口~不术术系~想一想就很没很清楚了~何术有源代术;况呢没侯老术术术,在源代术面前有秘密 8,,~然后Client A就可以通术Client B的外地址网与Client B通信了。 注意,以上术程只适合于Cone NAT的情~如果是况Symmetric NAT~那术当Client B向Client A打洞的端口已术重新分配了~Client B无法知道术端口;如果将个 Symmetric NAT的端口是术序分配的~那术我术或术可以猜术术端口~可是由个号 于可能术致失术的因素太多~我术不推荐术术猜术端口的方法,。 一另篇文章接上, 下面解术一下上面的文章中有提及没或者术我术得比术欠缺的地方. 私有地址/端口和公有地址/端口:我术知道,术在大部分术网采用的都是NAPT(Network Address/Port Translator)了, 术术术的个个作用是一术外的术术在术术NAT之后IP地址和端口都被改号会写,在术里把一次术中会客术自己术术在使用的IP地址和端口号成术私有地址/端口,而把术术NAPT之后被改的写IP地址和端口号称术公有地址/端口.或者可以术术理解,私有地址/端口是你你昵称家里人术的而公有地址/端口术是正术外公术的名你真字.如何术得用术的私用地址/端口号,术术术了个很,而要得到公有地址/端口就要在术接上一台机器号另之后由那台机器看到的IP地址和端口号来示. 如果明白了上面的术西,下面术入我术的代术,在术里解术一下术术部分的术术: 客术端首先得到自己的私有地址/术端,然后向server端术送登术术求,server端在得到术术求个个之后就可以知道术client端的公有地址/术端,server术会每一登术的个client保存它术的私有地址/端口和公有地址/端口. OK,下面术始术术的打洞流程.假术client A要向client B术术,但是A不知道B的地址,使知道即根据NAT的原理术术术在第一次被个会拒术,因术client B的NAT术术术是一有术的外部术的术求个从没来.术术个候,A如果术术自己没有保存B的地址,或者术术送术B的术术求失术了会, 要求它会server端术B向A打一洞个,术个B->A的术意术在于使会它NAT B术术A的地址/端口是可以通术的地址/端口,术术A再向B术送术术的术候就不再被会NAT B拒术了.打一比方术明打洞的术程个来,A想来B家做客,但是遭到了B的管家NAT B的拒术,理由是:我有我从来没听家B 提术你的名字,术术A到了找A,B都术术的朋友server,要求server术B术一信个,术B去跟管家术A是我的朋友,于是,B跟管家NAT B 术,A是我术术的朋友,术术A的术术术求就不再会被管家NAT B所拒术了.术而言之,UDP打洞就是一通术个server保存下的地址来使得彼此之术能术直接通信的术程,server只管助帮建立术接,在建立术接之后就不再介入了. 下面是一模术个P2P聊天的术程的源代术~术程术术~很P2PServer行运在一术有公个网IP的术算机上~P2PClient行在不同的运两个NAT 后;注意~如果两个运个客术端行在一NAT后~本程序很运决你可能不能行正常~术取于的NAT是否支持loopback translation~术术~然~此术术可以通术方先术术术接术方的当双内网IP来决解~但是术代术只是术了术术原理~有术理术些术术,~后登术的术算机可以术得先登术术算个并没 机的用术名~后登术的术算机通术send username message的格式来你术送消息。如果术送成功~术明已取得了直接术方术接的与成功。 程序术在支持三命令个,send , getu , exit send格式,send username message 功能,术送信息术username getu格式,getu 功能,术得前服术器用术当列表 exit格式,exit 功能,注术服术器的术接;服术器不自术术术与会客术是否吊术, 代术很很懂短~相信容易~如果有什术术术~可以术我术术件zhouhuis22@sina.com 或者在CSDN上术送短消息。同术~术迎术术此文~但希望保留作者版术8-,。 _05/04052509317298.rar"   另一篇介术打洞技术的;术充, UDP打洞技术依术于由公共防火术和cone NAT~允术适当划的有术的端术端术用程序通术NAT"打洞"~使方的主机都术于即当双NAT之后。术术技术在 RFC3027的5.1术[NAT PROT] 中术行了重点介术~且在并Internet[KEGEL]中术行了非正式的描叙~术术用到了最新的一些术术~例如[TEREDO,ICE]术术中。不术~我术要注意的是~"术"如其名~UDP打洞技术的可靠性全都要依术于UDP。 术里将两来双划考术术典型术景~介术术接的方术用程序如何按照术的术行通信的~第一术术景~我术假术两个客术端都术于不同的NAT之后~第二术术景~我术假术两个客术端都术于同一个NAT之后~但是术它彼此都不知道(他术在同一个NAT中)。 术于不同NAT之后的客术端通信 我术假术 Client A 和 Client B 都术有自己的私有IP地址~且都术在不同的并NAT之后~端术端的程序运行于 CLIENT A,CLIENT B,S之术~且术都术并它放了UDP端口1234。 CLIENT A和CLIENT B首先分术与S建立通信术~术术会NAT A把它自己的UDP端口62000分配术CLIENT A与S的术~会NAT B也把自己的UDP端口31000分配术CLIENT B与S的术。会 假如术术个候 CLIENT A 想 与CLIENT B建立一条UDP通信直术~如果 CLIENT A只是术术的术送一个UDP信息到CLIENT B的公地址网 138.76.29.7:31000的术~NAT B不会将个弃加考术的术信息术术;除非NAT B是一个 full cone NAT,~因术 术个UDP信息中所包含的地址信息~与CLIENT B和服术器S建立术接术存术在NAT B中的服术器S的地址信息不符。同术的~CLIENT B如果做同术的事情~术送的UDP信息也被 会NAT A 术。弃 假如 CLIENT A 术始术送一 个UDP 信息到 CLIENT B 的公地址上~此网与同术~他又通术S中术术送了一个邀术信息术CLIENT B~术求CLIENT B也术CLIENT A术送一个UDP信息到 CLIENT A的公地址上。术术网CLIENT A向CLIENT B的公网IP(138.76.29.7:31000)术送的信息术致 NAT A 打术一术于 个CLIENT A的私有地址和CLIENT B的公地址网会与之术的新的通信术~此同术~NAT B 也打术了一术于个CLIENT B的私有地址和CLIENT A的公地址网 (155.99.25.11:62000)之术的新的通信术。一旦术新的会个UDP术会各自向术方打术了~CLIENT A和CLIENT B之术就可以直接通信~而无需S术术来搭术了。(术就是所术的打洞技术),
/
本文档为【P2P技术穿透防火墙及代码的简单实现.doc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索