该系列文章用于记录我的TCP/IP,ARP,NAT等协议的学习过程,涉及到计网,通信,C语言开发等。如有错误,请指正。
主要方向:
- 高性能网络开发
- 高性能网络协议开发
- 高性能网关开发
本系列关键字:DPDK,VPP,大页缓存,路由转化,交换,NAT
本节关键字:网关,ARP,路由,交换转发,NAT
背景
需要使用思科的VPP模拟网关的作用,包括用户侧接口和运营商接口。使用trex模拟用户和运营商。其模型图为:
图中1,2,3,4分别代表不同的接口。考虑这样一个网络模型:
- trex的接口1模拟为一个内网,假设网段为192.168.15.0/24
- VPP的接口2模拟为上述内网的网关,假设ip地址为192.168.15.1
- VPP可以模拟为一个具有NAT网关功能的路由器,则接口3是暴露给外网的接口,假设为20.1.1.1
- trex的接口4模拟为互联网上的服务器,比如谷歌的DNS服务器8.8.8.8:53,或者百度的http服务器,假设为10.1.1.1:80,后面的:80表示应用进程的端口
接下来我们详细分析一下这几个接口之间的收发数据会发生什么。我们只考虑2到3层网络协议。
一、接口1->接口2:用户到网关
比如在接口1有一个用户u1,其ip地址为192.168.15.14,属于192.168.15.0/24网段。
当u1,即192.168.15.14/24:1025 要给 20.1.1.1:80 发送数据时,会将数据按照四层网络模型从上到下的顺序进行封装,我们将发送的数据简化为:
以太网帧头(数据链路层头部)包含的信息有:
- 源MAC:接口1的MAC
- 目的MAC:???未知
IP包头(网络层头部)包含的信息有:
- 源ip:192.168.15.14
- 目的ip:20.1.1.1
TCP/UDP段头(传输层头部)包含的信息有:
- 源端口:1025
- 目的端口:80
此时,接口1的数据包要根据以太网帧头中的源目MAC进行发送,首先经过子网掩码,判断源目ip是否在一个网段内:
- 若在一个网段内,且接口1的ARP表中有目的IP对应的MAC地址,则经过交换机直接发送,此时网络层和传输层头部没有多大作用。若ARP表中无对应项,使用ARP协议查询目的MAC。
- 若不在一个网段内,则发送到默认路由,通过ARP协议获取默认网关的MAC地址,并设置目的MAC为网关的MAC,将数据包发给本网段网关。
1、ARP地址转换协议
1.基本功能:知道目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
2.它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被 邻居发现协议(NDP) 所替代。
当源ip和目的ip处于不同的网络中时,需要使用上图中的代理ARP协议:
假设主机A和主机B是第一次通信(则主机A中的ARP表没有目的ip和对应的MAC地址)。
主机A首先在内网中广播ARP请求,请求报文中包含主机B的IP地址,并请求主机B的MAC地址,如果路由器启用了代理ARP功能,并知道主机B属于它连接的网络,那么路由器就用自己接口的MAC地址代替主机B的MAC地址来对主机A进行ARP应答。主机A接收ARP应答,但并不知道代理ARP的存在。
可以看出来这是一种ARP欺骗,主机A以为自己知道了主机B的MAC地址,但事实上这个MAC地址是路由器的。
结合上面VPP和trex架构图,接口1到接口2采用了ARP协议,因此接口1到接口2的数据报中信息为:
- 源ip:192.168.15.14(接口1的IP地址)
- 目的ip:20.1.1.1(目的IP是不会变的,变的是MAC地址)
- 源端口:1025
- 目的端口:80
- 源MAC:接口1
- 目的MAC:接口2(接口1所在网段的网关)
2、交换
什么是交换:交换是指在同一局域网内根据数据帧的目标MAC地址将数据帧从一个端口转发到另一个端口的过程。交换机是实现交换功能的网络设备(二层设备),它维护一个MAC地址表,记录了每个MAC地址所对应的端口。当交换机收到一个数据帧时,它会查找MAC地址表,确定目标MAC地址所对应的端口,然后将数据帧从该端口转发出去。
和路由器的转发不同,交换机在转发数据帧时不会更改数据帧的源MAC和目标MAC。交换机只是根据数据帧的目标MAC地址查找MAC地址表,确定目标MAC地址所对应的端口,然后将数据帧从该端口转发出去。交换机不会对数据帧的内容进行任何修改。
这意味着,当数据帧到达目标主机时,它的源MAC地址和目标MAC地址仍然是发送主机和目标主机的MAC地址。这样,目标主机就能根据目标MAC地址识别出该数据帧是发给它的,并进行相应的处理。
3、路由
什么是路由:路由是指数据包从源主机到目标主机的路径的过程。 路由器是实现路由功能的网络设备(三层设备),它维护一个路由表,根据路由表中的信息来决定如何转发数据包。路由表包含了目标网络的地址和到达目标网络的下一跳地址。路由器根据数据包的目标IP地址查找路由表,确定下一跳地址,然后将数据包转发到下一跳地址。
在接口1中,我们配置了两条路由信息:
其中第一条表示默认路由,即当数据包的目的网络地址不在路由表中时,数据包将被发送到192.168.15.1这个网关。
第二条路由信息表示直连网段,即当数据包的目的网络地址在192.168.15.0/24这个网段内时,数据包将被发送到ens192这个接口。
根据路由器学习路由信息、生成并维护路由表的方式,可以分为:
-
直连路由:路由器接口直接连接子网的路由方式。
-
静态路由:手动配置路由表项。静态路由是固定的,不会改变,即使网络状况已经改变或是重新被组态。
-
动态路由:路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化自主动态进行调整。
路由器单跳的流程:
- 收到IP报文
- 根据目的IP地址查找路由表
- 有匹配路由,查看下一跳地址。若是直连路由,则送往相应的接口,对报文进行封装转发。若不是直连,则以下一跳作为目的地址,继续查找路由表。
- 若没有匹配路由,但是有默认路由,则送往对应的接口。没有匹配路由,也没有默认路由则丢弃。
4、转发
当主机A发向主机B的数据流在网络层封装成IP数据包,IP数据包的首部包含了源IP和目标IP。主机A会用本机配置的24位IP网络掩码255.255.255.0与目标地址进行与运算,判断目标网络地址与本机的网络地址是不是在同一个网段中。如果不是将IP数据包转发到网关。
在发往网关前主机A还会通过ARP的请求获得默认网关的MAC地址。在主机A 数据链路层IP数据包封装成以太网数据帧(按四层协议从上到下封包),然后才发住到网关……也就是路由器上的一个端口。
当网关路由器接收到以太网数据帧时,发现数据帧中的目标MAC地址是自己的某一个端口的物理地址,这时路由器会把以太网数据帧的封装去掉。路由器认为这个IP数据包是要通过自己进行转发,接着它就在匹配路由表。匹配到路由项后,它就将包发往下一跳地址。
路由器转发数据包就是这样,所以路由器转发数据包不会对它的IP源地址和目标地址做修改,只会修改MAC。除了NAT协议,这会改变源IP,但不会改变目的IP。
当有数据包传到路由器时,路由器首先将其目的IP与路由表进行对比,如果是本地网络,将不会进行转发到外网络,而是直接转发给本地网内的目的主机,改变的只是数据包的源地址(原来的源MAC变为了路由器的MAC)。但是如果目的IP经路由表对比,发现不是在本网中,有NAT就将改变源地址的IP(原源IP地址改为了路由器的IP地址),路由器将数据包转发到相应的端口,进行通信。
相当于就是在没有NAT的情况下,一次通信不会改变源IP和目的IP(目的主机是通过IP地址判断是不是发给他的),但是每次转发(相当于通信链路中的一段)都会改变源MAC和目的MAC(源MAC变成自身出接口的MAC,目的MAC变成下一跳的MAC)。和交换机交换不一样,交换不会改变源目MAC。
二、接口2->接口3:NAT
NAT技术:是指通过专用网络地址转换为公用地址,从而对外隐藏内部管理的IP地址,它使得整个专用网只需要一个全球IP就可以访问互联网,由于专用网IP地址是可以重用的,所以NAT大大节省了IP地址的消耗。
因此可以认为本地网络中多个主机共享一个公网IP地址,现在常用的协议是NAPT(Network Address Port Translation),即网络地址端口转换,通过建立内网IP -> 公网IP+端口号的映射关系来进行转换(端口号是由NAT设备选取的TCP/UDP端口号)。通过使用源端口将多个私网ip地址映射到一个公网ip地址(多对一)。
NPAT理论上可以同时支持(65535 - 1024)= 64511个连接会话。其中1024为专用端口,如80端口用于http协议的浏览器,443端口用于https协议的浏览器。
因此根据上述VPP和trex的架构图,接口2到接口3,除了有路由寻址转发,还有NAT。则出接口3的数据包信息为:
- 源ip:20.1.1.1(通过NAT转换为接口3的公网IP)
- 目的ip:10.1.1.1(目的IP是不会变的,变的是MAC地址)
- 源端口:10001(源端口号1025表示源主机进程的端口,这里NAT设备可能会重新分配一个唯一的端口号)
- 目的端口:80
- 源MAC:接口3
- 目的MAC:接口4
补充:
NAT缺点:NAT的出现使得公网服务器无法对内网主机主动发起连接。通信链路的建立只能是内网主机主动向公网服务器发起连接,服务器进行响应。
解决方法:内网穿透(又称NAT穿透),需要主机连接并且保持长久连接,这里不太了解,不展开了。
三、接口3->接口4:
根据上面所说,接口3和接口4都是公网地址,会直接进行通信。接口3到接口4的数据包信息为:
- 源ip:20.1.1.1
- 目的ip:10.1.1.1(目的IP是不会变的,变的是MAC地址)
- 源端口:10001
- 目的端口:80
- 源MAC:接口3
- 目的MAC:接口4
四、接口4->接口1:
对于服务器的响应,要经过数据发送到路由器进行寻址转发;到NAT设备,根据目的IP和端口号(10001)映射为内网IP;可能再次经过路由寻址转发,直到送到直连路由,然后发送到接口1.
总结
其中还是有很多没有涉及到,比如安全性问题,路由表等等,后面用到的时候我会再补充。
参考:
这个写的挺好的:从零讲解主机之间如何通信
ARP协议详解
内网穿透