因项目的需要,翻阅了一些网络设置的内容,对路由器的认识又清晰并且深入的一步。由于在生活中很常见,我们一般提到的路由器就是指家庭中供手机、电脑中上网用的那个设备。但是严格来说,家用路由器并不是单纯的路由器,还包含了交换机功能,并且使用了端口复用NAT方式与外部进行数据交换(PAT)。
因项目用到了网络通信,虽然用路由器等设备能够完成项目的需求,但是对网络通信的内部细节和原理概念不是很清楚,抽时间查阅了一些有关的资料,并通过项目的经验总结出来了这一篇文章。
简单介绍一下PAT(port address translation),我们知道家用路由器中要填写一个WAN口IP才能上网,那么这个WAN口IP就是可路由的共有IP地址。那么什么是公有IP呢,互联网规定了IPv4的地址分为共有地址和私有地址,私有地址就是常见的192.168.1.0、10.1.1.0等等地址段,这些地址通常用来设置局域网内电脑的IP。比如我们设置了路由器的访问地址是192.168.1.1,那么连接这个路由器的电脑IP就可以是192.168.1.100(2-254之间)。这些私有IP是帮助我们建设局域网的,只能在局域网内访问,路由器是不会转发私有IP的数据到互联网的,即不可路由。那剩下的公有IP就可以在路由器之间传递数据。因此,为了能够上互联网,就必须有一个公有IP。你的路由器设置好了WAN口,那么公有IP就有了,当你浏览网页时,你的电脑、笔记本、手机上网都会使用这个IP向服务器请求数据,服务器也会发送数据到这个IP地址,也就是发送给你的路由器。然后你的路由器再把数据发给你的电脑,你就看到网页了。
那么问题来了,当你的电脑、笔记本、手机同时上网时,路由器是怎么知道改把哪个数据包发送给电脑、笔记本、手机呢。这既是PAT的作用了,你的电脑、笔记本、手机上网时,路由器都会使用PAT给每个局域网IP分配一个端口号,然后公有IP用这个端口号去访问服务器,服务器返回的数据中也会包含这个端口号,路由器再根据这个端口号把数据发给对应的子网设备。
几个重要的概念
IP地址:互联网协议地址,每一个联网的电脑都有一个IP。
- 大家都明白啦,每一个电脑都要有IP才能上网,IP就是电脑的地址,告诉别人按照这个地址访问我
子网掩码:从名字子网可以看出,用来划分小块网络的。将IP地址划分为网络地址和主机地址,同一个网络地址的电脑组成一个局域网
- 通过将IP地址和子网掩码进行
位与运算,判断两个IP运算后的结果是不是相同来判断这两个IP是不是属于同一个子网。如果属于同一个子网,则直接通信;如果不是一个子网,则会把数据发送到网关。例如电脑AM的IP为192.168.1.12,电脑BM的IP为192.168.1.22,电脑CM的IP为192.168.2.32,子网掩码都是255.255.255.0。通过IP与子网掩码位与运算后分别得到 AM:192.168.1.0、BM:192.168.1.0、CM:192.168.2.0,看出AM与BM是相同的,即有相同的网络地址192.1.1,属于一个局域网,通过主机地址12、22 区分不同的主机;CM跟他们都是不一样的,那么A和B就可以通过交换机通信啦,甚至一根网线直接连接A和B的网口也能通信;但是C属于另一个子网,用一根网线或者一个交换机是无法实现通信的,要想进行通信就必须借助到网关。
网关:子网之间连接的关口。
- 连接两个子网的设备。例如上面的例子电脑AM BM CM,AM想要与CM通信就必须经过网关的转接
路由器:决定两个电脑之间的网络路径
- 互联网是超级大的,电脑与电脑(服务器也是电脑)之间存在着很多网关、路由器,网络通信中如何通过这些设备才能把数据发送给正确的电脑,就需要路由器给出一条网络路径。而且点到点的网络路径就不只一条,路由协议一般会给出最优的路径。
- 为了防止数据在互联网内的路由器之间无限循环和转发,IP协议规定了数据包的生存时间TTL,TTL一般为64。当经过一个路由器时,路由器会将TTL减一,当TTL减到0的时候路由器就会丢弃这个数据包。即一般来说IP数据包最多能经过64个路由器,如果经过64个路由器后还没找到目的电脑,那么数据就消失了。
DHCP:动态主机配置协议
- 电脑需要配置好IP、子网掩码、网关才能上网,如果一个局域网中有很多电脑时,一个个手动配置就太麻烦了。DHCP服务就能够自动配置网络参数。如果电脑开启了DHCP(自动获取IP地址),那么电脑会主动向局域网广播请求IP地址,DHCP服务器收到后会返回给其配置参数,然后电脑根据得到的配置参数自动设置IP等。当IP地址租期到期后,电脑会再次向DHCP服务器请求一个IP。
NAT:网络地址转换
- IP地址分为公有地址和私有地址。公有地址能够在路由器间路由;私有地址只能在局域网中靠交换机连接,不能被路由。比如说你的IP是192.168.1.111,那么同一个局域网的电脑才能够访问你,其他地方的电脑是找不到你的;而百度的IP地址 14.215.177.38 是公有地址,在任何地方都能访问。
- 当我们访问百度的时候,IP数据包中就包含了源地址(我们电脑的IP)和目的地址(百度服务器的IP),百度的服务器收到我们的请求后会发送数据给我们的电脑,他会将我们电脑的IP作为目的地址发送IP数据包。当我们电脑的IP是公有地址时,我们能够正常收到返回的数据;当我们的电脑IP是局域网的私有地址时,路由器是找不到我们的,也就是通信失败。
- 为了能够正常通信,就必须告诉百度服务器一个公有地址,一般要去电信申请,然后填入我们的路由器(或者电脑),比如 220.181.57.77 。我们有了这个IP就可以接入互联网了
- 如果只有一个公有地址220.181.57.77,那么局域网内其他电脑接入互联网也要用这个IP,为了保证都能上网,一般我们会把220.181.57.77写入路由器的wan口,然后局域网内电脑都接入路由器的lan口
当有电脑访问互联网时,比如访问百度,电脑会在IP数据包中填写源地址为自己的IP:Port,目的地址为百度IP:80,然后发出去,首先经过路由器,路由器的NAT服务会开通一个端口并绑定该电脑,然后将IP数据包中源地址换成路由器的公有地址和新开的端口发送出去,等到百度回复的IP数据包到来后,路由器的NAT服务再根据端口号选择将数据包发给哪个电脑,具体如图:
NAT 有三种工作方式:
静态转换,一个私有地址唯一对应一个公有地址,不可变,需要一个公有地址池;
动态转换,一个私有地址随机分配一个公有地址,用完就会释放,需要一个公有地址池;
端口多路复用,即上面讲述的方式,共享一个公有地址,通过端口区分局域网内的电脑,极大节约公有地址,并能隐藏局域网内所有主机
正向代理
经常听到代理上网,代理,顾名思义,通过第三方访问服务器,即,你上网时,你的电脑不直接访问网站,而是让别的电脑去访问网站,然后把网站数据再发给你,这样你就通过其他的电脑获得了你想要的数据。这样做的好处是可以隐藏你的电脑,因为网站只知道访问它的电脑的信息,因此网站只知道你设置代理的电脑,而你的电脑没有访问网站,网站时不知道你的。
正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。它代理的是客户端。
一般作为用户,只用到正向代理
反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。它代理的是服务端。
即,反向代理一般用在网站服务器上,用来分担负载压力,分流流量。对于访问者来说,是不知道服务器有没有代理。
正向代理小实验
tinyproxy是一个Linux上的轻量级代理软件,实验选择Linux主机作为代理服务器,Windows主机通过代理上网。
Linux安装tinyproxy
Linux上,可以下载源码安装,也可以 apt install tinyproxy。
修改配置文件,屏蔽两行
1 | #允许任何地址连接 |
Windows配置代理
在代理设置中填入Linux的IP地址和tinyproxy监听的端口号
设置好后,用浏览器打开百度,发现无法连接到代理服务器,说明Windows代理设置生效
启动tinyproxy服务
tinyproxy -d 在前台运行tinyproxy服务,再次去浏览百度,发现正常访问
这样就可以通过Linux主机代理上网了,可以隐藏自己的Windows电脑了