最近有幸做了几场面试官,基本都会问一下候选人关于主机通信的知识,但基本都答的不好,现在写写我自己的理解。
基础
IP地址:32bit,类似于1.2.3.4
mac地址(网卡地址):48bit,类似于ff:ff:ff:ff:ff:ff
局域网通信
以太网是一种局域网通信协议,主要特点是带冲突检测的载波侦听多路访问(CSMA/CD),即有所谓的退避算法。同时,它是以mac地址用于通信的基础。
以主机A(192.168.0.100)向主机B(192.168.0.101)发送数据为例:
- 主机A会查询本地mac地址-ip地址的缓存表中是否有
192.168.0.101
的记录 - 若没有,则主机A会向本局域网发送广播,IP地址为
192.168.0.101
,mac地址为ff:ff:ff:ff:ff:ff
,即向局域网内询问192.168.0.101
的mac地址是多少? - 局域网内的主机并不响应这个广播包,只有主机B收到广播包后,回复一个单播包
192.168.0.101
的mac地址为01:02:03:04:05:06
- 主机A收到回复包后,更新自己的本地mac地址-ip地址的缓存表,并开始向mac地址为
01:02:03:04:05:06
开始发送数据
以上这个简单的例子就是ARP协议
网络通信
讲到网络通信,就必须讲到路由的报文转发了。局域网内的流量只是网络的最后一公里的问题,而更广大的是广域网通信。每个局域网通过路由器连接成一个网,通过路由转发实现局域网A与局域网B的通信
报文转发
路由器将从接口A中接收的报文从接口B中转发出去,这里的关键操作是如何将协议组织好。
- 将数据链路层的帧头和帧尾移除,解析出IP报文。
- 检查IP报文的目的IP地址,在路由表中查找最佳路由。
- 如果路由器找到匹配下一跳,则将IP报文封装到新的数据链路帧中,并将帧转发到输出接口B中,否则路由器会将报文发给自己的默认路由
以主机A(192.168.0.10)向主机B(192.168.4.30)发送数据为例:
- 主机A首先判断目的地址
192.168.4.30
是否在自己的局域网内(子网掩码后判断网络地址是否一致),若一致,则与局域网通信一致 - 若不一致,则将报文转发至自己的默认路由
192.168.0.1
,如何转发至192.168.0.1
与局域网通信一致 - 路由器R1收到报文后,拆开数据帧后得到目的IP为
192.168.4.30
,查看自己的路由表,发现其需要从另外一个出口中转发,目的地址为192.168.2.10
,因此构造srcIP=192.168.0.10, srcMac=aa:02,dstIP=192.168.4.30,dstMac=bb:01,
的数据帧转发至路由器R2 - 路由器R2收到报文后,查看路由表,发现需要从
192.168.4.1
的出口转发,而192.168.4.1
与192.168.4.30
位与同一个局域网中,因此,直接局域网通信转发报文给主机B - 主机B收到报文后,发现目的mac地址与自己一致,并解开目的IP地址也与自己一致,则将ip报文交由上层处理
总结
上述只是简单将主机通信的过程描述了一遍,其中的一些细节(IP地址,网络地址,子网掩码,路由表构成)并没有深究,大家感兴趣可以自行研究。