P2P֮UDP͸NATԭʵ - ǿƪ޸ĹԴ룩


˵:

UDP͸NATǺٵģ<<P2P֮UDP͸NATԭʵ(shootingstars)>>ƪʵʵĲοֵ
˽ҲһֱP2PĿȽдԵǸ˿BitTorrent - FlashBT(̬쳵). дƪµҪ
ĿÿεشһЩѵ, һд, ʡԼʱ䣬Ҳ˶P2PUDP͸ȤĶ
⡣ԴȤ;ѿԸҷʼ.

ٴθлshootingstarsѵڹ. ʾл⡣

----------------------------------------------------------------------------------------------------------------------------

NAT(The IP Network Address Translator) ĸʲô?

NAT, ķΪַתϸϢԷRFC 1631 - http://www.faqs.org/rfcs/rfc1631.html, ǶNATĶͽ͵ȨﶼǺܳͼɬģרҵʿѴ׼ȷNATĺ塣

ҪȫNAT ãǱIPַ࣬һ˽IPַǳIPַһǷ˽еIPַǳIPַIPַĸõĽܲμҵһƪ: http://hwycheng.blogchina.com/2402121.html

IPַ: ָʹA/B/Cе˽еַ, IPַȫ򲻾ΨһԣҲ޷ֱӷʡ
IPַ: ָȫΨһIPֱַܹӱʵġ

NAT ĿΪʹIPַļṩ̨ͨйIPַļⲿĹܡNAT ĳЩIPַļⲿ緢IPݰԴIPַתΪNATԼĹIPַĿIPַ, IPݰת·յⲿļͬʱⲿļصIPݰĿIPַתΪIPַԴIPַ䣬ʹﵽеļ
                                                 
	----------------------                           ----------------------               
	| 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host
	----------------------                           ----------------------               
	        ^ port:2809                                      ^port: 1827                            
	        |                                                |                            
	        V                                                V                            
	----------------------                           ----------------------               
	| 192.168.0.1        | NAT device                | 192.168.0.2        | NAT device    
	| 61.51.99.86        |                           | 61.51.77.66        |               
	----------------------                           ----------------------               
	        ^                                                ^                            
	        |                                                |                            
	        V port:80                                        V port: 80                           
	----------------------                           ----------------------               
	| 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host 
	----------------------                           ----------------------               
                                                            
                              ͼһ: NAT ʵ˽IPļIPַInternetĹܡ
                              
ռIPv4ľԱ¶IPַΪһϡȱԴʱNAT ĹܾҲ¶ͬһIPַĳʱֻһ̨˽IPַļʹáNAPT(The IP Network Address/Port Translator)Ӧ˶NAPTʵ˶̨˽IPַļͬʱͨһIPַInternetĹܡں̶ܴʱIPv4ַԴĽš

NAPT ĳЩIPַļⲿ緢TCP/UDPݰԴIPַתΪNAPTԼĹIPַԴ˿תΪNAPTԼһ˿ڡĿIPַͶ˿ڲ, IPݰ·յⲿļͬʱⲿļصIPݰĿIPַתIPַĿĶ˿תΪĶ˿ڣԴIPַԴ˿ڲ䣬ʹﵽеļ

                                                 
		----------------------                           ----------------------               
		| 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host
		----------------------                           ----------------------               
			port: 2809	^                   ^ port: 1827
					 \                 /
					  v               v				
					----------------------            
					| 192.168.0.1        | NAT device 
					| 61.51.99.86        |            
					---------------------- 					
	map port:9882 to 192.168.0.5:2809 ^              ^ map port: 9881 to 192.168.0.6:1827
					 /                \
			     port:80	v                  v	port:80				
		----------------------                           ----------------------               
		| 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host 
		----------------------                           ----------------------   				
				
                              ͼ: NAPT ʵ˽IPļһIPַInternetĹܡ						
 
ǵĹ, NAPT洦ɼ󲿷ֹ˾ܹͨ1N̨֧NAPT·ʵֹ˾мⲿInternetġдƪµʱҲڼʹһ̨IBMʼǱͨһ̨ӵ̨ʽInternetġǱƪҪ۵NAPT⡣

NAPT(The IP Network Address/Port Translator) Ϊ谭P2PӦ?

ͨNAPT صֻNAPTڵļNAPTⲿӣⲿֱӺNAPTڵļֱӽǲġIM(ʱͨѶ)ԣζNAPTڵļNAPTļֻͨתͨѶP2PʽسԣζNAPTڵļܽյNAPTⲿӣù٣ٶȺȥP2PҪһҪܹһĳ̶ϽNAPTڵļܱⲿӵ⡣

NAT(The IP Network Address Translator) UDP͸ԭʲô?

TCP/IPʱҪõTCPUDPЭ顣TCPЭǿɿģӵĴЭ顣UDPǲɿģӵЭ顣TCPUDPЭʵԭNAPTд͸ҪָUDPЭ顣TCPЭҲпܣǿԷǳСҪߣǴ˴ۣȤԵGoogleЩ¶̽ԵUDPЭ͸NAPTԭʲô:

			----------------------                           ----------------------               
			| 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host
			----------------------                           ----------------------               
			  UDP port: 2809	^                   ^ UDP port: 1827
						 \                 /
						  v               v				
						----------------------            
						| 192.168.0.1        | NAT device 
						| 61.51.99.86        |            
						---------------------- 					
  Session(192.168.0.6:1827 <-> 61.51.76.102:8098) ^              ^ Session(192.168.0.6:1827 <-> 61.51.76.102:8098)
               map port:9882 to 192.168.0.5:2809 /                \map port: 9881 to 192.168.0.6:1827
				  UDP port:8098	v                  v	UDP port:8098				
			----------------------                           ----------------------               
			| 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host 
			----------------------                           ---------------------- 		
							
					
		                      ͼ: NAPT ν˽IPַUDPݰ빫͸ġ

UDPЭNAPT͸˵:

NAPTΪÿһSessionһNAPTԼĶ˿ںţݴ˶˿ںжϽյĹIPصTCP/IPݰת̨IPַļSessionģUDPͨѶҪӣǶNAPTԣȷҪһSessionĸڡNAPTUDPЭ͸ٵһҪδSessionǶ֪TCPӵSessionSYNʼFINNAPTԺ׵ĻȡTCP SessionڣдǶUDPԣ鷳ˣNAPT֪תȥUDPЭǷ񵽴ĿҲûа취֪ҼUDPЭص㣬ɿܲNAPTǿάSessionĴڣԱȴⲿͻݲתIPַļNAPTδUDP Sessionĳʱأͬĳṩ豸NAPTʵֲͬҲӣҲСʱЩNAPTʵֻ豸æµ״̬ܼ㳬ʱʱĳ̡

		  [192.168.0.6:1827]
                            | UDP Packet[src ip:192.168.0.6 src port:1827 dst ip:61.51.76.102 dst port 8098]
                            v
	[pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
                            | UDP Packet[src ip:61.51.99.86 src port:9881 dst ip:61.51.76.102 dst port 8098]
                            v			
		  [61.51.76.102:8098]
		  
		  		    ͼ: NAPT ڲUDPЭԴַԴ˿ڸı䴫IP
		  		    
		  		    
		  [192.168.0.6:1827]
		            ^
                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:192.168.0.6 dst port 1827]
	[pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]
		            ^	
                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:61.51.99.86 dst port 9881]	
		  [61.51.76.102:8098]
		  
		  		    ͼ: NAPT յĹIPصUDPЭĿĵַĿĶ˿ڸı䴫IP		  		    
ǴNAPTʵ͸ͨѶһĵ⣬NAPTʲôжǷҪΪһ󷢳UDPݰSessionأҪһ¼: 

A. Դַ(IPַ)ͬ, NAPTϿ϶ӦͬSession
B. Դַ(IPַ)ͬԴ˿ڲͬأNAPTҲ϶ӦͬSession
C. Դַ(IPַ)ͬԴ˿ͬĿĵַ(IPַ)ͬĿĶ˿ڲͬNAPTϿ϶ӦͬһSession
D. Դַ(IPַ)ͬԴ˿ͬĿĵַ(IPַ)ͬĿĶ˿ڣNAPTδSessionأ

DʽǹĺҪ۵⡣Ŀĵַ(IPַ)SessionĽľʽǽNAPT豸Ϊ:

Symmetric NAPT:
ڵͬһIPַ˿ڵӷʹͬһSession; ڵͬIPַ, ˿ڵʹòͬSession. 
ǳƴNAPTΪ Symmetric NAPT. ҲֻҪذ󶨵UDP˿ͬ ĿIPַͬὨͬSession.

	[202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]
		^		^			^
		|		|			|
		v		v			v
	       9883	       9882		       9881
		                 |
			     \ [NAT] /
			         ^
			         |
			         v			  
			  [192.168.0.6:1827]
			  
			  ͼ: Symmetric Ӣ˼ǶԳơ˿ڶӦƽеģԳƵ!
		  
Cone NAPT:
ڵͬһIPַ˿ڵӷʹͬһSession; ڵͬIPַ˿ڵҲʹͬһSession.
ǳƴNAPTΪ Cone NAPT. ҲֻҪذ󶨵UDP˿ͬ ĿĵַǷͬ ʹͬһSession.

	[202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]

			^	   ^	     ^
			 \	   |	    /
			  v	   v	   v
			         9881
                                 [NAT]
				   ^
				   |
				   v			  
			  [192.168.0.6:1827]
			  
			  ͼ: Cone Ӣ˼׶һ˿ڶӦǲ׶?

ھNAPTںߣCone NATڲԵĹУֻʹһ̨ձSymmetric NATòԼģҴӲջ, ϣƪµҲԾĲҪձĶWin9x/2K/XP/2003ϵͳԴNAPTҲ Cone NATġֵҵģΪҪUDP͸ֻCone NATУֻҪһ̨Cone NATԲUDP͸ûϣˣתɡϸ!

һNAPT ʱһЩݽṹǽ˵UDPԴ͸Cone NATݡݽṹֻΪ˵ԭʵʲοֵȤĶLinuxйNATʵֲֵԴ롣NATʵҲûݿģǺǣΪٶȣ

Symmetric NAPT ʱĶ˿ӳݽṹ:

Ϣ:

[NAPT ˿] [ IPַ ] [ ˿ ] [ IPַ ] [ SessionTime ʼʱ ]

PRIMARY KEY( [NAPT ˿] ) -> ʾ[NAPT ˿]Ψһҽӿ.
UNIQUE( [ IPַ ], [ ˿ ] ) -> ʾֶظ.
UNIQUE( [ IPַ ], [ ˿ ], [ IPַ ] ) -> ʾֶظ.

ӳ:

[NAPT ˿] [ ˿ ]

UNIQUE( [NAPT ˿], [ ˿ ] ) -> ʾֶظ.

Cone NAPT ʱĶ˿ӳݽṹ:

Ϣ:

[NAPT ˿] [ IPַ ] [ ˿ ] [ SessionTime ʼʱ ]

PRIMARY KEY( [NAPT ˿] ) -> ʾ[NAPT ˿]Ψһҽӿ.
UNIQUE( [ IPַ ], [ ˿ ] ) -> ʾֶظ.

Ϣ:

[ wid ʶ ] [ IPַ ] [ ˿ ]

PRIMARY KEY( [ wid ʶ ] ) -> ʾ[ wid ʶ ]Ψһҽӿ.
UNIQUE( [ IPַ ], [ ˿ ] ) -> ʾֶظ.

ӳ: ʵһԶ࣬

[NAPT ˿] [ wid ʶ ]

UNIQUE( [NAPT ˿], [ wid ʶ ] ) -> ʾֶظ.
UNIQUE( [ wid ʶ ] ) -> ʶֶβظ.

ݽṹǸ˻Ǹˣ Ǻ! һͻˡͨNAT,Ǻ׵ģNAPTԶǵӦóعδġôⲿļеļʵأһ̣

c һ̨NAPTsһ̨IPַļc  s NAPTĹԼݽṹм¼һSession. Ȼ c  s ֮Ϳʵ˫͸ݴˡʾ:

   c[192.168.0.6:1827] <-> [priv ip: 192.168.0.1]NAPT[pub ip: 61.51.99.86:9881] <-> s[61.51.76.102:8098]

ɴ˿ɼһ̨IPַļNAPTͨѶҪNAPTIPַļһUDPݰIPַļյUDPݰȡNAPTIPַӳĶ˿ڣԺͿԺIPļ͸ĽͨѶˡ
    
һĵNAPTʵֱͨѶ? ߶޷˭Ҳ֪ԷNAPTĹIPַNAPTӳĶ˿ںšҪһIPַķӡNAPTֱ˹IPַķ󣬷ԴյUDPݰлȡNAPT豸ĹIPַӽSessionӳ˿ڡ
ԴӷϻȡԷNAPT豸IPַӳĶ˿ˡ

ǼֱΪABӦNAPTֱΪANBN AڻȡBӦBNIPַӳĶ˿ںȲIP
ַӳĶ˿ڷ˸UDPݰʲôأԭݽṹǻ֪ANԼݽṹһ¼ʶһSessionĴڡBNյݰ󣬴Լݽṹвѯûҵؼ¼˽BǸӣʱ̵ANIPַӳĶ˿ڷһUDPݰأȻĽṹˣANյݰ󣬴Լݽṹвҵ˼¼Խݰд͸AA ٴBݰʱһжʱͨˡOK, 󹤸ɣʱCone NAPTԣSymmetric NAPTأǺǣԼһ°...

NAPT(The IP Network Address/Port Translator) UDP͸ľ!

ȷĽNAPT豸˵Ϊ: Symmetric NAPT  Cone NAPT, Cone NAPT ҪġWin9x/2K/XP/2003 ԴNAPTҲΪCone NAPT

һ, ˫Symmetric NAPT:

Ӧʲô⣬϶ǲ֧UDP͸

ڶ, ˫Cone NAPT:

ҪģԽUDP͸

, һSymmetric NAPT, һCone NAPT:

Ƚϸӣǰݻһ·Ҳ׾ͻ, ,

: A -> Symmetric NAT, B -> Cone NAT

1. A  B, A ӷǶȡ B NATַӳ˿, A ֪֪ͨ B ANATַӳ˿, B  A ӣA ϶޷յʱ A  B ӣ A ӦNATһµSessionһµӳ˿ڣ B  NAT յUDPԼӳвѯ޷ҵӳ˽ˡ

2. B  A, B ӷǶȡ A NATַӳ˿, B ֪ͨ, ֪ A BNATַӳ˿,A  B , A ӦNATһµSessionһµӳ˿B϶޷յʱ B  A ,  B ޷ȡ A µSessionӳ˿ڣʹ÷ϻȡӳ˿ڽӣ  A NATڽյUDPԼӳвѯ޷ҵӳ, ˽ˡ

Ϸֻеӵ˵NATΪCone NAT£ܽUDP͸


NAPT(The IP Network Address/Port Translator) UDP͸νʵ֤ͷ!

Ҫṹ:

NAT̨Cone NAPTһ̨ Symmetric NAPT

֤:

ʹñṩԴ룬룬ȻֱзͿͻˡ޸ĹԴ˿ͻֱ֮ͨIPַͶ˿ڷϢôֶ֤NAPTĴ͸Ϊ˷ƼʹһԶ̵½ֱһ̨ϲеصļܷ㣬һ˾ͿеĹˡǺǣ˾ôɵġӭȤ;ָͬ