下篇:网络层、数据链路层与应用层:IP、NAT、ARP、DNS 一网打尽
传输层解决了"端到端"的可靠性问题,但数据包如何在复杂网络中找路?
本篇从网络层 IP 协议讲起,再到数据链路层以太网、MAC、MTU、ARP,最后落到应用层 DNS 与 NAT 技术。
一、网络层:在复杂环境中确定路径
网络层的作用:在复杂的网络环境中确定一个合适的路径。
基本概念:
- 主机:配有 IP 地址,但不进行路由控制的设备。
- 路由器:既配有 IP 地址,又能进行路由控制。
- 节点:主机和路由器的统称。
IP 协议头格式
IP 首部关键字段:
- 4 位版本号:IPv4 为 4。
- 4 位头部长度:IP 头部长度是多少个 32bit,最大 15,因此 IP 头部最大 60 字节。
- 8 位服务类型:包括最小延时、最大吞吐量、最高可靠性、最小成本等,四者冲突,只能选一个。
- 16 位总长度:IP 数据报整体占多少字节。
- 16 位标识:唯一标识主机发送的报文。如果 IP 报文在数据链路层被分片,每个分片的 id 相同。
- 3 位标志字段:第二位为 1 表示禁止分片;第三位表示"更多分片"。
- 13 位分片偏移:分片相对于原始 IP 报文开始处的偏移,实际偏移字节数是该值 ×8。
- 8 位生存时间 TTL:数据报到达目的地的最大报文跳数,一般是 64。每经过一个路由,TTL 减 1,减到 0 还没到达就丢弃。用于防止路由循环。
- 8 位协议:表示上层协议类型。
- 16 位头部校验和:CRC 校验,鉴别头部是否损坏。
- 32 位源地址和 32 位目标地址。
- 选项字段:不定长,最多 40 字节。
二、地址管理:网络号与主机号
IP 地址分为两部分:
- 网络号:保证相互连接的两个网段具有不同标识。
- 主机号:同一网段内,主机之间具有相同网络号,但必须有不同的主机号。
通过合理设置主机号和网络号,可以保证在相互连接的网络中,每台主机的 IP 地址都不相同。
手动管理子网内 IP 很麻烦,于是有 DHCP 技术,能自动给子网内新增主机节点分配 IP 地址。
一般路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器。
分类划分方案
过去曾把所有 IP 地址分为五类:
- A 类:0.0.0.0 到 127.255.255.255
- B 类:128.0.0.0 到 191.255.255.255
- C 类:192.0.0.0 到 223.255.255.255
- D 类:224.0.0.0 到 239.255.255.255
- E 类:240.0.0.0 到 247.255.255.255
随着 Internet 飞速发展,这种划分方案局限性显现:大多数组织申请 B 类地址,导致 B 类很快分配完,而 A 类浪费大量地址。
CIDR 与子网掩码
新的划分方案叫 CIDR:
- 引入额外的子网掩码来区分网络号和主机号。
- 子网掩码是 32 位正整数,通常以一串"0"结尾。
- 将 IP 地址和子网掩码进行"按位与"操作,得到的结果就是网络号。
- 网络号和主机号的划分与 IP 地址是 A 类、B 类还是 C 类无关。
例如:
- IP:140.252.20.68
- 子网掩码:255.255.255.0
- 网络号:140.252.20.0
- 子网地址范围:140.252.20.0 ~ 140.252.20.255
更简洁的表示:140.252.20.68/24,表示子网掩码高 24 位是 1。
特殊 IP 地址
- 主机地址全 0:网络号,代表这个局域网。
- 主机地址全 1:广播地址,用于给同一链路中所有主机发送数据包。
- 127.*:本机环回测试,通常是 127.0.0.1。
私有 IP 与公网 IP
RFC1918 规定了用于组建局域网的私有 IP 地址:
- 10.*,前 8 位是网络号,共 16,777,216 个地址。
- 172.16. 到 172.31.,前 12 位是网络号,共 1,048,576 个地址。
- 192.168.*,前 16 位是网络号,共 65,536 个地址。
包含在这些范围中的都称为私有 IP,其余称为全局 IP 或公网 IP。
三、NAT 与 NAPT:解决 IP 不够用
一个路由器可以配置两个 IP 地址:
- WAN 口 IP
- LAN 口 IP(子网 IP)
路由器 LAN 口连接的主机,都从属于当前路由器的子网。
不同路由器的子网 IP 通常一样,比如 192.168.1.1。子网内主机 IP 不能重复,但子网之间可以重复。
子网内主机需要和外网通信时,路由器将 IP 首部中的 IP 地址进行替换,替换成 WAN 口 IP。
这样逐级替换,最终数据包中的 IP 地址成为一个公网 IP。这种技术称为 NAT。
如果局域网内多个主机都访问同一个外网服务器,服务器返回数据的目的 IP 都相同。
NAT 路由器如何判定转发给哪个局域网主机?
这时使用 NAPT ,用 IP + port 来建立关联关系。
这种关联关系由 NAT 路由器自动维护。TCP 建立连接时生成表项,断开连接后删除表项。
NAT 的优缺点:
- 优点:不需要更新硬件设备,只更新软件,就可以解决 IP 地址不够用的问题。
- 缺点:无法从 NAT 外部向内部服务器建立连接;转换表生成和销毁有额外开销;通信过程中一旦 NAT 设备异常,即使存在热备,所有 TCP 连接也可能断开。
四、路由选择:一跳一跳问路
路由的过程,是一跳一跳"问路"的过程。
所谓"一跳",就是数据链路层中的一个区间,具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。
IP 数据包到达路由器时,路由器先查看目的 IP,决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器。
依次反复,一直到达目标 IP 地址。
如何判定当前数据包该发送到哪里?依靠每个节点内部维护的路由表 。
路由表可以使用 route 命令查看。
如果目的 IP 命中了路由表,就直接转发。
路由表最后一行主要由下一跳地址和发送接口组成,当目的地址与其他行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
五、数据链路层:以太网、MAC、MTU 与 ARP
认识以太网
"以太网"不是一种具体网络,而是一种技术标准。
既包含数据链路层内容,也包含一些物理层内容,例如网络拓扑结构、访问控制方式、传输速率等。
以太网是当前应用最广泛的局域网技术。
以太网帧格式:
- 目的地址:6 字节
- 源地址:6 字节
- 类型:2 字节
- 数据:46~1500 字节
- CRC:4 字节
源地址和目的地址指网卡硬件地址,也叫 MAC 地址,长度 48 位,网卡出厂时固化。
帧协议类型字段有三种值,分别对应 IP、ARP、RARP。
帧末尾是 CRC 校验码。
MAC 地址与 IP 地址的区别
- IP 地址描述的是路途总体的起点和终点。
- MAC 地址描述的是路途上的每一个区间的起点和终点。
MTU
MTU 相当于发快递时对包裹尺寸的限制。
以太网帧中的数据长度规定最小 46 字节,最大 1500 字节。最大值 1500 称为以太网的最大传输单元 MTU。
MTU 对 IP 协议的影响:
- 较大的 IP 数据包要进行分片。
- 每个小包 IP 协议头的 16 位标识都相同。
- 到达对端后再按顺序重组。
- 一旦任意小包丢失,接收端重组就会失败,但 IP 层不会负责重新传输数据。
MTU 对 UDP 协议的影响:
- UDP 携带数据超过 1472(1500 - 20 IP 首部 - 8 UDP 首部),就会在网络层分成多个 IP 数据报。
- 任意一个丢失,都会引起接收端网络层重组失败,整个数据丢失概率大大增加。
MTU 对 TCP 协议的影响:
- TCP 单个数据报最大消息长度称为 MSS。
- TCP 建立连接过程中,通信双方会进行 MSS 协商。
- 双方在发送 SYN 时会在 TCP 头部写入自己能支持的 MSS 值,然后选择较小的作为最终 MSS。
ARP 协议
ARP 不是单纯的数据链路层协议,而是介于数据链路层和网络层之间的协议。
ARP 协议建立了主机 IP 地址和 MAC 地址的映射关系。
工作流程:
- 源主机发出 ARP 请求,询问"IP 地址是 X 的主机的硬件地址是多少",并将请求广播到本地网段。
- 目的主机接收到广播 ARP 请求,发现 IP 与本机相符,则发送 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中。
- 每台主机都维护一个 ARP 缓存表,可以用
arp -a查看。表项有过期时间,一般 20 分钟。
六、应用层:DNS 与 URL 过程
DNS 是一整套从域名映射到 IP 的系统。
TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序,但 IP 地址不方便记忆。
于是人们发明了主机名,并使用 hosts 文件描述主机名和 IP 地址的关系。
DNS 是应用层协议,底层使用 UDP 进行解析,浏览器会缓存 DNS 结果。
浏览器中输入 URL 后发生的事情,是一个经典面试题,没有固定答案,越详细越好。
可以围绕 DNS 解析、TCP 连接、HTTP 请求、服务器处理、HTTP 响应、浏览器渲染、连接关闭等步骤展开。
七、全文总结与面试重点
数据链路层
- 作用:两个设备(同一种数据链路节点)之间传递数据。
- 以太网是一种技术标准。
- 理解以太网帧格式、MAC 地址、ARP 协议、MTU。
网络层
- 作用:在复杂网络环境中确定合适路径。
- 理解 IP 地址、IP 地址与 MAC 地址区别。
- 理解 IP 协议格式。
- 了解网段划分方法。
- 理解如何解决 IP 数目不足:CIDR、NAT、IPv6。
- 理解私有 IP 和公网 IP。
- 理解路由过程、IP 数据包分片原因、NAT 工作原理。
传输层
- 作用:负责数据从发送端传输到接收端。
- 理解端口号概念。
- 认识 UDP,了解其特点。
- 认识 TCP,理解可靠性、状态转化。
- 掌握连接管理、确认应答、超时重传、滑动窗口、流量控制、拥塞控制、延迟应答、捎带应答。
- 理解 TCP 面向字节流、粘包问题及解决方案。
- 能够基于 UDP 实现可靠传输。
- 理解 MTU 对 UDP/TCP 的影响。
应用层
- 作用:满足日常需求的网络程序都在应用层。
- 能够根据需求设计应用层协议。
- 理解 DNS 原理和工作流程。
TCP 之所以复杂,是因为它既要保证可靠性,又要尽可能提高性能。
可靠性靠:校验和、序列号、确认应答、超时重发、连接管理、流量控制、拥塞控制。
提高性能靠:滑动窗口、快速重传、延迟应答、捎带应答。
其他还有:超时重传定时器、保活定时器、TIME_WAIT 定时器等。
下篇小结
本篇从网络层 IP 协议出发,覆盖了:
- IP 协议头与地址管理
- CIDR、私有 IP、公网 IP
- NAT 与 NAPT
- 路由选择
- 数据链路层以太网、MAC、MTU、ARP
- 应用层 DNS 与 URL 过程
- 全文面试重点总结
至此,TCP/IP 网络原理的上、中、下三篇博客全部完成。
建议复习时按"分层"建立知识树:应用层 → 传输层 → 网络层 → 数据链路层,再横向串联端口、五元组、TCP 可靠性、UDP、IP、NAT、ARP、DNS 等核心概念。