“基本概念”
设备
Hub
工作在物理层,将数据复制发送到每一个口上;
交换机
工作在数据链路层,将数据只发送到目的MAC的口上;交换机会学习得到一个转发表,有过期时间;
路由器
工作在网络层;
工具
net-tools和iproute2
基本概念
CIDR(无类型域间选路)
10.100.122.2/24,前24位是网络号,后8位是主机号;
广播地址:10.100.122.255
子网掩码:255.255.255.0
IP
基本IP信息查看
enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
scope 是global,说明是可以对外的;host,仅供本机互相通信;
UP 表示网卡处于启动的状态;
BROADCAST 表示这个网卡有广播地址,可以发送广播包;
MULTICAST 表示网卡可以发送多播包;
LOWER_UP 表示 L1 是启动的,也即网线插着呢。
MTU1500 最大传输单元 MTU 为 1500,这是以太网的默认值
IP包发送流程
本机:16.158.23.6 目标:192.168.1.6 通过交换机连接 Linux 默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关; 如果配置了网关,linux会获取网关的MAC地址,将包发出去。对于192.168.1.6这台机器,目标IP是它,但是 MAC地址不是它的,所以它的网卡是不会把包收进去的。
DHCP(动态主机配置协议)
DHCP Discover
新来的机器使用IP地址0.0.0.0发送一个广播包,目的IP地址为255.255.255.255。广播包封装了UDP,
UDP封装了BOOTP。其实DHCP是BOOTP的增强版。
DHCP Offer
DHCP server仍然使用广播地址作为目的地址。回复说,我分配了一个可用的IP给你,你看如何。同时发送子网掩码、网关和IP地址租用期等;
ARP
已知IP地址,求MAC地址
ICMP(互联网控制报文协议)
ping
traceroute
静态路由
静态路由,其实就是在路由器上,配置一条一条规则。这些规则包括:
想访问 BBS 站(它肯定有个网段),从 2 号口出去,下一跳是 IP2;
想访问教学视频站(它也有个自己的网段),从 3 号口出去,下一跳是 IP3,然后保存在路由器里
IP头和MAC头哪些边、哪些不变?
MAC 地址是一个局域网内才有效的地址。因而,MAC 地址只要过网关,就必定会改变,因为已经换了局域网。两者主要的区别在于 IP 地址是否改变。不改变 IP 地址的网关,我们称为转发网关;改变 IP 地址的网关,我们称为NAT 网关
动态路由
UDP/TCP
UDP
TCP
发送窗口:
| 发送已确认 | 发送未确认 | 未发送可发送 | 未发送不可发送 |
LastByteAcked LastByteSent AdvertisedWindow
接收窗口:
| 接收已确认 | 等待接收未确认 | 不能接收 |
LastByteRead NextByteExpected MaxRecvBuffer
应用层
RTMP
DHCP、VXLAN、QUIC
使用场景: 第一,需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用; 第二,不需要一对一沟通,建立连接,而是可以广播的应用; 第三,需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候;
例子:
- 网页或者 APP 的访问
QUIC(快速 UDP 互联网连接)
- 流媒体的协议
网络直播协议多使用RTMP(是基于TCP的)。但是很多应用,都基于UDP实现了自己的视频传输协议
- 实时游戏
游戏对实时要求较为严格的情况下,采用自定义的可靠 UDP 协议,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响
-
IoT 物联网
-
移动通信领域
在 4G 网络里,移动流量上网的数据面对的协议 GTP-U 是基于 UDP 的。因为移动网络协议比较复杂,而 GTP 协议本身就包含复杂的手机上线下线的通信协议。如果基于 TCP,TCP 的机制就显得非常多余
流媒体协议
名词系列一:AVI、MPEG、RMVB、MP4、MOV、FLV、WebM、WMV、ASF、MKV。例如 RMVB 和 MP4
名词系列二:H.261、 H.262、H.263、H.264、H.265。这个是不是就没怎么听过了
名词系列三:MPEG-1、MPEG-2、MPEG-4、MPEG-7
每一张图片,都是由像素组成的,假设为 1024*768(这个像素数不算多)。
每个像素由 RGB 组成,每个 8 位,共 24 位。
我们来算一下,每秒钟的视频有多大?30 帧 × 1024 × 768 × 24 = 566,231,040Bits = 70,778,880Bytes
如果一分钟呢?4,246,732,800Bytes,已经是 4 个 G 了。
推流:把数据流打包传输到对端,RTMP协议
拉流:观众的客户端拉取数据流
DNS
负载均衡
云网络
核心交换机 汇聚交换机 接入交换机
一张网卡可虚拟成多张网卡,可绑定不同地址
多张网卡可绑定成一张网卡(网卡绑定bond),进行负载均衡
网卡的模式可以决定接受处理什么样的网络包
开源技术qemu-lvm TUN/TAP的Char Dev(字符设备文件),虚拟成TAP网卡 brctl创建虚拟网桥,支持VLAN功能 vconfig,可以基于物理网卡 eth0 创建带 VLAN 的虚拟网卡,所有从这个虚拟网卡出去的包,都带这个 VLAN,如果这样,跨物理机的互通和隔离就可以通过这个网卡来实现
OpenFlow是 SDN 控制器和网络设备之间互通的南向接口协议 OpenvSwitch用于创建软件的虚拟交换机
ACL来控制IP和端口
当一个网络包进入一台机器的时候,会做以下的事情: 首先拿下 MAC 头看看,是不是我的。如果是,则拿下 IP 头来。得到目标 IP 之后呢,就开始进行路由判断。在路由判断之前,这个节点我们称为 PREROUTING。如果发现 IP 是我的,包就应该是我的,就发给上面的传输层,这个节点叫作 INPUT。如果发现 IP 不是我的,就需要转发出去,这个节点称为 FORWARD。如果是我的,上层处理完毕后,一般会返回一个处理结果,这个处理结果会发出去,这个节点称为 OUTPUT,无论是 FORWARD 还是 OUTPUT,都是路由判断之后发生的,最后一个节点是 POSTROUTING。
linux内核中,有个框架计较Netfilter,可以在上述5个节点插入hook函数。这些函数可以截获数据包,对数据包进行干预。例如做一定的修改,然后决策是否接着交给 TCP/IP 协议栈处理;或者可以交回给协议栈,那就是 ACCEPT;或者过滤掉,不再传输,就是 DROP;还有就是 QUEUE,发送给某个用户态进程处理。
经常用在内部负载均衡,就是过来的数据一会儿传给目标地址 1,一会儿传给目标地址 2,而且目标地址的个数和权重都可能变。协议栈往往处理不了这么复杂的逻辑,需要写一个函数接管这个数据,实现自己的逻辑
一个著名的实现,就是内核模块 ip_tables。它在这五个节点上埋下函数,从而可以根据规则进行包的处理。按功能可分为四大类:连接跟踪(conntrack)、数据包的过滤(filter)、网络地址转换(nat)和数据包的修改(mangle)。其中连接跟踪是基础功能,被其他功能所依赖。其他三个可以实现包的过滤、修改和网络地址转换
云平台控制网络的QoS(Quality of Service)
容器网络
隔离技术 namespace:也即每个 namespace 中的应用看到的是不同的 IP 地址、用户空间、程号等。 cgroup:也即明明整台机器有很多的 CPU、内存,而一个应用只能用其中的一部分
网络的namespace由ip netns命令操作