日新计划6月更文 Day 10
网络层(Network Layer)位于数据链路层之上、传输层之下,是计算机网络五层中较为复杂的一层。在发送端,传输层的 Segment 被封装成数据报(Datagram),在接收端重新得到 Segment。在此过程中会经过路由器(Router)的路由(Route)与转发(Forward)。
- Routing:路由,是指由路由器计算出一个数据报从发送方到达接收方的路径
- Forwarding:转发,是指数据报从路由器的输入端移动到正确的输出端
在网络层有两种主要的通信协议——ATM(Asynchronous Transfer Mode)协议与 IP(Internet Protocol)。接下来我们主要讨论 IP。
IPv4 协议的报文格式如下:
| IP 版本(4 bits) | 首部长度(4 bits) | Type Of Service(8 bits) | lengtd(16 bits) | |
| identifier(16 bits) | Flags(3 bits) | Fragrant Offset(13 bits) | ||
| Time To Live(TTL,8 bits) | Upper Layer Protocol(8 bits) | Header Checksum(16 bits) | ||
| Sourece Address(32 bits) | ||||
| Destination Address(32 bits) | ||||
| Options(32 bits * n) | ||||
| Data(32 bits * n) | ||||
使用 IP 地址标识一个网络中的每个主机与路由器,但这些设备是使用网络接口(Interface)接入这个网络的,一台设备可能有多个接口并各自接入不同的网络,因此 IP 地址其实标记的是一个接口。
在 IPv4中,IP地址长度为32位,为便于书写,常分为四组,每组8位使用十进制数表示,各组间使用.分割,如我们熟悉的192.168.0.1。
为方便管理并提高 IP 地址使用率,有了“子网”(subnet)的概念。一个 IP 地址分为两部分:子网部分与主机部分,使用子网掩码来标识出子网部分:子网掩码值为 1 的位表示子网,值为 0 的位表示子网中的主机。
也可以使用 CIDR(Classless InterDomain Routing)表示一个 IP 地址及其分段。格式为a.b.c.d/x,x表示子网掩码1的数量。
对于每一个子网,其主机部分全为 0 的 IP 用于表示这个子网;全为 1 的 IP 地址用于广播。
可以由网络管理员手动为每台主机的每个接口配置 IP 地址,也可使用 DHCP(Dynamic Host Configuration Protocol)自动为网络内设备分配 IP 地址。
IPv4 的地址分为 A、B、C、D、E五类:
- A类:1.0.0.0/8 ~ 126.0.0.0/8
- B 类:128.1.0.0/16 ~ 191.255.0.0/16
- C 类:192.0.1.0/24 ~ 223.255.255.0/24
- D 类:组播地址,224.0.0.0 ~ 239.255.255.255
- E 类:试验地址,240.0.0.0 ~ 255.255.255.255
为了提高提高 IP 地址使用率,常使用 NAT(Network Address Translator,网络地址转换)技术使内网所有设备对外表现为一个 IP 地址,内网各个设备使用内网地址(10.0.0.0/8,172.16.0.0/16 ~ 172.31.0.0/16,192.168.0.0/24 ~ 192.168.255.0/24)互相访问。
一种非常常见的 NAT 方式为:接入公网的路由器将内网对外建立的连接的 IP 地址与端口修改为路由器公网 IP 和一个未使用的端口并记录该对应关系,完成后续通信。这称为 PAT、NAPT或 IP 伪装。
进行 NPAT 后内网设备不对外暴露,提高了内网安全性,但如果要让内网设备对外提供服务就需要进行 NAT 穿透(内网穿透)。
但是 NAT 这种做法是有争议的,如:
- 地址短缺问题应由 IPv6 解决
- 路由器应只处理三层
- 应用设计者应考虑 NAT 的存在
随着 IPv4 的一些问题逐渐暴露出来,有了新的网络层协议——IPv6,IPv6 使用 32 位地址标识网络接口、更改标头以优化对 QoS 的支持、禁止报文分片发送并将 IP 报文首部长度固定为 40 Bytes:
| IP 版本(4 bits) | Priority(8 bits) | Flow Label(20 bits) | ||
| Payload Len(16 bits) | next hdr(8 bits) | hop limit(8 bits) | ||
| Sourece Address(128 bits) | ||||
| Destination Address(128 bits) | ||||
| Data(32 bits * n) | ||||