曾经学过计算机网络,也知道Mac地址,IP 地址,路由转发,路由算法。 同时也理解IP是4个字节,分为A、 B 、C 类型网,还有D广播 E保留,表示的网络数量和机器是有限的。随着计算机日益增加,需要越来越多的ip,已有的ip地址已经不足表示这么多网络和机器。 书中也有各种方法去解决扩展子网, 比如 Classless And subnet Address Extension (CIDR) ---来自于Douglas E.Commer 经典书 Internetworking with TCP I ---中讲的Subnet Addressing,这些都是扩展局域网地址,但是本质上没有增加表示的机器数量。现实中 ,自己用的电信的ADSL,申请一个IP,接上一个Modem,连接一个路由,然后就可以接好4台电脑,同时上网。 换句话说,也就是这4台电脑其实同时用一个ip 上网。怎么做的呢?
感觉,这个才是一个真正扩展IP,其路由器连接的若干台机器所在的局域网,只有一个ip地址。 所有机器上网,所有的请求都是通过路由器转发出去。 曾以为请求就是这样,局域网中某一个机器,发送一个请求,该请求被封装成为若干个ip包,对于每一个ip包路由器将其自己共有网的地址加在改ip包上,然后转发出去在外网上层层转发达到目的地址。
但是再想,好像不对。如果该请求被对方服务器接受,那么该服务器如何区分改共有IP(路由器的ip,从电信那分配过来的)还有其私有IP(局域网的ip)?对方服务器如何响应请求? 如果是基于socket 程序,如果得到对方那么多ip地址? 如果即使得到,那么客户程序不是就得重新变化? 更何况如果该包被以这种方式转发多次,那么该ip包就有好多个ip,那问题不是复杂多。
感觉猜想不对。这种方式共享ip的局域网,肯定不是这样组成一个ip链来转发消息的。 那应该是什么?
回顾一个整个过程:不同机器发给ip包给了路由器, 路由器只是把ip包ip转换一下,把私有ip转换为共有ip,即路由器的ip。(可以通过tracert来查看第一个出去的ip,就是ISP分配过来的IP),再由路由器统一发出去。 那么该局域网中不同机器,发出去的请求都是经过路由器,那么其转换后的IP都是一样的。 那么对于路由器接受到的来自外面的相应,如何转发到指定的局域网的某一台机器?
可以看到路由器就是一个转发站,将出去的请求转发到外面,同时将外面的相应转发回来。肯定需要这么一表,如何将来自局域网的请求转发出去,同时将外面请求根据该表来转发回来。 感觉是端口了。路由器就是用端口转发的。
对于一个来自与于内部的请求包,路由器记下来来自于那个机器,并用指定端口发出去。 对于外面的回来的相应,根据端口号,查表,修改ip包,转发到指定的机器上。 如此一般。
查一下资料好像就是NATP原理。
但是NATP 也有问题,比如说FTP协议,它有两个连接,一个是控制连接,另外一个是数据连接。 先有FTP客户端建立一个TCP连接去连接服务器,然后在有数据传输时,需要客户端需申请一个新连接。 创建一个新的socket, 那么服务器怎么知道客户端对方的端口号? 这需要客户端已经建立的控制连接,将新生成的Socket的端口,转换为ASCII 码,然后由控制连接传给对方,对方再根据端口建立数据连接,来传送文件。 问题出来,如果一个用NATP方式,用户的端口是本地的端口,路由器如果不解析该IP包并将其映射为本地端口,否则客户端的port 对于 服务器来说是无效的。
大胆假设,小心求证。