IP协议
# 格式

- 4 位版本号(version):指定 IP 协议的版本(IPv4/IPv6)
- 4 位首部长度(header length):表示 IP 报头的长度,以 4 字节为单位。
- 8 位服务类型(Type Of Service):3 位优先权字段(已经弃用),4 位 TOS 字段,和 1 位保留字段(必须置为 0)。4 位 TOS 分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于 ssh/telnet 这样的应用程序,最小延时比较重要,而对于 ftp 这样的程序,最大吞吐量比较重要。
- 16 位总长度(total length):IP 报文(IP 报头 + 有效载荷)的总长度,用于将各个 IP 报文进行分离。
- 16 位标识(id):唯一的标识主机发送的报文,如果数据在 IP 层进行了分片,那么每一个分片对应的 id 都是相同的。
- 3 位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过 MTU,IP 模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为 0,如果报文进行了分片,则除了最后一个分片报文设置为 0 以外,其余分片报文均设置为 1。
- 13 位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值 × 8 \times 8×8 得到的。因此除了最后一个报文之外,其他报文的长度必须是 8 的整数倍,否则报文就不连续了。
- 8 位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是 64,每经过一个路由,TTL -= 1,一直减到 0 还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
- 8 位协议:表示上层协议的类型。
- 16 位首部检验和:使用 CRC 进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
- 32 位源 IP 地址和 32 位目的 IP 地址:表示发送端和接收端所对应的 IP 地址。
- 选项字段:不定长,最多 40 字节。
# 载荷分离和交付上层
- 载荷分离
与 tcp 协议类似,ip 协议标准长度为 20 字节,先读取 20 字节,转换为结构化数据提取标准报头中的 4 位首部长度 x,后续报头的剩余大小 = 4 * x - 20,将报头读取完毕后,剩下的就是有效载荷了。 - 交付上层
IP 就是根据 8 位协议(上层协议的编号)判定应该将分离出来的有效载荷交付给上层的哪一个协议的。
# 分片与组装
在路由器中,传递的是 IP 报文,但是真正在网络上“跑”的是数据链路层,数据链路层中的 MAC 帧协议中规定有效载荷不能超过 1500 字节(MTU,可修改)。IP 层对于大的报文的解决方式就是分片和组装。
- 分片:自己的 IP 层
- 组装:对端的 IP 层
同一报文的分片用16 位标识来标识;第一个分片:更多分片为 1,片偏移为 0;最后一个分片:更多分片为 0,片偏移大于 0;组装的时候,按照片偏移升序排序即可。
# 网段划分
# IP 构成
IP = 网络号 + 主机号
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
例如:ip 为192.168.128.10/23,其中192.168.128是网络标识,10是主机标识,24表示从头到第几位属于网络标识;此外,同一网段内,网络标识是相同的,但是主机标识不同。
对于管理 IP 地址的分配和回收采用 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术。DHCP 是一个基于 UDP 的应用层协议,一般的路由器都带有 DHCP 功能,因此路由器也可以看作一个 DHCP 服务器。
# 网络分段
- 过去:过去提出的方案, 把所有 IP 地址分为五类:如 A 类:0.0.0.0 到 127.255.255.255...
- 现在:提出了新的划分方案, 称为 CIDR:
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
- 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关
任何一台主机或路由器在看到一个 IP 地址时,先结合子网掩码(Subnet Mask)来判断这个 IP 地址属于哪个网络(网段),在确定了目标 IP 地址属于哪个网络之后,才会在这个特定的网络内部去定位那台具体的主机,IP 地址中那些在子网掩码中对应为 0 的比特位,就是主机位。这些主机位的值唯一地标识了该网络中的一台特定设备。
# 特殊的 IP
- 将 IP 地址中的主机地址全部设为 0,就成为了网络号,代表这个局域网。
- 将 IP 地址中的主机地址全部设为 1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1。
# 私网 IP 和公网 IP
规范中私有 IP 规定如下:
10.*,前 8 位是网络号,共 16,777,216 个地址172.16.到172.31.,前 12 位是网络号,共 1,048,576 个地址192.168.*,前 16 位是网络号,共 65,536 个地址
其余的则称为全局 IP (或公网 IP)
# 路由

路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程。所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间。每个节点内部维护的路由表判定当前这个数据包该发送到哪里。