跳转至

网络层

Internet Protocol 互联网协议

操作系统启动的时候,DHCP协议会配置本机IP地址和默认网关IP地址

本地主机先通过子网掩码来判断目标IP是本地IP还是公网IP,如果是同一子网,直接发送给对方,否则发给本子网的默认网关,默认网关如果不能路由,则通过ARP协议(Address Resolution Protocol)获取网关MAC地址,交给能进行路由的网关,即路由器,如果找不到则丢弃,如果找到且恰巧路由器是目标子网的网关,则将数据包交给它然后结束路由,否则会通过路由协议(常用的有 OSPF 和 BGP)按路由表将数据包继续给到下一个路由,如果转发 TTL(Time To Live) 次之后都没有找到,则最终被丢弃。

20210729232759

DHCP

DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议

设置项:IP、子网掩码、默认网关、DNS

  • Static(静态) IP:手工给设备设置IP地址
  • Dynamic(动态) IP:设备向DHCP服务器(主机或路由器)发送一个请求,获取IP地址

分配地址的时候会设定租期,当租期过去50%时会向DHCP服务器发送续约请求,如果没有发则IP将被收回

此外,像打印机、服务器、路由器等这些IP不应该经常变化的设备,还可以在DHCP配置中根据MAC地址预留固定IP

路由表

静态全局路由表

互联网诞生初期,全球的主机很少,只需要每个路由器各自维护一张包含全球全局路由表即可,当有新的路由器出现,需要各自手动更新路由表

动态全局路由表

随着互联网规模增长,改为自动更新全局路由表

动态分级路由表

互联网流量暴涨,全局路由表越来越大,更新与查询越来越频繁,越来越慢,于是引入分级路由,将互联网按区域大小用树状层次结构划分,每个路由器只需要维护所在区域的路由表即可

路由协议

  • BGP协议:基于TCP协议,根据距离矢量路由算法(Bellman-Ford),找到最短路径,主要用于内网
  • OSPF协议,基于IP协议,根据链路状态路由算法(Dijkstra),找到最佳路径,主要用于外网

IPv4

IPv4 由 32bits 连续的二进制数字组成,共 4Bytes,为方便书写,每字节为一组,采用点分十进制来显示和使用

20210725152948

IP 地址由互联网机构 ICANN 分配

分类编址

根据网络规模大小,分成5类

20210725153815

  • A~C 类为单播地址,分配给相应规模的地址
  • D类为多播地址,向这个IP发送消息,组下的主机都可以收到

20210726230202

最初由 网络号 + 主机号 两级组成,不同分类下网络号的位数和起始位,以及主机号位数都是固定的

这种两级IP利用率较低且不够灵活,于是将主机号又划分出一部分作为 子网号

当数据到达路由器后,通过子网掩码计算出子网号,先发给子网,然后再转发给对应主机

子网掩码 与 IP 的位数和格式一样,只是主机号部分用 0 表示,前面的网络号和子网号都用 1 表示

20230520183936

然后将IP地址与子网掩码逐位相与(AND),即可得出子网的地址

无分类编址 CIDR

随着互联网增长,IPv4 地址很容易被耗尽,于是研究出新的编址方法:无分类域间路由选择(CIDR, Classless Inter Domain Routing)

即地址不再分类,改为:网络前缀 + 主机号 / 前缀长度

网络前缀相同的地址,称之为CIDR地址块,前缀长度由后面的 /n 决定,可以通过地址掩码来算出地址块

地址掩码,类似于或者说仍可称之为子网掩码,即前 n 位都是1,剩余都是0,然后与地址按位与运算

前缀长度小于13或大于27的比较少用,最常见的为 /16/24,比如:192.168.1.x/24,二进制为:11000000.10101000.00000001.x

前24位为网络号,后8位为主机号,网络号部分用1表示,主机号部分用0表示,即地址掩码为:11111111.11111111.11111111.00000000,转换为10进制为:255.255.255.0

然后将二进制的IP和子网掩码按位逻辑与运算,即可得到地址块中的最小地址:11000000.10101000.00000001.00000000,即:192.168.1.0

  • 192.168.1.x/24 IP地址
  • 255.255.255.0 地址/子网掩码
  • 192.168.1.1 通常为默认网关(即路由器)
  • 192.168.1.255 广播地址(向这个地址发送消息所有主机都可以收到)

一个路由器可能有多个不同前缀长度的路由表,通常选择最长前缀匹配,因为前缀越长,地址数越少,路由越具体

8 位主机号可分配 2^8=256 个地址,地址块的最小地址(主机号全是0)和最大地址(全是1)为特殊地址,一般不使用,还要预留一个给默认网关,所以可分配 256-3=253 个地址

知道了这个规则之后,便可以通过主机数倒推子网掩码来规划网络

比如有10台主机,则至少需要 10+3=13 个IP
因为 2^4=16 > 13,所以主机号至少要4位
即子网掩码为:11111111.11111111.11111111.11110000,十进制为:255.255.255.240

NAT

2011年2月3日,IANA宣布IPv4地址已经耗尽,为了节约IP地址数,有时只需要给网关分配一个公有IP,而连接网关的主机则使用本地IP即可

RFC 6890 规定了一些可重用地址仅用于本地专用网

10.0.0.0/8 这些原本是分配ARPANET的,但其已经关停,所以被用作专用地址
172.16.0.0/12
192.168.0.0/16

跨网通信时,通过 Network Address Translation 协议将私有IP转换为公有IP,同一IP还可以使用端口号来区分不同的网络进程

20210725151352

如果某公司分布式办公,又需要内部通信,可以使用虚拟专用网(VPN, Virtual Private Network)加密通信

20230520204518

VPN 会虚拟出一个网卡

VPN 的种类很多,技术各不相同,涉及OSI的1~6层,比如有些使用隧道协议实现

https://en.wikipedia.org/wiki/Virtual_private_network

20230519135014

IPv6

为了长远考虑,创造出了 IPv6 协议

IPv6 由128位二进制数组成,通常分割成8组,每组16位(以十六进制数表示)

地址数足够分配给地球每一粒沙子,但它不兼容 IPv4,需要 NAT 转换和映射才能数据互通,因此普及较缓慢

20210725152103

特殊地址

127.0.0.1

凡是以127开头的地址,都属于回环地址(loop back address),即发送给此地址的请求会被自己接收,外部设备无法访问

127.0.0.1 只是回环地址中的一个,可用于测试网络是否正常:ping 127.0.0.1

如果遇到DDos攻击,可以将域名A记录解析到127.0.0.1,让其攻击自己

localhost

不是IP,而是域名,用于指代 this host/computer,通常被指向 IPv4 的 127.0.0.1 和 IPv6的 ::1

0.0.0.0

unspecified,未指定(即无效的,无意义的)地址

并不是一个真实的的IP地址,一般用于某些程序/网络协议中不便使用具体IP的特殊情况,表示本机中所有的IPv4地址

参考

极客时间专栏:《趣谈网络协议》