1、网络协议基础知识
根据官方文档LVS支持三种主要负载工作方式:NAT方式、TUN方式和DR方式。为了说明这三种方式的工作原理,我们首先需要了解一下基础的IP/TCP报文(注意,IP报文和TCP报文是两种不同的报文格式),以及链路层对IP数据的封装方式。然后我们采用看图说话的方式,以图文结合的方式为您介绍这三种工作方式中对报文或重写或封装的过程。
LVS体系之所以高效是因为其直接对链路层报文、IP报文、TCP报文进行了修改或封装。所以要真正理解LVS的三种工作方式,就不能像网络上的抄袭贴一样转几句不知所以的文字就完了,必须对链路层报文、网络层报文、传输层报文有所了解。
2、链路层报文
链路层的数据格式有一个共同特点,都包括目标MAC地址和源MAC地址。下面这个图主要说明了我们最常用的Ethernet帧(以太帧)的报文格式:
目标MAC地址/源MAC地址:00:00:00:00:00:00——FF:FF:FF:FF:FF:FF这个范围是全球MAC地址的可用范围。一张物理网卡肯定有一个唯一的MAC地址。实际上网络层常用的IP协议,就是基于MAC地址的。一个子网范围内某个IP对应的MAC地址是通过ARP查询协议从NAT设备(可能是路由器、交换机或者网络代理设备)上查询得到的。
上层协议类型:链路层的报文是为了承载网络层的协议而存在的,所以链路层的数据格式中需要有一个属性说明这个链路层所承载的上层协议是什么类型。
IPv4: 0x0800
ARP:0x0806
PPPoE:0x8864
IPV6: 0x86DD
封装的上层数据:最多可以有1500个字节。
3、网络层IP报文
TCP协议和IP协议是两种不同的协议。对应的,也就是两种不同的描述格式。
IP协议是网络层协议,顾名思义,就是用来描述整个网络构成情况的;TCP协议是通讯层协议,是用来表示两个或多个网络上的点如何进行通信和当前通信状态的。
这两种协议有很多共同特点,例如这两种协议都分为“头部”和“数据部”;针对IP协议来说,TCP协议的描述就存放在其“数据部”。
我们首先来看看IP协议是怎么描述的:
header.version:IP协议的版本号,你猜对了就是IPV4还是IPV6。4表示IPV4版本,6表示IPV6。你要问我什么是IPV4,还是IPV6:192.168.220.141,这就是IPV4的格式;FE80:0000:0000:0000:AAAA:0000:00C2:0002,这就是IPV6的格式。
header.Total Length:总长度,这个总长度是IP头和IP数据两个区域的总长度。主要还是用于生成头验证码和为了操作系统处理方便。
header.IP Flags:这个位置有3位000,但实际只有后两位才有值010,这个就是“D”位=1,这个时候表示由于要传输的整个数据不大,所以这个IP数据报的数据部分已经描述了整个数据描述,不需要进行IP数据报的分片;”D”为=0,表示要传输的整个数据比较大,所以IP数据报进行了拆分,这个时候就要用到最后一位了:最后一位“M”中“1”表示还有后续分片;0表示这个数据报就是IP分片的最后一个数据片了。
header.Protocol:IP协议是网络层协议,在网络层以上是传输层协议。TCP、UDP、ICMP和IGMP是传输层协议。这个位置的8位说明IP协议数据部分携带的是哪种上层协议。
header.Source Address:这个当然就是IP数据报的来源地址咯。
header. Destination Address:这个当然就是IP数据报的目标地址咯。
header.checksum:首部校验值。这个值校验IP数据报首部的传输完整性(注意校验不包括IP数据报的数据部分)。这就意味着NAT设备重写这个数据报的来源或者目标IP后,校验值要重新进行计算。Source Address、Destination Address、Checksum是各种NAT设备主要的改写属性。而且很多时候NAT设备只改写这三个值就可以实现IP数据报的转发(当然TCP报文中的端口也会被改写,以便在端口映射的情况下进行端口转换)。
4、传输层TCP报文
TCP的报文信息是装在到IP报文的数据部分的,当成网络上进行传输的数据从Srouce Address传到Destination Address中。下面是TCP报文的信息:
头.源端口号:TCP信息来源的端口号。
头.目的端口号:TCP信息数据的目标端口。
头.状态位(URG/ACK/PSH/RST/SYN/FIN);TCP的三次握手和连接中断需要用到ACK、SYN、FIN这三个标记、需要注意SYN SEQ和ACK SEQ就是TCP数据报的确认号;另外解释一下PSH和RST两个状态标记。应用层的TCP数据报有一个缓存区,也就是说多个正确的TCP数据报会首先放到这个缓存区,达到一定条件后,再推送给上层的应用层协议,例如http。PSH为1的时候,表示不需要再等到后续的TCP数据报文了,直接将目前接收方缓存中的tcp数据报进行数据段组合后推送给上层协议,并且清空缓存区;RST表示复位,您可以理解成放弃当前缓存区的所有未发送给上层协议的TCP数据报文,一般这种情况都是TCP报文传输出现了问题。
头.TCP校验和:TCP报文的校验和比起IP头校验要稍微复杂点。TCP校验的输入包括三部分:TCP伪首部、TCP首部长度和TCP数据部长度。TCP伪首部是一个虚拟概念,它包括承载TCP数据报文的IP报文的一部分,和TCP首部的一部分数据(源IP、目标IP、IP报文中的protocoly、以及TCP报文的报文头长度和TCP报文的数据长度)。
从上面的描述可以看出,一旦IP报文中的源IP和目标IP发生改变了,TCP报文校验信息就会改变。