关于UDP打洞问题

zt8611006 2009-09-10 05:51:54
只有NAT确信内部想与外部通信,NAT才会让外部的数据包进入内部。那么NAT是靠什么“确信内部想与外部通信”,就是内部发送一个数据包到这个“外部地址”

比如下面的网络环境:
Client A ->Nat A->....internet <-Nat B<-Client B

比如Client A想发送给Client B一个信息“Hello”。那么直接给Client B的公网地址发送信息,会被NAT B丢掉,那么怎么让NAT B不丢掉这个信息呢?就是告诉NAT B“Client B确实想与Client A通信”,如果告诉NAT B?简单,让Client B发送一个“信息”到Client A的公网地址就好(这个信息就是“打洞”包)

过程:
1 Client A告诉Server : 我想与Client B通信
2 Server通知Client B :Client A想与你通信
3 Client B发送一个“打洞包”到Client A的公网地址(这个打洞包不需要携带任何有效信息)
4 Client A发送“Hello”到Client B,由于第三步的原因,NAT不会拒绝这个请求,通信成功。

我的问题在第三步,ClientA想给B发包,被丢弃,同理为何B给A发不被丢弃?

我研究P2P有段时间了,一直搞不懂这个问题,望高手指点,谢谢
...全文
57 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-09-11
  • 打赏
  • 举报
回复
NAT分锥形和对称两种类型。
对于锥形NAT,每个内网地址和端口对应固定的公网地址和端口,有些NAT会要求首先由内网向外网的某一地址和端口发送过数据后,从该外地址和端口发送过来的数据才允许进入内网,也就是A先发数据给B,之后B再发数据给A时A可以收到。
对于对称NAT,由于同一内网地址和端口与不同的外网地址通讯时,NAT所分配的公网地址和端口不同,所以不能这样实现打洞。
dancingbit 2009-09-11
  • 打赏
  • 举报
回复
第三步的B给A发的包在到达NAT A的时候,同样会被丢弃,但这个时候已经经过了NAT B,已经在NAT B处留下了记录,即使被NAT A丢弃,它也已经完成了自己的使命。
编程有钱人了 2009-09-11
  • 打赏
  • 举报
回复
这个得UP
bmwsl 2009-09-11
  • 打赏
  • 举报
回复
mark
LixingTie 2009-09-10
  • 打赏
  • 举报
回复
http://www.cnblogs.com/LixingTie/archive/2009/07/06/1517896.html

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧