P2P為什麼要連接對方的局域網本地IP地址??

tclcf 2011-06-18 10:29:05
P2P為什麼要連接對方的局域網本地IP地址??

我上次測試了個沒有連接對方局域網本地IP,單純互連接廣宇IP和客戶UDP的外網IP,沒有成功。還是說只要再多連接個局域網本地IP就能P2P成功了?
...全文
87 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
辰岡墨竹 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tclcf 的回复:]
對方的IP和端口是對方UDP連接過來後,我獲取在數據報裏的對方IP和端口,就是說對方本地端口為16478但在數據報裏的端口則是其路由器真實發送的端口,所以我獲得的是其真實映射在路由器的IP端口。但和有的網吧的電腦可以P2P連接成功的,有的卻不行。
[/Quote]
你注意看那个Wikipedia,NAT有4种。对于完全圆锥型的,UDP打洞是可以的。但是对于其他类型的,路由器不会一直保持UDP的打开和映射关系,下次发送肯呢会动态选择其它的端口,所以肯定会失败。
辰岡墨竹 2011-06-19
  • 打赏
  • 举报
回复
你可以去看看
http://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2
一般来说如果路由器支持UPNP,那么是最好选择。不过由于NAT有很多种实现方式,有的时候真的无法建立直接连接,只能依靠其它机器来中转。
辰岡墨竹 2011-06-19
  • 打赏
  • 举报
回复
那肯定不行,因为中间路由器有NAT机制。对方机器开的端口和路由器上开放的端口很可能不一致。
比如内网里有两台机器都开放80端口,那么在NAT的路由器上,对应的端口有可能是9001和9002。NAT会拆开IP封包按照自己的规则去修改端口号和网络地址。
要想P2P成功,需要NAT穿透机制,比如UDP打洞或者UPNP什么的……
飞天御剑流 2011-06-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tclcf 的回复:]
引用 1 楼 bokutake 的回复:
那肯定不行,因为中间路由器有NAT机制。对方机器开的端口和路由器上开放的端口很可能不一致。
比如内网里有两台机器都开放80端口,那么在NAT的路由器上,对应的端口有可能是9001和9002。NAT会拆开IP封包按照自己的规则去修改端口号和网络地址。
要想P2P成功,需要NAT穿透机制,比如UDP打洞或者UPNP什么的……

對方的IP和端口是對方……
[/Quote]

在UPNP出现以前,NAT是只转换报头的IP和端口,不会转换包内的ip和端口的。但有些应用发送和接收数据不使用同一个端口,接收数据使用的ip和端口会发送给对方供对方发送数据,而且这个端口通常是动态的,不是固定的,动态端口意味着无法直接使用端口影射(除非你每打开一次应用就手工重新修改一次这个端口影射表,当然是不切实际的),这个ip和端口是放在ip包内的,因此对于不支持UPNP的NAT,对方只会收到己方的内网IP和端口,当然连接不成功。

UPNP就是为了解决这个问题而出现的技术。UPNP不仅转换报头的ip和端口,同时也转换包内的ip和端口,还有更重要的一点,会为此动态端口自动建立端口影射,这样就能保证连接成功了。
tclcf 2011-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bokutake 的回复:]
那肯定不行,因为中间路由器有NAT机制。对方机器开的端口和路由器上开放的端口很可能不一致。
比如内网里有两台机器都开放80端口,那么在NAT的路由器上,对应的端口有可能是9001和9002。NAT会拆开IP封包按照自己的规则去修改端口号和网络地址。
要想P2P成功,需要NAT穿透机制,比如UDP打洞或者UPNP什么的……
[/Quote]
對方的IP和端口是對方UDP連接過來後,我獲取在數據報裏的對方IP和端口,就是說對方本地端口為16478但在數據報裏的端口則是其路由器真實發送的端口,所以我獲得的是其真實映射在路由器的IP端口。但和有的網吧的電腦可以P2P連接成功的,有的卻不行。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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