视频教程

youtube播放地址:https://youtu.be/P38FmPAq09E

专线机场推荐:https://b.880805.xyz
GIA线路VPS推荐:https://bwg.880805.xyz

视频文稿(忽略)

当我们在浏览器的地址栏输入baidu.com,回车之后,百度的首页内容即刻呈现在我们眼前,,这短短不到一秒的时间里究竟发生了什么?今天让我们用一个视频来讲清楚,我敢保证这将是你看过的全网最详细家庭网络通识教程,让你看完就忍不住想上隔壁村村花小美家修网络了

先来创建一个最常见的家庭网络环境,你在运营商拉了一条宽带,他会给你分配一个光猫,一般来讲你会单独再买一台路由器,使用网线将路由器的WAN口与光猫相连,通常情况下颜色不一样的接口就是路由器的WAN口,路由器通过pppoe拨号获取运营商分配的公网IP,假设为2.2.2.2,当然也可能是光猫负责拨号,这种情况下路由器获取到的是光猫分配的内网ip,比如192.168.0.2,总之不管怎样,你的路由器WAN口会获取到一个ip,除了wan口,路由器还有多个颜色一样的LAN口,为了让大家思路清晰,我们需要单独提取出这4个lan口,把它当作一台交换机,并且和路由器这个虚拟的网口建立了连接,路由器连接交换机的这个网口有一个ip地址,假设为192.168.1.1,这个是路由器的内网IP,访问这个ip可以进入路由器的管理界面,同时也是你家里整个局域网的网关ip,你家里所有的网络设备都会通过网线或者wifi的方式连接到这台交换机,,这是大部分家庭的网络拓扑,装宽带的师傅会帮你配置好,确保你能正常上网,然后他就能交差走人了,接下来我们就来研究一下为什么这样设置之后就能正常上网了。

此时我有另一台电脑要连接到当前网络,假设该电脑设置获取ip的方式为自动获取,当我怼上网线之后,一个叫做dhcp的应用层协议就会开始工作,dhcp全称Dynamic Host Configuration Protocol,译为动态主机配置协议,顾名思义就是用来动态获取ip地址的,电脑的dhcp客户端会发起一个dhcp请求,找dhcp服务器获取ip地址,这个请求会被一层层的封装,以tcpip4层网络模型为例,每一层都有其特定的任务,数据来到传输层,传输层会指定这个dhcp请求通过什么传输协议发往什么端口,dhcp规定,客户端默认使用68号udp端口,服务端默认使用67号udp端口,也就是请求会使用UDP的68号端口发往UDP的67号端口,所以源端口是68,目标端口是67,使用udp的方式传输,这些都是规定好的,不需要深究,接着数据来到网络层,网络层需要确定数据包发给哪台网络设备,也就是负责封装ip地址,电脑现在目的是找dhcp服务器要ip地址,但他不知道现在谁是dhcp服务器,不知道该发给谁,所以干脆一不做二不休,直接发给这个网络里的所有设备,所以目标ip是一个广播ip:255.255.255.255,同时接收方也需要知道是谁发给他的数据,所以还需要加上源ip,但是电脑现在还没有ip,于是会直接使用0.0.0.0这个未指定的ip,接着数据会继续向下来到网络接口层,这一层会封装mac地址,每个网卡都有唯一的mac地址,也叫物理地址,源mac是你电脑网卡的mac地址,也就是为cc,同样由于不知道数据该发给谁,所以目标mac是一个全f的广播mac地址,然后这个经过层层封装的数据会从电脑的网卡接口发出,顺着网线来到了交换机的1号接口,普通的家用交换机是一种只能解析网络接口层数据的设备,也就是说他只能看到mac地址,里面的ip和端口等对他来说就是一堆无规则的数据,他看不懂也没必要看懂,交换机内部有个mac地址映射表,他会根据mac地址进行数据转发,至于你转发什么内容他并不关心,交换机从接口1收到数据后,会将接口1对应的mac地址保存到映射表中,然后查看目标mac,发现是全f的广播mac地址,于是交换机会将电脑的数据给每个连接的接口发送一份,当这台电脑收到数据包的时候,会根据网络模型一层一层的解封装,首先网络接口层会查看目标mac是不是发给自己的,发现是全f,虽然不是自己的mac地址,但这是一个广播mac地址,所以会接受它,继续向上来到网络层,查看目标ip是全255,虽然不是自己的ip地址,但这是一个广播ip地址,广播就类似学校的广播,当广播里说全体注意的时候,你肯定要听广播里讲啥,所以电脑为了看里面的内容也会接受这个数据包,来到传输层,发现是通过udp的方式发给67号端口,由于这台电脑没有运行dhcp服务,所以并没有监听67号端口,于是会将这个数据包丢弃

同样的数据来到路由器,一般的家用路由器会提供很多服务,比如dhcp、dns、ddns、qos、upnp、dmz、端口转发、防火墙等等,接口层会接受这个目标mac是全f的广播,同样网络层会接受这个目标ip是全255的广播,向上来到传输层,发现目标端口是udp的67,一般情况下路由器默认就开启了dhcp服务,而dhcp服务默认的监听端口就是udp的67,于是这个数据包将会交给dhcp服务,dhcp服务收到数据后,将会从自己的地址池中选择一个未被占用的ip地址,假设为192.168.1.3,除了ip地址,还会包含子网掩码、网关、dns服务器、租约等信息,假设租约为12个小时,然后重新封装数据包,源端口是本机的dhcp服务67端口,目标端口是对方发过来的端口,也就是68,并且通过udp传输,网络层封装源ip地址为路由器自己的ip,也就是192.168.1.1,由于对方没有IP,所以目标ip还是全255的广播ip,来到网络接口层,源mac是路由器lan口的mac地址,路由器从刚才电脑发过来的数据包中已经知道了电脑的mac地址,所以目标mac是电脑的mac地址,数据来到交换机,刚才说过交换机只能解析mac地址,当他看到目标mac是cc的时候,会查看自己的mac地址映射表,发现cc插在接口1上,于是会将这个数据包从接口1发送出去,电脑收到数据后,会一层层的解封装,接口层发现目标mac是自己,于是接受该数据,网络层发现目标ip是广播ip,同样也接受了,传输层发现是发往udp的68号端口,而dhcp客户端监听了该端口,于是数据将会由dhcp应用程序处理,dhcp会拿着这些信息给电脑进行相关配置,于是乎我们电脑就有了ip地址、网关、dns等信息了

并且在6个小时之后,也就是租约的二分之一,会再次发送dhcp请求续约ip地址,续约成功的话租期将会再次变成12小时,如果dhcp服务器没有回应的话,会在时间剩余四分之一、八分之一再尝试发送续约请求,如果续约成功将会再次变成12小时,如果失败了,说明路由器提供的dhcp服务挂了,等到租约到期后将会自动释放ip,然后重新发起dhcp获取ip的广播请求,但是由于局域网内唯一的dhcp服务器挂了,所以电脑永远也得不到dhcp回应,当尝试多次都没有收到回复之后,dhcp客户端会给电脑自动分配一个全球统一的网段ip,地址为169.254.xxx.xxx,确保和局域网的其他设备还能正常通信,所以当你发现电脑获取到了169.254的ip,说明你家的局域网中没有提供dhcp服务的设备,建议检查网络,除了一台都没有的情况,还有可能配置不当导致存在多台dhcp服务器的情况,这也会出现网络问题,大家可以自行搜索了解dhcp攻击,如果电脑关机了没有再发送续约请求,租约到期后,路由器的dhcp服务就会释放这个ip,重新放回地址池,再分配给其他有需要的人,所以像机场或者商场之类的公共场所wifi设置的dhcp租期都会比较短,一般十来分钟,确保你人走后ip能够尽快的释放出来给别人用,防止地址池被占满,家庭的话就可以设置的久一点,一般默认是720分钟,也就是12小时,这就是dhcp的整个执行流程,是局域网中比较关键的服务。

我这里虽然讲的很详细,但为了便于理解还是简化了dhcp的通信流程,实际上要更复杂,本教程并不是什么严谨的权威教程,而是希望普通用户也能看懂的通识教程,包括之后的讲解我也会精简一些对整体理解没啥影响的流程,防止视频过于冗长繁琐

除了通过dhcp自动获取ip地址,你也可以在设置中手动配置ip,手动配置的时候你需要提前知道你家里的局域网是在哪个网段,比如路由器的ip是192.168.1.1,那么你的ip就要在192.168.1.2-192.168.1.254中间随便设置一个,注意要避免ip地址和其他设备冲突,比如192.168.1.3,子网掩码默认为255.255.255.0,子网掩码有点不太好理解,等会我们用到了再讲,网关和dns一般设置为路由器的ip地址,这样就不需要通过dhcp分配,能确保ip地址固定不变,当然dhcp也可以通过绑定mac地址实现每次都给电脑分配同样的ip,路由器一般都有这个功能,叫做DHCP静态IP分配

电脑有了ip之后,就可以开始上网了,以访问百度为例,当我在浏览器的地址栏输入baidu.com并按下回车键时,浏览器拿到了baidu.com这个域名,但是计算机之间的通信需要使用ip地址,而这个域名只是为了方便我们人类记忆的一串字符,不过这串字符绑定了百度的ip地址,所以我们需要通过这个域名找到百度的ip,负责获取域名对应的ip是一个叫做dns的服务提供的,首先浏览器会发起一条dns请求,内容是获取baidu.com的ip地址,接着数据包来到传输层,源端口是浏览器随便选的一个空闲端口,假设为9527,dns默认使用udp的53号端口,所以目标端口是53,传输协议是udp,接着来到网络层,源ip就是电脑的本机ip192.168.1.3,目标ip是电脑配置的dns服务器,也就是路由器的ip地址,数据来到网络接口层,源mac地址是电脑网卡的mac,数据要发给路由器,所以目标mac是路由器lan口的mac地址,但此时电脑并不知道路由器的mac地址,所以会先发送一个叫做arp的广播请求,内容是我是192.168.1.3,谁是192.168.1.1,源mac地址是电脑的mac,目标mac是全f,也就是广播地址,数据来到交换机,交换机看到目标mac为全f的广播地址,于是转发给所有接口,这台电脑接受了这个广播数据,但是发现它要找的是192.168.1.1,而他的ip是192.168.1.2,不是找他的,于是会丢弃数据包不做回应,不过他从这个arp广播中得知了192.168.1.3的mac地址是cc,会在自己的arp缓存表里保存一段时间,当这台电脑想和192.168.1.3通信时,就可以直接在缓存中找到对方的mac地址,不需要发送arp广播询问了,而路由器收到这个数据包的时候,发现是找自己的,于是会给电脑一个回应,我是192.168.1.1,mac地址是bb,源mac就是路由器的bb,目标mac是电脑的mac,并且同样会将电脑的mac地址记录到arp缓存列表,数据包来到交换机,交换机查看目标mac在接口1上,于是将数据发给了接口1,电脑将会收到这个数据包,这样就成功获取到了路由器的mac地址,于是在这个数据包里填入目标mac为路由器的bb,并且将路由器的mac地址在arp缓存中保存一段时间,,数据包来到交换机,看到目标mac挂在接口0上,于是转发给路由器,路由器收到数据后,会一层层解封装,首先确认了目标mac是自己,并且确认了目标ip是自己,然后将数据转发给监听了UDP 53号端口的dns服务,路由器的dns服务收到数据后,会发给它的上游dns服务器获取baidu的ip地址,上游是通过pppoe拨号获取到运营商分配的dns服务器,于是路由器会找该dns服务器获取百度的ip地址,从这个接口出去就是公网了,本期的重点是讲解局域网内部,外部就不介绍了,可以进入我的youtube频道了解更多以前发布过的视频,总之路由器会收到上游的dns响应,里面会有百度的ip地址,路由器会将其保存到dns缓存一段时间,在此时间段内,局域网其他设备再找路由器要百度的ip就会直接在缓存里获取,之后路由器给电脑创建一个dns回复,原端口是dns服务的53,目标端口是对方发过来的端口9527,使用udp传输,源ip是路由器的lan口ip,目标ip是电脑的ip,源mac是路由器lan口的mac,目标mac是电脑的mac,然后从网口发出,交换机会根据目标mac将其转发到接口1,电脑收到数据包之后,会一层层的解封装,发现目标mac和目标ip都是自己,于是接受了这个数据包,并将结果返回给了9527端口,这个端口是浏览器开启的,于是浏览器会收到这个dns响应,此时就获取到了baidu的ip地址了,同样也会将dns结果缓存到电脑里,以便下次再访问百度就不需要找dns服务器获取了,具体缓存多久是看ttl时间是多少秒,ttl到期之后就会从缓存列表中删除,需要重新找dns服务器获取,拿到百度的ip之后,浏览器就会向这个ip发起一条http请求,获取baidu.com的首页内容,数据来到传输层,原端口是浏览器开的随机端口,假设为9527,http协议规定默认端口是80,默认传输方式为tcp,所以目标端口为80,使用tcp传输,来到网络层,源ip是电脑的ip,目标ip是baidu服务器的ip,此时电脑通过子网掩码算出目标ip和自己不在同一网段,当前电脑配置的ip地址为192.168.1.3,这是点分十进制的表示方式,转换为二进制是32个比特位,11000000101010000000000100000011,子网掩码是255.255.255.0,转换为二进制就是11111111111111111111111100000000,子网掩码和ip地址是一一对应的关系,子网掩码前面24个比特位都是1,表示ip地址的前24个比特是网络部分,也就是网段,剩下的8个比特是主机部分,将ip地址的前24个比特转换回10进制,也就是192.168.1,这就是当前电脑所在的网段,也可以使用192.168.1.3/24的表示方法,其中/24表示网络部分的长度为24个比特,这种叫做cidr表示法,假设要访问的目标ip是192.168.1.2,将其转换为2进制,可以看到前24个比特位都是相同的,说明和你在同一网段,如果目标ip是192.168.0.4或者192.168.2.4或者其他任何公网ip,由于前24个比特位不相同,所以不属于同一网段,电脑无法直接访问,这种情况下会将数据发给默认网关,请求网关帮忙转发,而电脑配置的网关ip是路由器的ip地址,所以数据将会发给路由器,源mac是电脑的mac,目标mac是路由器Lan口的mac,由于刚才的dns请求已经通过arp获取到了路由器的mac,并且arp缓存没有过期,所以电脑不需要再发送arp广播,可以直接在缓存中获取路由器的mac,数据包来到交换机,交换机会根据目标mac将其转发到接口0,路由器收到数据后,通过目标mac得知数据包是发给自己的,于是向上来到网络层,但发现目标ip并不是访问自己,

如果是普通的网络设备,当收到不是发给自己的数据包时会直接丢弃,但这是一台路由器,他的主要工作就是负责转发其他设备的数据包,所以并不会直接丢弃,而是会帮忙进行转发处理,另外普通的网络设备如果有权限开启ip转发功能,也可以让其帮忙转发数据,充当网关,俗称旁路由,但这样做会存在一些问题,以后再讲

路由器查看到目标ip是公网某个ip,于是将其转发到wan口,准备发送到互联网,但在发送之前,路由器发现数据包的源ip是192.168.1.3,这是一个只能在局域网内部使用的ip地址,无法在公网进行路由,所以路由器还会干一件很重要的事情,nat,也就是网络地址转换,将源ip的192.168.1.3修改为路由器wan口的公网ip地址,同时随机选择一个空闲端口替换掉源端口,假设改成4134,然后将修改前后的对应关系保存到路由器的nat映射表中,这样修改之后,数据包就能在公网上进行路由了,接着封装mac地址,源mac是路由器wan口的mac,目标mac是下一跳某个路由设备的mac,然后数据从wan口发出到互联网,大概经过十几个路由设备的转发,最终数据会到达百度服务器,百度服务器处理之后会将网页数据返回给我们,
路由器解封装到网络层时,发现百度的数据是发给自己的4134端口,而这个端口在nat映射表中,对应了192.168.1.3的9527端口,于是会进行nat转换回原来的ip和端口,然后重新封装mac地址,源mac是路由器lan口的mac,目标mac是电脑的mac,数据包来到交换机,根据mac地址将数据转发到接口1,电脑收到数据后会一层层解封装,数据将会发送到监听了tcp的9527端口,而这个端口正是浏览器开启的,浏览器收到百度的数据后,通过渲染将网页内容呈现在我们面前,至此一个简单的访问百度请求就算是完成了,看似很复杂,但实际上确实很复杂,真实网络环境要比我讲的复杂得多,即使我屏蔽了很多细节,自认为已经讲的很通俗了,但肯定也有没看懂的朋友,毕竟大家的基础不同,原谅我只能做到这个程度了,可以收藏起来偶尔翻出来看看或许有新的收获

最后修改:2024 年 01 月 02 日 06 : 19 PM