程序员社区

一条报文的使命

两台主机之间的通信是通过报文承载信息的,一条报文从发送到接收的过程,即是网络通信的过程

网络通信的过程

在互联网世界中,主机何止千千万,如何区分它们?如果你学过计算机网络,肯定知道是用ip地址来识别每一台主机。当然,一台主机的ip地址可能有多个

假设一台主机ip为1.1.1.1,需要给ip地址为3.3.3.3的主机发消息,电脑首先会做什么?

电脑,准确的说是电脑系统,首先会判断:目的ip地址3.3.3.3是否是自己的ip(前面有说过,主机可能有多个ip)

是自己的ip

那么这条消息根本不会离开这台电脑,它都不会经过相关的网卡,而是在自己的tcp/ip协议栈走一遍,交给相应的程序处理,这就是同一台主机的两个程序之间通信会做的事

不是自己的ip

那么电脑还要判断目的ip是否和自己在同一个局域网内,即同一个广播域,如何判断?用自己的ip地址1.1.1.1和自己的子网掩码做“与”操作,得到自己的网络地址,再用目的ip地址3.3.3.3和自己的子网掩码做“与”操作,再得到一个网络地址,然后把两个网络地址做比较,相同即是同一个局域网,不同即是不同的局域网

它们处于同一个局域网

就把这条消息从tcp/ip协议栈层层下压,封装成完整的报文,直到从网卡发出去。由于电脑可能配置多块网卡,怎么知道从哪个网络接口发出?答案是:查找路由表。路由表的作用就是根据目的ip地址,选择正确的路径,从正确的网络接口收发数据帧

这样就能把报文从网卡发出吗?当然不行。网卡一看有报文要发出,就会发问:你有对方的mac地址吗?

  • 如果电脑之前有过和对方通信的情况,记录了对方的mac地址,此时只要填充mac地址,就可以从网卡发出

  • 如果电脑里查不到对方的mac地址,就需要询问对方,怎么办?发一个arp广播请求给局域网内的所有主机,只有目的ip为3.3.3.3的主机收到才会回复arp响应,告诉电脑自己的mac地址,电脑收到arp响应,提取了对方的mac地址,封装到报文里,可以从网卡发出

如果它们处于不同的局域网

是否也可以通过发送arp广播请求,询问对方的mac地址呢?答案是不可以。不同的局域网之间是通过路由器相连,实现互相通信的。而arp广播请求是一条广播报文,它只能在一个广播域中传播,到了路由器时会被丢弃的,路由器的其中一个作用就是隔绝广播域

无法直接发送给另一个局域网的主机,但是可以发给路由器啊。路由器是现实不同局域网可以相互通信的网关,电脑把报文发给路由器,由路由器转发处理不就可以了嘛!perfect!

电脑如何知道路由器的ip地址呢?再回想一下,电脑发现目的ip是不同局域网的ip地址,需要选择通过路由器这条路把报文发出去,选择路径这种事,交给谁?交给路由表啊!电脑根据目的ip地址,在路由表上查看到符合的路径只有去路由器这条路,而且上面还有路由器接口的ip地址1.1.1.0,那就好办了,电脑立刻打算发arp广播请求出去,询问路由器的mac地址。等等,这里有个疑问,arp广播请求不是只能在同一个广播域传播吗?那路由器接口的ip地址是同一广播域吗?这个是肯定啦,不用怀疑的

好了,知道了路由器的mac地址,就可以把报文发给路由器啦。至于剩下的,就交给路由器处理吧


赞(0) 打赏
未经允许不得转载:IDEA激活码 » 一条报文的使命

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区