在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。这两种不用的表述其实阐明的是同一个问题。
原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。
VLAN简介:
VLAN:Virtual LAN,又叫“虚拟局域网”。
VLAN的作用,主要是将一个大的广播域隔离开来,形成多个小的广播域,各个广播域内可以互通,广播域之间默认不能直接通讯。
这里需要关注的是VID字段,该字段唯一标识了一个VLAN,12bit长度的VID可以表示4096个不同的值,除去两个保留值,一个以太网最多可以划分为4094个VLAN。
如果不做任何物理或者逻辑上的隔离,当一台PC发出了一个广播包,这个广播包是会泛洪到整个网络的所有设备上,每台电脑都会收到这个广播包。
这会严重的浪费系统资源,也会造成安全隐患,比如有一个用户在不停的发ARP包,每秒钟发10万个,那整个网络的所有设备每秒钟都要去处理大量的ARP包,这会消耗大量的CPU、内存以及带宽,从而无法利用空闲的资源去完成真正需要的通讯。
所以,使用VLAN技术,可以将一个大的广播域,根据需求去切割开来,分成若干的小型的广播域,每种数据帧(单播、广播、组播)都只能在同一个VLAN里泛洪,如果要传到其他VLAN去,就必须要经过三层路由来转发。
VxLAN简介:
虚拟局域网扩展(Virtual Extensible LAN, VXLAN),是一种网络虚拟化技术,它试图改善大云计算部署相关的可扩展性问题。
- vlan的数量限制
4096个vlan远不能满足大规模云计算数据中心的需求
- 物理网络基础设施的限制
基于IP子网的区域划分限制了需要二层网络连通性的应用负载的部署
- TOR交换机MAC表耗尽
虚拟化以及东西向流量导致更多的MAC表项
- 多租户场景
IP地址重叠
vxlan(virtual Extensible LAN)虚拟可扩展局域网,封装转发二层报文,在二层报文添加了一个VxLAN Header,进而通过UDP封装来进行传输,具体的报文格式如下:
这里重点关注的VxLAN封装部分的VXLAN header,其中有一个24位的VNI,可以对比VLAN ID,但VLAN的数量只有区区4096,而这里2^24数量来了个平方,使得划分网络的数目大大增加,除此之外还有虚拟机迁移,MAC表等方面都有很多利好
对于原始报文的封装,这里是通过VTEP来进行封装和解封,全称是VxLAN Tunnel End Point,它可以承载在物理交换机上,也可以是虚拟机交换机。
原始的报文,到了VTEP之后,就给封装VxLAN和UDP然后进行链路传输,因此在没有解封之前,原始报文里的信息是无法获知的。
简单说下VM1和VM2通过VxLAN通信流程,整个过程也是需要两个阶段,首先VM1必须知道VM2的MAC地址,然后再进行通信:
1.VM1发送ARP请求,咨询 192.168.0.101的MAC地址
2.VTEP1收到了请求之后,开始封装报文,VNI为864,SRC IP为VTEP1的IP,DST IP为多播(非广播)的UDP报文
3.多播包会发送到所有的VTEP上,目的IP地址不在管辖范围之内的,全部丢掉,但是VxLAN表里学习一条对应关系:VM1_MAC,VNI,VTEP1_IP
4.正确的VTEP2收到了包之后,解封装,给VNI为864的虚拟机发送ARP,同时VxLAN表里学习一条对应关系:VM1_MAC,VNI,VTEP1_IP
5.VM2收到了ARP请求,发现是自己,响应请求,发送自己的MAC地址
6.VTEP2收到ARP响应,封装成三层单播包,DST IP为VTEP1的IP,进行路由转发
7.VTEP1收到了包之后,解封装,将包发送给VM1,同时VxLAN表里学习一条对应关系:VM2_MAC,VNI,VTEP2_IP
8.VM1收到了ARP响应,获得了VM2的MAC地址
9.VM1发送IP报文给VM2,S-MAC,D-MAC,S-IP,D-IP
10.VTEP1收到之后,按照要求封装
11.首先,VxLAN header,VNI设置864
12.然后,UDP的DST PORT 4789
13.接着,IP的DST为VTEP2的IP,SRC为VTEP1的IP
14.最后,MAC的DST为VTEP1下一跳的MAC地址,SRC为VTEP1的MAC地址
15.封装好之后,先走到VTEP1的下一跳,进而转发给VTEP2
16.VTEP2根据监听目的端口4789,找到VxLAN的包之后,查看VNI
17.解封完之后,完整的二层包转发给VM2
如果需要VXLAN网络和非VXLAN网络连接,必须使用VXLAN网关才能把VXLAN网络和外部网络进行桥接和完成VXLAN ID和VLAN ID之间的映射和路由,和VLAN一样,VXLAN网络之间的通信也需要三层设备的支持,即VXLAN路由的支持。同样VXLAN网关可由硬件和软件来实现。从封装的结构上来看,VXLAN提供了将二层网络overlay在三层网络上的能力,VXLAN Header中的VNI有24个bit,数量远远大于4096,并且UDP的封装可以穿越三层网络,比VLAN有更好的扩展性。
一个是网络设计实现方案,一个是网络设备(网元)虚拟化的技术。比如OVS或者Linux-bridge就是一种NFV成功的技术。虚拟化后的各种网元被统一纳管,将管理面和转发面分离,组成了可行的通信网络,这就是一种SDN方案。
至于在虚拟化中涉及到OpenFlow和netconf协议,前者是将路由信息以流表的形式下发给网络设备的协议,而后者是对网络设备进行配置管理的协议。这里不再做深入讨论。
OpenStack Neutron是一个SDN网络项目,专注于在虚拟计算环境中提供网络即服务(NaaS)。Neutron在OpenStack中取代了原来的网络应用程序接口(API),称为Quantum。Neutron旨在解决云环境中网络技术的不足,包括通过网络拓扑和寻址在多租户环境中缺乏租户控制,这使得难以部署高级网络服务等。
neutron虽然功能强大,但是仍然存在很多无法解决的问题以及性能瓶颈,因此需要借助外部网络能力和plugin去解决。
1、基于VM网卡或IP的限速、基于路由的限速以及基于租户的限速等网络需求
2、网络节点存在的单点故障问题至今依然没有完善的解决方案,DVR(Distributed Virtual Routing,分布式路由)对虚拟路由器的HA方案也存在很大的缺陷。
3、对Neutron网络的监控,虽然可以通过Ceilometer组件使用Neutron的neutron-meter-agent进行采集,但除了Ceilometer组件存储采集数据持久化性能方面的问题,还存在很多监控项无法采集到的问题。
4、在Neutron中经常使用Open vSwitch虚拟交换机,而其在计算节点和网络节点的虚拟交换机都有稳定性和性能方面的限制,尤其是使用VXLAN等隔离方式时,报文的封装和解封装很可能成为网络瓶颈。
####3、neutron与SDN的关系
Neutron通过和SDN Controller集成,来实现和扩展原来neutron的功能。由原来neutron控制网元变为neutron控制SDN Contrloller,再由SDN Controller管理和控制计算节点网元以及VxLAN网关来实现虚拟网络通信。
https://blog.csdn.net/octopusflying/article/details/77609199
http://maoxiaomeng.com/2017/07/31/vxlan和vtep/
https://zh.wikipedia.org/wiki/虛擬局域網擴展
http://blog.sina.com.cn/s/blog_e01321880101i7lw.html