MAC头与IP头
MAC头
- 目标 MAC 地址
- 源 MAC 地址
- 协议类型:说明里面是 IP 协议
IP头
详情可参见 IP数据报格式详解
- 版本号:占用4位二进制数,表示该IP数据报使用的IP协议版本。目前Internet中使用的主要是TCP/IP协议族中版本号为4的IP协议。
- 首部长度:占用4位二进制位,此域指出整个报头的长度(包括选项),该长度是以32位二进制数为一个计数单位的,接收端通过此域可以计算出报头在何处结束及从何处开始读数据。普通IP数据报(没有任何选项)该字段的值是5(即20个字节的长度)。
- 服务类型(TOS、type of service):占用8位二进制位,用于规定本数据报的处理方式。
- 总长度:占用16位二进制位,总长度字段是指整个IP数据报的长度(报头区+数据区),以字节为单位。
- 生存时间(TTL,time to live):占用8位二进制位,它指定了数据报可以在网络中传输的最长时间。实际应用中把生存时间字段设置成了数据报可以经过的最大路由器数。
- 上层协议标识:占用8位二进制位,IP协议可以承载各种上层协议,目标端根据协议标识就可以把收到的IP数据报送到TCP或UDP等处理此报文的上层协议了。
- 首部校验和:占用16位二进制数,用于协议头数据有效性的校验,可以保证IP报头区在传输时的正确性和完整性。头部检验和字段是根据IP协议头计算出的检验和,它不对头部后面的数据进行计算。
- 源IP地址:占用32位二进制数,表示发送端IP地址。
- 目标IP地址:占用32位二进制数,表述目的端IP地址。
如何访问另一个IP地址:
在任何一台机器上,当要访问另一个 IP 地址的时候,都会先判断,这个目标 IP 地址,和当前机器的 IP 地址,是否在同一个网段。怎么判断同一个网段呢?需要 CIDR 和子网掩码。
- 如果是同一个网段:
没网关什么事情,直接将源地址和目标地址放入 IP 头中,然后通过 ARP 获得 MAC 地
址,将源 MAC 和目的 MAC 放入 MAC 头中,发出去就可以了。 - 如果不是同一网段:
这就需要发往默认网关 Gateway。Gateway 的地址一定是和源 IP 地址是一个网段的。往往不是第一个,就是第二个。
如何发往默认网关呢?网关和源 IP 地址是一个网段,这个过程就和发往同一个网段的其他机器是一样的:将源地址和目标 IP 地址放入 IP 头中,通过 ARP 获得网关的 MAC 地址,将源 MAC 和网关的 MAC 放入 MAC 头中,发送出去。网关所在的端口,例如 192.168.1.1/24 将网络包收进来,然后接下来怎么做,就完全看网关的了。
什么是网关?
网关往往是一个路由,是一个三层转发设备。什么是三层转发设备? 就是把 MAC 头和 IP 头都取下来,然后根据里面的内容,看看接下来把包往哪里转发的设备。
很多情况下,人们把网关就叫作路由器。其实不完全准确,而另一种比喻更加恰当:路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关。任何一个想发往其他局域网的包,都会到达其中一只手,被拿进来,拿下 MAC 头和 IP 头,看看,根据自己的路由算法,选择另一只手,加上 IP 头和 MAC 头,然后扔出去。
该选择哪一只手?IP 头和 MAC 头加什么内容,哪些变、哪些不变呢?大致可以分为两类,一个是静态路由,一个是动态路由。动态路由下一节详细地讲。
静态路由
静态路由,其实就是在路由器上,配置一条一条规则。每当要选择从哪只手抛出去的时候,就一条一条的匹配规则,找到符合的规则,就按规则中设置的那样,从某个口抛出去,找下一跳 IPX
"欧洲十国游"型与"玄奘西行"型
对于 IP 头和 MAC 头哪些变、哪些不变的问题,可以分两种类型。把它们称为“欧洲十国游”型和“玄奘西行”型。两者主要的区别在于 IP地址是否改变。不改变 IP 地址的网关,我们称为转发网关;改变 IP 地址的网关,我们称为NAT 网关。
"欧洲十国游"型:IP 地址不变,路过的都是转发网关。
"玄奘西行"型:IP 地址改变了,要路过NAT 网关。
MAC 地址是一个局域网内才有效的地址。因而,MAC 地址只要过网关,就必定会改变。
"欧洲十国游"型
服务器 A 要访问服务器 B:
服务器A->路由器A
- 服务器 A 会思考,192.168.4.101 和我不是一个网段的,因而需要先发给网关
- 网关IP已静态配置好了,是 192.168.1.1。发送 ARP 获取网关的 MAC 地址,然后发送包。
包的内容是:
- 源 MAC:服务器 A 的 MAC
- 目标 MAC:192.168.1.1 这个网口的 MAC
- 源 IP:192.168.1.101
- 目标 IP:192.168.4.101
路由器A->路由器B
包到达 192.168.1.1 这个网口,发现 MAC 一致,路由器A将包收进来,开始思考往哪里转发。
路由器 A 中配置了静态路由之后,要想访问 192.168.4.0/24,要从 192.168.56.1 这个口出去,下一跳为 192.168.56.2路由器B。
路由器B192.168.56.2的 MAC 地址是多少呢?路由器 A 发送 ARP 获取 192.168.56.2 的 MAC 地址,然后发送包。
包的内容是这样的:
- 源 MAC:192.168.56.1 的 MAC 地址
- 目标 MAC:192.168.56.2 的 MAC 地址
- 源 IP:192.168.1.101
- 目标 IP:192.168.4.101
路由器B->服务器B
包到达 192.168.56.2 这个网口路由器B,发现 MAC 一致,将包收进来,开始思考往哪里转发。
路由器 B 中配置了静态路由,要想访问 192.168.4.0/24,要从 192.168.4.1 这个口出去,没有下一跳了。因为我右手这个网卡,就是这个网段的,我是最后一跳了。
192.168.4.101 的 MAC 地址是多少呢?路由器 B 发送 ARP 获取 192.168.4.101 的 MAC 地址,然后发送包。
包的内容是这样的:
- 源 MAC:192.168.4.1 的 MAC 地址
- 目标 MAC:192.168.4.101 的 MAC 地址
- 源 IP:192.168.1.101
- 目标 IP:192.168.4.101
包到达服务器 B,MAC 地址匹配,将包收进来。
之所以将这种模式比喻称为欧洲十国游,是因为在整个过程中,IP 头里面的地址都是不变的。IP 地址在三个局域网都可见,在三个局域网之间的网段都不会冲突。在三个网段之间传输包,IP 头不改变。这就像在欧洲各国之间旅游,一个签证就能搞定。
"玄奘西行"型
局域网之间没有商量过,各定各的网段,因而 IP 段冲突了。最左面看成大唐的地址是 192.168.1.101,最右面看成印度的地址也是192.168.1.101,如果单从 IP 地址上看,简直是自己访问自己,其实是大唐的 192.168.1.101 要访问印度的 192.168.1.101。
既然局域网之间没有商量过,你们各管各的,那到国际上,也即中间的局域网里面,就需要使用另外的地址。就像出国,不能用咱们自己的身份证,而要改用护照一样,玄奘西游也要拿着专门取经的通关文牒,而不能用自己国家的身份证。同理自己和邻居家同样都有192.168.XX.XX网段,但是通过家用路由器到了外网,就会使用到运营商给我们分配的IP。
目标服务器 B 在国际上要有一个国际的身份,我们给它一个 192.168.56.2。在网关 B 上,我们记下来,国际身份 192.168.56.2 对应国内身份192.168.1.101。凡是要访问 192.168.56.2,都转成 192.168.1.101。
服务器A->路由器A
- 源服务器 A 要访问目标服务器 B,要指定的目标地址为 192.168.56.2。这是它的国际身份。 192.168.56.2 和服务器 A不是一个网段的,因而需要发给网关。
- 网关是谁?已经静态配置好了,网关是 192.168.1.1,网关的 MAC 地址是多少?发送 ARP 获取网关的 MAC 地址,然后发送包。
包的内容是这样的:
- 源 MAC:服务器 A 的 MAC
- 目标 MAC:192.168.1.1 这个网口的 MAC
- 源 IP:192.168.1.101
- 目标 IP:192.168.56.2
路由器A->路由器B
包到达 192.168.1.1 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。
路由器 A 中配置了静态路由:要想访问 192.168.56.2/24,要从 192.168.56.1 这个口出去,没有下一跳了,因为我右手这个网卡,就是这个网段的,我是最后一跳了。那 192.168.56.2 的 MAC 地址是多少呢?路由器 A 发送 ARP 获取 192.168.56.2 的 MAC 地址。
当网络包发送到中间的局域网的时候,服务器 A 也需要有个国际身份,因而在国际上,源 IP 地址也不能用 192.168.1.101,需要改成 192.168.56.1。
包的内容是这样的:
- 源 MAC:192.168.56.1 的 MAC 地址
- 目标 MAC:192.168.56.2 的 MAC 地址
- 源 IP:192.168.56.1
- 目标 IP:192.168.56.2
路由器B->服务器B
包到达 192.168.56.2 这个网口,发现 MAC 一致,将包收进来,开始思考往哪里转发。
路由器 B 是一个 NAT 网关,它上面配置了,要访问国际身份 192.168.56.2 对应国内身份 192.168.1.101,于是改为访问 192.168.1.101。
路由器 B 中配置了静态路由:要想访问 192.168.1.0/24,要从 192.168.1.1 这个口出去,没有下一跳了,因为我右手这个网卡,就是这个网段的,我是最后一跳了。
那 192.168.1.101 的 MAC 地址是多少呢?路由器 B 发送 ARP 获取 192.168.1.101 的 MAC 地址,然后发送包。
内容是这样的:
- 源 MAC:192.168.1.1 的 MAC 地址
- 目标 MAC:192.168.1.101 的 MAC 地址
- 源 IP:192.168.56.1
- 目标 IP:192.168.1.101
包到达服务器 B,MAC 地址匹配,将包收进来。
从服务器 B 接收的包可以看出,源 IP 为服务器 A 的国际身份,因而发送返回包的时候,也发给这个国际身份,由路由器 A 做 NAT,转换为国内身份。
从这个过程可以看出,IP 地址也会变。这个过程用英文说就是Network Address Translation,简称NAT。
NAT 与 NAPT 可参见:NAT(地址转换技术)详解
参考资料:
趣谈网络协议(极客时间)链接:
http://gk.link/a/106nW
NAT(地址转换技术)详解:
https://blog.csdn.net/gui951753/article/details/79593307
GitHub链接:
https://github.com/lichangke/LeetCode
知乎个人首页:
https://www.zhihu.com/people/lichangke/
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习