常用网络协议
- 应用层:DNS、HTTP、HTTPS
- 传输层:TCP、UDP
- 网络层:IP,源IP以及目标IP (网关,DHCP,同一局域网内ARP请求MAC地址)
- MAC层:MAC头
网络分层
- 复杂程序分层,每一层有各自的任务
- 假设是一个网口,拿到一个网络包:process_layer2(buffer) ,查看MAC是否是自己,process_layer3(buffer),查看IP,process_tcp(buffer),递交给相应的端口处理
- 二层设备:只把 MAC 头摘下来,看看到底是丢弃、转发,还是自己留着
- 三层设备:把 MAC 头摘下来之后,再把 IP 头摘下来,看看到底是丢弃、转发,还是自己留着
IP以及MAC
- ifconfig 和 ip addr
- ip addr
- `
root@test:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff
inet 10.100.122.2/24 brd 10.100.122.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fec7:7975/64 scope link
valid_lft forever preferred_lft forever`
net-tools 和 iproute2
无类型域间选路(CIDR): 32 位的 IP 地址一分为二,前面是网络号,后面是主机号
10.100.122.2/24,后面 24 的意思是,32 位中,前 24 位是网络号,后 8 位是主机号
广播地址: 10.100.122.255。如果发送这个地址,所有 10.100.122 网络里面的机器都可以收到
子网掩码,255.255.255.0: 子网掩码和 IP 地址按位计算 AND,就可得到网络号
公有IP,私有IP
在 IP 地址的后面有个 scope,对于 eth0 这张网卡来讲,是 global,说明这张网卡是可以对外的
lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现
MAC 地址,一个网卡的物理地址
MAC 地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识
net_device flags,网络设备的状态标识: <BROADCAST,MULTICAST,UP,LOWER_UP>
UP 表示网卡处于启动的状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP 表示 L1 是启动的,也即网线插着呢
qdisc queueing discipline 排队规则
内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列
最简单的 qdisc 是 pfifo
pfifo_fast 稍微复杂一些,它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则
数据包是按照服务类型(Type of Service,TOS)被分配到三个波段(band)里面的。TOS 是 IP 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。
如何配置IP
- 使用 net-tools (1) sudo ifconfig eth1 10.0.0.1/24 (2) sudo ifconfig eth1 up
- 使用 iproute2:(1) sudo ip addr add 10.0.0.1/24 dev eth1(2) sudo ip link set up eth1
- 发送逻辑:(1) 这个地址和我是一个网段的吗,或者和我的一个网卡是同一网段的吗?只有是一个网段的,它才会发送 ARP 请求,获取 MAC 地址 (2) 如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关 (3) 如果配置了网关的话,Linux 会获取网关的 MAC 地址,然后将包发出去
- 网关要和当前的网络至少一个网卡是同一个网段的
- 不同系统的配置文件格式不同,但是无非就是 CIDR、子网掩码、广播地址和网关地址
动态主机配置协议(DHCP)
- 只需要配置一段共享的 IP 地址。每一台新接入的机器都通过 DHCP 协议,来这个共享的 IP 地址里申请,然后自动配置好就可以了
- DHCP Discover
新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包,目的 IP 地址为 255.255.255.255。广播包封装了 UDP,UDP 封装了 BOOTP。其实 DHCP 是 BOOTP 的增强版。Boot request
DHCP Server 通过唯一标识符MAC知道新人来了。 DHCP Offer,DHCP Server 为此客户保留为它提供的 IP 地址
DHCP Server 分配了一个可用的 IP ,除此之外,服务器还发送了子网掩码、网关和 IP 地址租用期等信息
新来的机器会选择其中一个 DHCP Offer,一般是最先到达的那个,并且会向网络发送一个 DHCP Request 广播数据包,包中包含客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器地址等
DHCP Server 接收到客户机的 DHCP request 之后,会广播返回给客户机一个 DHCP ACK 消息包,表明已经接受客户机的选择,并将这一 IP 地址的合法租用信息和其他的配置信息都放入该广播包,发给客户机
预启动执行环境(PXE):Pre-boot Execution Environment
- PXE 客户端启动之后,发送 DHCP 请求之后,除了能得到一个 IP 地址,还可以知道 PXE 服务器在哪里,也可以知道如何从 PXE 服务器上下载某个文件,去初始化操作系统