网络跳线
集线器(hub)(Hub 是广播的,不管某个接口是否需要,所有的 Bit 都会被发送出去,然后让主机来判断是不是需要)
ARP、VLAN、STP(生成树的算法)
交换机
ICMP(ping)、IP、OSPF、BGP、IPSec、GRE
路由器
UDP、TCP
DHCP、HTTP、HTTPS、RTMP、P2P、DNS、GTP、RPC
子网内,用mac定位目标,子网外用ip定位
如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关
知道ip地址求mac地址
192.168.0.x 是最常用的私有 IP 地址。你家里有 Wi-Fi,对应就会有一个 IP 地址。一般你家里地上网设备不会超过 256 个,所以 /24 基本就够了。有时候我们也能见到 /16 的 CIDR,这两种是最常见的
新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包,目的 IP 地址为 255.255.255.255。广播包封装了 UDP,UDP 封装了 BOOTP,DHCP Server分配一个ip给新来的机器,要保证mac地址唯一。
根据mac地址转发网络包,第一次不知道对应的端口,广播所有端口,然后缓存正确的端口
使用 VLAN,一个交换机上会连属于多个局域网的机器
VLAN ID有12 位可以划分 4096 个 VLAN
相同 VLAN 的包,才会互相转发,不同 VLAN 的包,是看不到的
交换机之间用Trunk口连接
https://baijiahao.baidu.com/s?id=1628398215665219628&wfr=spider&for=pc
网关往往是一个路由器,到某个 IP 地址应该怎么走,这个叫作路由表
路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关
可靠连接;如果对方没有回复,会不断重试
在内核中,为每个 Socket 维护两个队列。一个是已经建立了连接的队列,这时候连接三次握手已经完毕,处于 established 状态;一个是还没有完全建立连接的队列,这个时候三次握手还没完成,处于 syn_rcvd 的状态。服务端调用 accept 函数,其实是在第一个队列中拿出一个已经完成的连接进行处理。如果还没有完成就阻塞等待
目前主流的虚拟网卡方案有tun/tap和veth两种,在时间上tun/tap出现得更早,它是一组通用的虚拟驱动程序包,里面包含了两个设备,分别是用于网络数据包处理的虚拟网卡驱动,以及用于内核空间与用户空间的间交互的字符设备(Character Devices,这里具体指/dev/net/tun
)驱动。大概在2000年左右,Solaris系统为了实现隧道协议(Tunneling Protocol)开发了这套驱动,从Linux Kernel 2.1版开始移植到Linux内核中,当时是源码中的可选模块,2.4版之后发布的内核都会默认编译tun/tap的驱动。
tun和tap是两个相对独立的虚拟网络设备,其中tap模拟了以太网设备,操作二层数据包(以太帧),tun则模拟了网络层设备,操作三层数据包(IP报文)。使用tun/tap设备的目的是实现把来自协议栈的数据包先交由某个打开了/dev/net/tun
字符设备的用户进程处理后,再把数据包重新发回到链路中。你可以通俗地将它理解为这块虚拟化网卡驱动一端连接着网络协议栈,另一端连接着用户态程序,而普通的网卡驱动则是一端连接则网络协议栈,另一端连接着物理网卡。只要协议栈中的数据包能被用户态程序截获并加工处理,程序员就有足够的舞台空间去玩出各种花样,譬如数据压缩、流量加密、透明代理等功能都能够以此为基础来实现,以最典型的VPN应用程序为例,程序发送给tun设备的数据包,会经过如下所示的顺序流进VPN程序:
应用程序通过tun设备对外发送数据包后,tun设备如果发现另一端的字符设备已被VPN程序打开(这就是一端连接着网络协议栈,另一端连接着用户态程序),便会把数据包通过字符设备发送给VPN程序,VPN收到数据包,会修改后再重新封装成新报文,譬如数据包原本是发送给A地址的,VPN把整个包进行加密,然后作为报文体,封装到另一个发送给B地址的新数据包当中。这种将一个数据包套进另一个数据包中的处理方式被形象地形容为“隧道”(Tunneling),隧道技术是在物理网络中构筑逻辑网络的经典做法。而其中提到的加密,也有标准的协议可遵循,譬如IPSec协议。
使用tun/tap设备传输数据需要经过两次协议栈,不可避免地会有一定的性能损耗,如果条件允许,容器对容器的直接通信并不会把tun/tap作为首选方案,一般是基于稍后介绍的veth来实现的。但是tun/tap没有veth那样要求设备成对出现、数据要原样传输的限制,数据包到用户态程序后,程序员就有完全掌控的权力,要进行哪些修改,要发送到什么地方,都可以编写代码去实现,因此tun/tap方案比起veth方案有更广泛的适用范围。
veth是另一种主流的虚拟网卡方案,在Linux Kernel 2.6版本,Linux开始支持网络名空间隔离的同时,也提供了专门的虚拟以太网(Virtual Ethernet,习惯简写做veth)让两个隔离的网络名称空间之间可以互相通信。直接把veth比喻成是虚拟网卡其实并不十分准确,如果要和物理设备类比,它应该相当于由交叉网线连接的一对物理网卡。
veth实际上不是一个设备,而是一对设备,因而也常被称作veth pair。要使用veth,必须在两个独立的网络名称空间中进行才有意义,因为veth pair是一端连着协议栈,另一端彼此相连的,在veth设备的其中一端输入数据,这些数据就会从设备的另外一端原样不变地流出,它工作时数据流动如下图所示
由于两个容器之间采用veth通信不需要反复多次经过网络协议栈,这让veth比起tap/tun具有更好的性能,也让veth pair的实现变的十分简单,内核中只用了几十行代码实现了一个数据复制函数就完成了veth的主体功能。veth以模拟网卡直连的方式很好地解决了两个容器之间的通信问题,然而对多个容器间通信,如果仍然单纯只用veth pair的话,事情就会变得非常麻烦,让每个容器都为与它通信的其他容器建立一对专用的veth pair并不实际,这时就迫切需要有一台虚拟化的交换机来解决多容器之间的通信问题了。
qemu-kvm,利用软件模拟硬件,能让你在一台巨大的物理机里面,掏出一台台小的机器
emu 就是 Emulator(模拟器)的意思,主要会模拟 CPU、内存、网络、硬盘,使得虚拟机感觉自己在使用独立的设备,但是真正使用的时候,当然还是使用物理的设备
虚拟网卡如何连在一起,进行相互访问,并且可以访问外网,虚拟网桥bridge(即虚拟交换机)
如何访问外部?
桥接
nat
物理网卡与虚拟网卡不在同一个网桥上
需要二层网络设备支持
由于通常交换机可用的VLAN数量都在4000个左右,这会对容器集群规模造成限制,远远不能满足公有云或大型私有云的部署需求; 大型数据中心部署VLAN,会导致任何一个VLAN的广播数据会在整个数据中心内泛滥,大量消耗网络带宽,带来维护的困难
跨数据中心传递。VLAN本身是为二层网络所设计的,但是在两个独立数据中心之间,信息只能跨三层传递,由于云计算的灵活性,大型分布式系统却完全有跨数据中心运作的可能性,此时如何让VLAN Tag在两个数据中心间传递又成了不得不考虑的麻烦事。
为了统一解决以上两个问题,IETF定义了VXLAN规范,这是三层虚拟化网络(Network Virtualization over Layer 3,NVO3)的标准技术规范之一,是一种典型的Overlay网络。VXLAN采用L2 over L4 (MAC in UDP)的报文封装模式,把原本在二层传输的以太帧放到四层UDP协议的报文体内,同时加入了自己定义的VXLAN Header。在VXLAN Header里直接就有24 Bits的VLAN ID,同样可以存储1677万个不同的取值,VXLAN让二层网络得以在三层范围内进行扩展,不再受数据中心间传输的限制。VXLAN的整个报文结构如下图所示
Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式
给不同的物理机设置不同网段,
物理机 A 上的 flanneld 会将网络包封装在 UDP 包里面,然后外层加上物理机 A 和物理机 B 的 IP 地址,发送给物理机 B 上的 flanneld
由于全部在用户态,所以性能差了一些
不使用udp,使用vxlan
不走 Overlay 网络,不引入另外的网络性能损耗,而是将转发全部用三层网络的路由转发来实现
Calico 推荐使用物理机作为路由器的模式,这种模式没有虚拟化开销,性能比较高。
Calico 的主要组件包括路由、iptables 的配置组件 Felix、路由广播组件 BGP Speaker,以及大规模场景下的 BGP Route Reflector。
为解决跨网段的问题,Calico 还有一种 IPIP 模式,也即通过打隧道的方式,从隧道端点来看,将本来不是邻居的两台机器,变成相邻的机器。
https://time.geekbang.org/column/article/11643
http://dockone.io/article/2717
https://icyfenix.cn/immutable-infrastructure/network/linux-vnet.html