IP协议
网络层#
主机到主机(ip 包的传输)
IP 包主要字段#
源 ip 地址
目标 ip 地址
IPV4 地址(网络号 + 主机号)#
给每一台主机,或者路由器的每一个接口分配一个地址,32bit 表示,4 个字节,一个 IPV4 地址包含了网络号和主机号。同一个网络号里面的主机之间交互,称为内网访问。
有三种编址方法#
1. 分类编址#
A类地址 8位网络号|24位主机
B类地址 16位网络号|16位主机
C类地址 24位网络号|8位主机
...
2. 划分子网的 IPv4 地址#
通过子网掩码来计算网络号 + 主机号
比如ip地址:10.100.122.2
子网掩码:255.255.255.0 // 通过位运算and就可以发现,最后8bit是没有被掩盖的,所以网络号就是前24位,主机号就是后8位。
已知 ip,子网掩码,如何计算网络?#
假设 A 主机 ip 地址是 192.168.0.1,子网掩码是 255.255.255.128.
假设 B 主机 ip 地址是 192.168.0.128,子网掩码是 255.255.255.128. A->B 是否在同一个网络中?
192.168.0 0000 0001
255.255.255 1000 0000
---------------------
192.168.0.0 #与运算结果,所以A地址网络是192.168.0.0
192.168.0. 1000 0000
255.255.255 1000 0000
----------------------
192.168.0.1 #B地址的网络是192.168.0.1 和A地址不一样
3. 无分类编址的 IPv4 地址#
128.14.35.7/20 #通过/20标识前20bit是网络号,后面12bit为主机号
上面我们可以看到,我们可以根据主机的数量,来决定如何分配网络。比如 4bit 表示主机号,就可以分配 2^4=16 个主机,但是一般最小的主机号分给网关(路由器),最大的主机号是广播地址。
路由器 —— 跨网络访问#
每个接口都连接着一个网络,接口的地址就是那个网络的默认网关 Gateway (网络的最小的主机号),当网络 1 的主机要和网络 2 的主机通信时,就需要通过路由来转发。
路由器收到 ip 数据报 (包含源 ip, 目的 ip),先用目的 ip 地址分别与路由表的每个地址掩码进行与运算,找到是否有符合的目的网络。如果有对应的网络,就转发过去。
虚拟专用网 VPN#
专用私有地址,路由器检测到目标地址是私有地址,不会进行转发,所以这些地址的 ip 数据报只能在内网传输。为了让他在公共网络传输,需要对 IP 包加一层公网 ip 头部。
实现 VPN 需要两个路由器,而且路由器的 ip 可以在因特网传播。
主机 1 (源内网 ip1, 目标内网 ip2)—-> 路由器(对数据报添加一层,源地址使用路由器的 ip, 目标地址使用目标路由器的 ip)—- 互联网中传输 ——-> 目标路由器 (解析到目标内网 ip)-> 主机 2.
NAT—— 私有 ip 地址访问公网 ip#
私有地址 ip 访问公网 ip, 私有地址主机要通过 NAT 路由器访问公网 ip. NAT 路由器维护了一个公网 IP 地址表(每次有内网 ip 要访问外网时,会分配一个 ip 给他作为源地址)
linux 路由表#
一个主机可能同时存在于多个网络中,路由表就是保存当前主机的网络信息
[root@izwz97ww79qca7m2kxb6hqz ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.18.88.253 0.0.0.0 UG 0 0 0 eth0
169.244.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.19.32.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
当主机发送 ip 包出去时,使用哪个网卡来发送呢?
首先会将目标地址 ip 和路由表的子网掩码(Genmask)进行与运算,得到目标地址的网络,如果路由列表中哪个网卡的网络与之相同,就选择这个网卡发送(这就是内网发送,不通过路由器)
第一条目比较特殊,它目标地址和子网掩码都是 0.0.0.0
,这表示默认网关,就是当前网络连接的路由器的地址 172.21.176.1,如果其他所有条目都无法匹配,就会自动匹配这一行。并且后续就把包发给路由器,Gateway
即是路由器的 IP 地址(走向外网)。
linux 虚拟网卡#
有时候,一台服务器需要设置多个 ip, 但又不想添加多块网卡,那就需要设置虚拟网卡。比如 docker 启动的时候