对等网络如何工作?


15

据我了解,除非我们知道路由器采用的路由机制,否则无法将数据包从网络外部发送到局域网中的计算机。

假设我们有一个如下所示的设置:

  1. 计算机A,IP 192.168.1.2(默认网关192.168.1.1)

  2. 计算机B,IP 192.168.1.3(默认网关192.168.1.1)

  3. 路由器C,IP 192.168.1.1(外部IP 1.1.1.1)

  4. 路由器D(外部IP 2.2.2.2)

计算机A,计算机B和路由器C属于同一局域网。Router-D希望将数据发送到Computer-A,但如果不通过Router-C,它就无法发送数据。

现在,如果目标端口为1000,则Router-C会将数据包转发至计算机A,而如果目标端口为2000,则将转发数据包至计算机B。但是,可以肯定的是,唯一知道此路由机制的设备就是路由器C!甚至计算机A或计算机B都不会知道,对吗?

因此,如果RouterD通过端口1000向Router-C发送数据包,则可以将数据包发送给Computer-A,但是RouterD如何知道通过端口1000发送数据包,而不是说端口1001?

像Bittorrent这样的点对点程序如何解决此问题?我能想到的唯一解决方案是让Router-D通过所有端口将数据包发送到Router-C ,以便将其转发到Computer-A,但是还有更好的解决方案吗?

Answers:


9

您的困惑源于一些错误的假设。

但是可以肯定,唯一知道这种路由机制的设备是Router-C本身!甚至计算机A或计算机B都不会知道,对吗?

为什么,为什么?然后为什么将路由器配置为将这些端口转发到这些IP?您必须将P2P客户端设置为使用特定端口,然后将路由器设置为对应。

但是Router-D如何知道通过端口1000发送数据包,而不是说端口1001?

因为您将P2P客户端配置为使用特定端口(该协议的标准端口或非标准端口)。

我能想到的唯一解决方案是让Router-D通过所有端口将数据包发送到Router-C,以便将其转发到Computer-A,但是还有更好的解决方案吗?

比这简单得多。当客户端与对等方建立连接时,它会指定要使用的端口,因此对等方会在该端口上发送数据。

嗯,但是Bittorrent不会改变路由器的行为吗?如superuser.com/a/187190/78897所示,由于某些路由机制可能是动态的,因此Computer-A如何知道它?

客户端不会直接影响路由器,但是可以对路由器进行足够的配置/智能化以适应客户端的行为。您可以在路由器和客户端中均启用UPnP以自动配置连接,并且大多数路由器作为其端口转发机制的一部分,具有状态检查功能。

综上所述,这意味着可以在随机端口上动态建立连接,然后路由器可以跟踪正在发生的事情,而不是将所有内容视为随机,无意义的连接。这样,它可以根据需要转发连接,因为例如,它是对刚刚发生的另一个连接的响应

当您有多个使用同一程序的系统时,就会出现问题。将多个系统连接到同一路由器,共享相同的IP并快速使用动态端口变得难以管理,即使进行状态检查,也很难使它正常工作。在这种情况下,将需要使用静态端口(默认端口或其他端口)。


如果您使用SmartSniffTCPView之类的程序来监视您的连接,您会注意到P2P连接通常会将您配置的端口(或客户端的默认端口)作为传入连接的目的地,并且使用默认端口或自定义/随机端口作为源,反之亦然。


嗯,但是Bittorrent不会改变路由器的行为吗?如superuser.com/a/187190/78897所示,由于某些路由机制可能是动态的,因此Computer-A如何知道呢?
Pacerier,2012年

转发端口。您已预先设置。
犹他州Jarhead

@Pacerier如果路由器和p2p应用程序都使用UPnP,则可以动态完成端口转发。在这种情况下,是的Bittorrent 确实会更改路由器的行为。
zero2cx 2012年

@ zero2cx,是否仍然可以在不更改路由器行为的情况下进行对等?
Pacerier,2012年

@Pacerier,如果要使用NAT(多个系统共享一个连接),则必须以某种方式配置路由器以知道在何处建立连接(嗯,从技术上讲,您可以像建议的那样让每个人都将每个连接都发送到所有端口,但是充其量是可怕的)。您可以静态(配置IP和端口)或动态(UPnP)进行此操作。
Synetech

4

您的问题触及Internet的核心以及路由的定义。在您的示例中,路由器D基于两个前提将数据发送到计算机A:

  • 被告知将数据发送到计算机A。
  • 它已经从计算机A处理了数据。

您的方案似乎采用了第一个选项-路由器D想发送到计算机A。但是它如何到达那里呢?它是通过使用路由器之间共享的路由表来实现的。

路由器C会定期向所有知道的路由器(包括路由器D)发送更新,这些更新包括“知道”“ 192.168。*”网络(实际上-由于该网络未路由-不会发生-这不会发生-它被视为私有)。忽略它。)因此,路由器D已经知道路由器C知道该网络。

因此,当数据发往计算机A时,首先要通过网络对其进行寻址。因此,路由器D询问:“我需要找到192.168。*网络。我知道吗?不。我认识其他人吗?是的。路由器C知道。我如何通过2.2到达路由器C? 2.2接口。”

路由器D然后将数据发送到路由器C。路由器C收到数据后说:“哦,我有来自路由器D的数据,但是用于192.168网络。我知道该网络吗?是的,通过我的192.168.1.1网络”,然后转发它。

还需要完成其他一些工作来解决IP和MAC寻址问题,但实际上,我只涉及路由,而不是ARP和本地网络。

您会注意到您的第一个假设-远程路由器必须知道路由机制-在这里不起作用。路由器D不在乎路由器C是否使用EIGRP,RIP,RIPv2,OSPF或其他。它关心的只是它有更新。(当然,如何进行更新对于确保两者保持同步很重要。但这又是一个不同的问题。)

您的第二个假设-端口号是路由选择的一个因素-也不正确。路由器(通常)不需要端口信息即可做出路由决策。(由于某些新的网络技术,这种情况已经略有变化,并且主要适用于防火墙和代理,但是更广泛的假设仍然适用于“真”路由器。)

继续您的示例,路由器C将在端口1000(根据您的方案)上转发数据,因为计算机A上可能有服务期望该特定端口上的数据。但是它只知道这样做,因为路由器D在端口1000上发送了它。路由器D只在该端口上发送了它,因为数据的始发者在该端口上将它发送到了路由器D。

我不理解您包含bittorrent或P2P程序可以反映您提出的问题。相同的解释将适用。路由器还可以配置有端口触发功能,该功能可以将特定设备(或IP)与特定端口相关联。这样,当流量进入端口1234时,路由器便知道将数据发送到设备ABCD。这通常与传出TCP端口关联。即,如果我在端口7890上发送流量,则路由器知道传入流量将在端口1234上并将其发送给我。

但是端口触发与(远程)路由决策无关,而是与路由器用于LAN的内部MAC / IP表有关。

更新/编辑:在您发表评论后进一步回答和阐述。路由器D仅通过其IP地址(192.168.2.2)知道计算机A。但是路由器C通过IP地址和MAC地址知道计算机A。MAC(媒体访问控制)是国际标准定义的唯一(通常是...)48位标识符。连接到LAN(有线和无线)的每个设备都应该具有唯一的MAC地址。

路由器(路由器C)将IP地址和MAC地址关联到一个表(MAC地址表)中。因此,当流量进入路由器C,并且路由器意识到对它的“本地”时,它将进行MAC地址表查找。然后,路由器从字面上更改帧寻址信息。

它重建(重写)第2层目标信息以具有计算机A的目标MAC地址,但保持IP地址信息(第3层)相同。

如果路由不知道MAC地址。还是表中没有IP-MAC关系,它执行称为ARP(地址解析协议)的操作来询问“ HEY,该网络上的每个人。您有这个MAC地址吗?” 或有时-“每个人,您的MAC地址是什么?”)。适当的设备响应,路由器将建立其IP-MAC表。


因此,路由器D通过端口60000(预先配置)将数据包发送到路由器C,路由器C接收到该数据包,但是如何知道该数据包将被转发到计算机A?
Pacerier,2012年

1
路由器D已经知道最终的目的地-计算机A。它(路由器D)仅通过IP地址192.168.2.2知道计算机A。但是,路由器C知道通过两种方法知道计算机A:IP地址(192.168.2.2)和称为其MAC地址的东西。我将用更多信息更新答案。
约翰

2

端口触发。请求后,Web服务器如何将网页发送给您?因为您已请求。当您请求它时,路由器知道会收到答复,并且在收到答复后会将其转发到适当的PC。编写了一些程序,以期在预期来自特定PC的信号时触发打开信号,即使不是真的在路上。

一些型号具有用于基本通信的中央服务器。例如:

  • Client1登录到Server以进行双向通信。
  • Client2登录相同的内容。

服务器现在知道Client1和Client2拥有的所有文件。

  • Client2说“我希望文件X从Client1”到服务器。
  • 服务器告诉Client1“ Client2需要X文件”。
  • 客户端1将垃圾数据发送到客户端2的公共IP,关闭端口触发,以便为客户端2的回复打开端口。
  • Client2将其初始信号发送到Client1的公共IP。

Client1欺骗了路由器为Client2打开该端口。

在某些情况下,例如BitTorrent或原始的Napster(iirc),您必须在路由器上转发端口,以使其最佳工作。

至于其他客户端最初知道要连接到哪个端口,这是因为您的客户端告诉群集或服务器您使用哪个端口。BitTorrent经常使用跟踪器,该跟踪器跟踪哪些客户端使用了哪些端口。


据他们知道要使用哪些端口...,您可以将客户端配置为侦听特定端口。您的客户端告诉群(例如BitTorrent)正在使用的端口,以便其他客户端知道要连接的端口。您的PC告诉他们。
犹他州Jarhead 2012年

我想你是在写我的第一个补遗时答复的。正确?
犹他州Jarhead

但是当路由器是PC时,PC如何知道其路由机制?有些机构可能是动态的,如证实superuser.com/a/187190/78897
Pacerier

不,它不需要知道路由。为了使大多数P2P客户端正常工作,您需要在路由器上正确配置端口转发。没有它,您只能与您首先与之交谈的其他客户进行交流。他们无法发起对话。我在回答中简短地谈到了这一点(第二段,第二段)
犹他州杰黑德2012年

但是只有在管理员预先配置端口转发的情况下才可以进行端口转发。.您是说Bittorrent 重新配置了我们的路由器吗?
Pacerier,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.