查看原文
其他

新手必读的家庭网络通信流程(篇二)-网址访问的神秘历程

小白学智能 小白学智能 2024-03-08

上节,各位小伙伴已经了解了局域网内设备获取IP地址的过程


今天,我们便来介绍一下在上网过程中,我们完成对一个网址的访问,这个过程所包括的具体内容


内容有点多,瓜子、板凳、笔记本准备好后我们就正式开始啦




续接上文

除了通过DHCP自动获取IP地址外,我们也可以在电脑上手动设置IP,此时,你需要知道家中局域网的网段信息。比如路由器的IP地址是192.168.1.1,那么你的设备IP就要处于192.168.1.2~192.168.1.254之间,同时要注意避免与其他设备的IP地址发生冲突。子网掩码默认255.255.255.0,默认网关便是192.168.1.1。


这样便不需要通过DHCP分配,且能保证IP地址保持不变。当然也可以通过静态IP地址分配来进行设备的IP地址固定,路由器一般都有这个功能。



电脑有了IP之后,便可以开始上网了。


以访问百度为例,当我们在浏览器的地址栏中输入baidu.com,并按下回车键后。浏览器拿到了baidu.com这个域名,但计算机之间的通信需要用到IP地址,而这个域名是为了我们方便记忆的一串字符,这串字符绑定了百度的IP地址。


所以我们需要通过这个域名来找到百度的IP。负责获取域名对应的IP地址是一个叫做DNS的服务来提供。


首先浏览器会发起一条DNS请求,内容是获取baidu.com的IP地址。


接着数据包来到传输层,源端口是浏览器随便选的一个空闲端口,假设为9527,DNS服务默认使用UDP的53号端口,所以目标端口是53,传输方式是UDP。


接着来到网络层,源IP就是电脑的本机IP:192.168.1.3,目标IP是电脑配置的DNS服务器,也就是路由器的IP地址。


数据来到网络接口层,源MAC地址是电脑网卡的MAC地址,数据要发给路由器,所以目标MAC是路由器LAN口的MAC地址,但此时电脑并不知道路由器的MAC地址,所以会先发送一个叫做ARP的广播请求,其内容大致是这样的:我是192.168.1.3,谁是192.168.1.1,源MAC地址是电脑的MAC地址,目标MAC是FF:FF:FF:FF:FF:FF,也就是广播MAC地址



接下来,数据来到交换机,交换机看到目标MAC为FF:FF:FF:FF:FF:FF的广播地址,于是转发给所有接口。


此时在交换机上对应接口的设备都会收到这个数据包,如路由器和另外一台电脑。

● 局域网内的另一台电脑接受了这个广播数据,但发现他要找的是192.168.1.1,而这台电脑的IP地址是192.168.1.2,不是找这台电脑的,因此这台电脑会把这个数据包丢弃,不作回应。

不过这台电脑从这条ARP广播中得知192.168.1.3的MAC地址是CC:CC:CC:CC:CC:CC,其会在自己的ARP缓存列表中保存一段时间,当这台电脑想要和192.168.1.3通信的时候,就可以直接在缓存列表中找到对方的MAC地址,这个过程不需要发送ARP广播询问。

● 当路由器收到这个数据包时,发现是找自己的,于是会给电脑一个回应,即我是192.168.1.1,MAC地址是BB:BB:BB:BB:BB:BB,数据包的源MAC就是路由器的BB:BB:BB:BB:BB:BB,目标MAC是目标电脑的MAC地址CC:CC:CC:CC:CC:CC,并且同样会将电脑的MAC地址记录到自己的ARP缓存列表。



数据返回来到交换机,交换机查看目标MAC在接口1上,于是将数据发给了接口1,目标电脑将会收到这个数据包,这样就成功获取到了路由器的MAC地址。



于是在这个数据包里填入的目标MAC为路由器的BB:BB:BB:BB:BB:BB,并且同样将路由器的MAC地址在自己的ARP缓存中保存一段时间。


由电脑发出的数据包来到交换机,看到目标MAC地址挂在接口0上,于是数据包被转发给了路由器,路由器收到数据后会一层一层解封装。


首先路由器确认了目标MAC是自己,并且确认了目标IP是自己。



然后将数据转发给监听了UDP53号端口的DNS服务,路由器的DNS服务收到数据后,它自己本身并不知道baidu.com的IP地址,因此便会发给它的上游DNS服务器获取百度的IP地址,上游是通过PPPoE拨号获取到运营商分配的DNS服务器,于是路由器会找该DNS服务器获取百度的IP地址。


从这个接口出去后就是公网了



此时路由器会收到上游的DNS响应,里面会有百度的IP地址,路由器会将其保存到DNS缓存一段时间。



在此时间段内,局域网其他设备再找路由器要百度的IP地址就会直接从缓存里获取。


之后路由器会给发送获取百度IP请求的电脑创建一个DNS回复,源端口是DNS的53号端口,目标端口是对方发过来的9527端口,使用UDP传输。源IP是路由器的LAN口IP,目标IP是电脑IP,源MAC是路由器LAN口的MAC,目标MAC是电脑的MAC,然后从网口发出。


此时交换机会根据目标MAC将其转发至接口1。


电脑收到数据包之后会一层一层解封装,发现目标MAC和目标IP都是自己,于是接受这个数据包。并且将结果返回给了9527端口,这个端口是浏览器开启的,于是浏览器会收到这个DNS响应,此时就获取到了百度的IP地址。


此时DNS也会被缓存在电脑中,当电脑下次需要访问百度时便不需要找DNS服务器获取了。具体缓存的时间要看TTL的时间是多少秒,TTL到期后便会从缓存列表中将其删除。当电脑需要获取百度IP地址的时候便需要重新找DNS服务器获取。


拿到百度的IP之后,浏览器会像这个IP地址发起一条HTTP请求,获取baidu.com的首页内容。


数据来到传输层,源端口是浏览器开的随机端口,假设为9527,HTTP协议规定默认端口是80,默认传输方式是TCP,所以目标端口是80,使用TCP传输。


来到网络层,源IP是电脑的IP,目标IP是百度服务器的IP。此时电脑通过子网掩码算出目标IP和自己不在同一网段。


当前电脑配置的IP为192.168.1.3,这是点分十进制的表示方式,转换为二进制是32个比特位,即11000000.10101000.00000001.00000011;子网掩码是255.255.255.0,转换为二进制就是11111111.11111111.11111111.00000000,子网掩码和IP地址是一一对应的关系。


子网掩码前面24个比特位都是1,表示IP地址的前24个比特是网络部分,也就是网段,剩下的8个比特是主机部分。


将IP地址的前24个比特位转换为十进制,也就是192.168.1,可知该电脑所在的网段,当然,也可以使用192.168.1.3/24的表示方法,其中/24表示网络部分的长度为24个比特,这种叫做CIDR表示法(无类别域间路由)



假设要访问的目标IP是192.168.1.2,将其转换为二进制,11000000.10101000.00000001.00000010,可以知道前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(网络地址转换)


这个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端口,而这个端口正是浏览器开启的,浏览器收到百度的数据后,通过渲染将网页呈现在我们面前,至此一个简单的访问百度请求就算是完成了。


从头看到尾,此时屏幕前的你是不是有一些“一头雾水”的感觉?


文字有些多,看似很复杂,实际的网络环境可能比文中的文字介绍过程还要复杂......


为了不让小伙伴们“抓耳挠腮”,本小之分成两节来进行介绍


各位小伙伴们可以收藏起来,时常翻看一下,每一次的翻看,或许会有新的收获。



图片来源:互联网



...

不见不散





继续滑动看下一个

新手必读的家庭网络通信流程(篇二)-网址访问的神秘历程

小白学智能 小白学智能
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存