TCP/IP详解 卷1:协议 第3章 IP网际协议 - 不可靠无连接的数据报传输
Executive Summary
核心观点(金字塔原理)
结论先行: IP协议是不可靠、无连接的网络层协议,通过逐跳路由实现数据报传输,错误处理依赖ICMP,可靠性由上层协议(如TCP)保证。
支撑论点:
- 不可靠性: IP不保证数据报成功到达,发生错误时丢弃数据报并发送ICMP消息
- 无连接性: 每个数据报独立处理,不维护状态信息,接收顺序可能与发送顺序不同
- 路由选择: 采用逐跳路由,目的IP不变但链路层地址每站可变,路由表按主机路由>网络路由>默认路由优先级选择
SWOT 分析
| 维度 | 分析 |
|---|---|
| S 优势 | 简单高效、无连接开销、子网划分缩小路由表规模、灵活的路由选择机制 |
| W 劣势 | 不保证可靠传输、数据报可能乱序到达、需要上层协议保证可靠性 |
| O 机会 | 通过ifconfig/netstat命令进行网络诊断,子网掩码灵活划分网络 |
| T 威胁 | 网络故障导致数据丢失、路由错误导致数据无法到达、IP地址资源耗尽 |
适用场景
- 理解网络层协议设计原理
- 网络故障排查与诊断(使用ifconfig/netstat命令)
- 子网规划与IP地址分配
IP层是怎么实现网络中传输的?有哪些策略保证尽力为的传输服务?如果发送特殊情况比如断电,噪声信号等等是怎么处理的?
- 不可靠(unreliable)不保证IP数据报能成功地到达目的地,IP尽力而为的传输服务,如果发生错误时,IP有个简单的错误处理算法,丢弃该数据报,然后发送ICMP消息报给信源端,任何要求的可靠性必须由上层提供,比如TCP
- 无连接(connectionless)IP层不维护任何关于后续数据报的状态信息,每一个报文的处理都是相互独立的,也说明IP数据报可以不按发送顺序接收,比如发送端顺序为A,B,接收端有可能先接收到B,再A,因为每个IP数据报都独立进行路由选择。
IP首部
- IP首部最小长度为20字节(不含选项字段),包含以下关键字段:4位版本号(IPv4/IPv6)、4位首部长度(IHL,以4字节为单位)、8位服务类型(TOS)、16位总长度(整个数据报的字节数,最大65535字节)
- 16位标识(Identification)用于唯一标识主机发送的每一份数据报,通常每发送一份报文其值加1;3位标志(Flags)和13位片偏移(Fragment Offset)用于IP分片与重组
- 8位生存时间(TTL)设置数据报可经过的最多路由器数,每经过一个路由器值减1,减为0时数据报被丢弃并发送ICMP超时消息;8位协议字段标识上层协议类型(TCP=6,UDP=17,ICMP=1)
- 16位首部校验和仅校验IP首部(不包含数据部分),每经过一个路由器都需要重新计算;32位源IP地址和32位目的IP地址各占4字节;选项字段(Options)可变长,用于安全、记录路由、时间戳等功能
IP路由选择
- IP路由选择的核心决策:如果目的主机与发送主机在同一个直连网络上,则直接交付(Direct Delivery);否则将数据报转发给下一跳路由器(Next-Hop Router),由路由器继续做转发决策
- 路由表中每个表项包含:目的地址(Destination)、下一跳网关(Gateway)、标志位(Flags,如U表示路由可用、G表示需经网关转发、H表示目的为主机)、网络接口(Interface)
- 路由选择采用逐跳(Hop-by-Hop)方式,数据报在传输过程中目的IP地址始终不变,但每经过一站,封装的链路层目的地址都会改变为下一跳的链路层地址
- 路由表查找优先级:主机路由(Host Route,精确匹配目的IP)> 网络路由(Network Route,匹配网络号)> 默认路由(Default Route,0.0.0.0),无匹配时返回”主机不可达”或”网络不可达”ICMP错误
子网寻址
- 子网寻址是从主机号(Host ID)中借用若干位作为子网号(Subnet ID),将一个较大的网络划分为多个较小的子网,对外部路由器透明,内部路由器根据子网号进行转发
- 引入子网后,IP地址形成三级层次结构:网络号(Network ID)+ 子网号(Subnet ID)+ 主机号(Host ID),例如B类网络可以借用8位主机号划分出最多254个子网
- 子网划分的优势在于缩小路由表规模,多个子网对外仅需一个路由表项即可到达,同时便于组织内部网络管理和安全隔离
- 可变长子网掩码(VLSM,Variable Length Subnet Mask)允许同一网络中不同子网使用不同长度的子网掩码,更灵活高效地分配IP地址,减少地址浪费
子网掩码
- 子网掩码(Subnet Mask)是一个32位的值,网络号和子网号对应的位全部置1,主机号对应的位全部置0,例如C类默认子网掩码为255.255.255.0
- 将IP地址与子网掩码进行按位与(AND)运算,即可得到该IP所属的网络地址(子网地址),例如192.168.1.100 AND 255.255.255.0 = 192.168.1.0
- CIDR(无类别域间路由)表示法用”IP/前缀长度”简化子网掩码的书写,例如192.168.1.0/24等价于子网掩码255.255.255.0,/25表示掩码255.255.255.128,将网络一分为二
- 给定子网掩码可计算可用主机数:2^(主机位数) - 2(减去全0的网络地址和全1的广播地址),例如/24网络有254个可用主机地址,/26网络有62个可用主机地址
特殊情况的IP地址
- 0.0.0.0 表示”本网络本主机”,仅在系统启动时(如DHCP请求)作为源地址使用;网络号为全0的地址(如0.0.0.1)表示本网络中的特定主机
- 255.255.255.255 为受限广播地址(Limited Broadcast),数据报不会被路由器转发,仅在本地网络内广播;网络号+全1主机号(如192.168.1.255)为定向广播地址(Directed Broadcast),可被路由器转发到目标网络
- 127.0.0.0/8 为环回地址(Loopback),其中最常用的是127.0.0.1,发往该地址的数据不会出现在任何网络上,在IP层内部完成处理,常用于本地测试
- 私有地址范围不在Internet上路由:10.0.0.0/8(A类)、172.16.0.0/12(B类,172.16.0.0-172.31.255.255)、192.168.0.0/16(C类);169.254.0.0/16 为链路本地地址(Link-Local),在DHCP获取失败时自动配置
ifconfig命令
- ifconfig(Interface Configuration)用于显示和配置网络接口信息,输出包含接口的IP地址(inet addr)、子网掩码(Mask)、广播地址(Bcast)、最大传输单元(MTU)等
- 接口标志(Flags)指示接口状态:UP表示接口已启用、RUNNING表示接口正在运行、BROADCAST表示支持广播、MULTICAST表示支持多播、LOOPBACK表示环回接口
- 可查看每个接口的收发统计信息,包括接收/发送的数据包数(RX/TX packets)、错误数(errors)、丢弃数(dropped)、溢出数(overruns)等,有助于排查网络故障
- 常用操作:
ifconfig eth0 up/down启用或关闭接口,ifconfig eth0 192.168.1.10 netmask 255.255.255.0配置接口的IP地址和子网掩码
netstat命令
netstat -r显示内核路由表,包含目的网络、网关、子网掩码、标志、网络接口等信息,等价于route -n,是排查路由问题的常用手段netstat -i显示所有网络接口的统计信息,包括MTU、接收/发送的数据包数、错误数、丢弃数等,可快速判断接口是否存在丢包或错误netstat -an显示所有网络连接和监听端口,不进行DNS解析(-n),包含协议、本地地址、远程地址、连接状态(ESTABLISHED、LISTEN、TIME_WAIT等)netstat -s按协议分类显示统计信息(IP、ICMP、TCP、UDP),包括收发的数据报总数、错误数、重传次数等,对协议层面的性能分析非常有用
IP的未来
- IPv4地址空间仅有约43亿个地址(2^32),随着互联网爆发式增长已面临严重的地址枯竭问题,虽然NAT和CIDR暂时缓解了压力,但根本解决方案是过渡到IPv6
- IPv6采用128位地址(2^128),提供了几乎无限的地址空间;同时简化了首部格式(固定40字节,取消首部校验和),提高了路由器的转发效率
- IPv6内置IPSec支持,提供端到端的认证和加密能力;支持无状态地址自动配置(SLAAC),主机可根据路由器通告自动生成全局唯一的IPv6地址,简化了网络管理
-
IPv4到IPv6的过渡机制包括:双栈(Dual-Stack,同时运行IPv4和IPv6协议栈)、隧道技术(Tunneling,在IPv4网络中封装IPv6数据报)、NAT64/DNS64(实现IPv6节点与IPv4节点之间的通信)
- IP路由选择,如果目的主机在直接相连接的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器
- 在进行路由选择决策时,主机和路由器都使用路由表,在表中有三种类型的路由,特定主机型,特定网络型,默认路由型。路由表中的表目具有一定的优先级,在选择路由时,主机路由由优先于网络路由,最后在没有其它可选路由存在时才选择默认路由。
- IP路由选择都时通过逐跳来实现的,数据报在各站的传输过程中目的IP地址不变,但是封装和目的的链路层地址在每一站都可以改变,大多数的主机和许多路由器对于非本地网络的数据报都使用默认的下一站路由器。最后子网的划分缩小了Internet路由表的规模,因为许多网络经常可以通过单个表目就可以访问了。接口和网络有关信息可以通过ifconfig , netstat命令获得,包括接口的IP地址,子网掩码,广播地址,MTU等