相关设备
- 光猫
- 路由器
- 两台电脑
路由器
有一个wan口和4个lan口,wan口负责连接到光猫,一般由这个口进行pppoe拨号,即可由运营商分配到一个公网IP(例如 2.2.2.2),如果是由光猫进行拨号,那wan口可能就是分配到一个局域网ip地址(例如:192.168.1.2), 由谁拨号的,谁就会去负责相关服务(dhcp动态主机配置协议,dns域名系统,nat网络地址转换等),如果光猫去拨号,那路由器就变成一个交换机+无限接入点,相当于一个二级设备,最后连接互联网还是要通过光猫,这种模式可以叫做光猫路由模式。但是明显路由器的性能更强一点,所以一般建议光猫选择桥接模式,连接路由器wan口,由wan口进行拨号。
常见家庭网络拓扑
我们先把路由器的四个lan接口单独拆出来单独做成一个交换机,便于我们理解,路由器拨号后有一个公网ip(2.2.2.2),交换机与路由器的虚拟网口建立连接,路由器这个网口有一个ip地址(例如:192.168.1.1), 这是路由器的内网IP,可以直接通过访问这个地址进入路由器管理后台,同时这个ip地址也是家里局域网的网关。家里所有的设备都可以通过wifi或者lan口连接到这台交换机,这就是大部分家庭的网络拓扑。
下面我们先来讲讲每个连接lan的设备是如何获取到ip地址的
现在我将一个电脑1连接到交换机的lan1口,电脑2连接到交换机的lan4口,连接上后,假设电脑获取ip的方式为自动获取,那么dhcp(动态主机配置协议)应用层协议就会开始工作了,电脑的dhcp客户端会发起一个请求。
请求说明如下:
应用层:dhcp
传输层:udp协议 [目标端口:67,源端口:68],这里dhcp客户端默认68端口,服务端67
网络层:ip协议 [源ip: 0.0.0.0, 目标ip: 255.255.255.255] (这里我们还不知道自己ip是多少,所以直接用0.0.0.0, 也不知道谁是dchp服务器,所以一不做二不休直接发给所有设备,所以这里用了广播IP: 255.255.255.255
网络接口层:封装mac地址, [源mac: CCCCCCCC, 目标mac:FFFFFFFF], 这里目标mac也不知道是发给谁,所以配置了全F的广播mac地址。
接着这个数据包会从网卡接口发出顺着网线来到交换机的lan1口,普通的家用交换机是只能解析网络接口层数据的设备,所以这里只能拿到mac地址,其他信息对它没用。交换机内部有个mac地址映射表,这里获取到源mac后会存入这个表,例如lan1接口对应CCCCCCCC mac地址,下次有其他请求拿到目标mac,会直接从表里面拿到对应的mac,就会知道要发给谁了。这里目标mac是广播mac,交换机会发送给所有设备,接收端是局域网的另一台电脑,因为这台电脑没有启动dchp服务端(监听67端口),就会自动忽略这个请求。此时请求来到路由器,路由器会提供很多服务(dhcp,ddns, dns等),这里路由器就可以处理这个请求,会从自己的dhcp地址池中分配一个未被分配的ip地址,假设为192.168.1.3,绑定此电脑mac地址,并且配置了剩余租期,长时间没有请求,租期到了会回收此ip,等下一次请求再重新分配绑定。分配地址后,重新封装数据包,发起请求,请求如下:
应用层:dhcp协议(包含子网掩码/网关/租期)
传输层:udp协议 [目标端口:68,源端口:67],这里dhcp客户端默认68端口,服务端67
网络层:ip协议 [源ip: 192.168.1.3, 目标ip: 255.255.255.255] (这里已经分配了ip,所以配置为192.168.1.3, 由于电脑还没接收到分配的ip,所以目标ip还是广播IP: 255.255.255.255
网络接口层:封装mac地址, [源mac: BBBBBBBBB, 目标mac:CCCCCCCC], 源mac是路由器的mac地址,发给电脑CCCCCCCC。
这个请求来到交换机,交换机解析获取mac地址,知道是要发给CCCCCCCC的,回去地址表中获取对应lan口(也就是lan1),并把请求发给该电脑。电脑接收到请求,解析封装,发现是发给自己的请求,就会接收分配的ip,进行相关配置,配置如下:
IP地址:192.168.1.3
子网掩码:255.255.255.0
网关IP:192.168.1.1
DNS: 192.168.1.1
剩余租期:6h
6h后会再发起请求续约IP地址,如果续约成功剩余租期会变成12h (主要看后台配置的租期时间)
以上就是一个完整自动获取的ip分配流程了。当然你也可以手动配置静态IP,但是IP必须在路由器网段中,以这个路由器为例,网络地址必须在 192.168.1.2 ~ 192.168.1.254之间,另外注意手动配置不要与其他设备冲突。另外路由器后台也可以直接通过mac地址给此电脑分配的ip地址,一般路由器都有这个功能。
电脑浏览器如何联网
分配完地址就可以开始上网了,打开浏览器,访问baidu.com, 由于域名只是方便人类记忆的字符串,电脑是不知道该域名绑定的ip地址是多少的,所以需要通过域名找到绑定的ip,这个工作是dns服务负责的。电脑需求发起dns请求,请求如下:
应用层:dns协议,baidu.com的IP是多少?
传输层:UDP协议,[目标端口:53, 源端口:9527],这里源端口一般就是电脑空闲的端口,dns服务默认用的是53端口。
网络层:IP 【源:192.168.1.3,目标:192.168.1.1】,目标IP是电脑配置的DNS服务器,也就是路由器的IP地址
网络接口层:mac地址【源:CCCCCCCC, 目标:BBBBBBBB] 由于不知道目标mac地址,所以会先发送一个ARP(Address Resolution Protocol地址解析协议)广播请求(我是192.168.1.3,谁是168.168.1.1,mac目标地址是广播地址FFFFFFFF),来到交换机发现是广播地址,会转发给所有接口,其他电脑接收后发现不是自己,就会忽略这请求,但是会把ARP请求相关ip信息存下来,知道了192.168.1.3是CCCCCCCC,存入ARP缓存表,下次要发送给这台电脑就不需要走ARP请求了,此时ARP请求来到路由器,此时发现是找自己的,会发送回应请求(带上自己的mac地址BBBBBBBB),交换机接收到请求通过mac地址知道是发给lan1端口的电脑,电脑接收到路由器的mac地址并且存到ARP缓存表,以便下次请求获取,获取到dns的目标mac地址后,就可以发起dns请求了。
dns请求来到交换机,看到目标mac地址是指向路由器(lan0)的,则发送给路由器处理。路由器解封装确定是发给自己后,然后就转发给兼听监听53端口的dns服务,dns服务本身也不知道baidu.com的ip地址,会发给他的上游dns服务器是,上游是通过pppoe拨号获取到运营商分配的dns服务器,于是路由器会找到该dns服务器获取百度的ip地址,接收到dns响应后路由器会把ip信息缓存一段时间,也称为dns缓存,之后路由器创建一个回复请求告诉电脑。
请求如下:
应用层:dns,百度IP为6.6.6.6
传输层:UDP协议,源端口:53,目标端口:9527
网络层:IP,源IP:192.168.1.1,目标IP:192.168.1.3
网络接口层:mac地址,源:BBBBBBBB, 目标:CCCCCCCC
电脑1接收到请求后就知道了IP地址,也会存入dns缓存,下次就不用再请求dns服务器了。此时浏览器知道IP后发起一个http请求,由于电脑配置的ip地址是局域网,不和百度ip处在同一个网段,需要路由器网关帮我们转发,所以还需要发起一个请求让路由器帮忙进行转发。
请求如下:
应用层:HTTP,baidu.com首页
传输层:UDP协议,源端口:9527,目标端口:80
网络层:IP,源IP:192.168.1.3,目标IP:6.6.6.6
网络接口层:mac地址,源:CCCCCCCC, 目标:BBBBBBBB
这里由于之前的操作,交换机都知道mac地址对应哪个设备了,可以直接发到路由器,路由器接收后解析发现目标mac地址是自己,但是目标ip不是自己,如果换做其他设备会直接丢弃这请求,但是路由器不一样,路由器会帮忙转发数据包,发现目标ip是公网IP,转发给wan口,准备发送到互联网,但是路由器发现源ip是192.168.1.3,是只能在局域网内部使用的ip地址,无法在公网上进行路由,所以路由器需要做一件事,就是nat网络地址转换,将源ip地址192.168.1.3改成wan口的公网地址2.2.2.2, 这里会做一个nat映射表,源ip和源端口都替换成wan口的ip和端口,如:
| 原IP | 原端口 | 映射IP | 映射端口 |
|---|---|---|---|
| 192.168.1.3 | 9527 | 2.2.2.2 | 4134 |
这样就可以在互联网进行路由了,经过十几个路由设备的转发,最终到达百度服务器,百度服务器处理后会返回数据给路由器,路由器接收后发现4134端口,再去nat映射表中发现9527端口,会进行nat转换,转换成原来ip和端口并且发送回给电脑1,这样电脑1就能正常访问百度浏览器了。