Bootstrap

网络网络层IP协议

网络网络层IP协议

1. IP协议介绍

IP协议是一个网络层协议,网络层的工作就是在复杂的网络中确定一个合适的路径传输数据。IP地址提供了一种能力,将数据从一个主机跨网络可靠的送至另一个主机。

1.1 IP协议头格式

IP1

4位版本号(version): 指定IP协议的版本,对于IPv4来说这里就是4

4位头部长度(header length): 头部长度的单位是32bit(即 4byte),4位的最大表示是15,所以头部长度最大是 4 * 15 = 60byte

8位服务类型(Type Of Service): 包括3位优先权字段*(已弃用)*、4位 TOS 字段、1位保留字段(必须置为 0)。4位 TOS 字段分别为:最小延时、最大吞吐量、最高可靠性、最小成本,四者相互冲突,只能选中一个。

16总长度(total length): IP数据报整体占多少字节。

16位标识(id): 唯一标识的主机发送的报文,如果IP数据报被分片了,那么每一个片里的16位标识都是一样的。

3位标志字段: 第1位保留 (意思是现在没用) 。第2位为 1 表示禁止分片,如果此时报文长度超过了MTU(最大传输单元),IP模块就会丢弃报文。第3位表示分片标记,最后一个分片是置为0,其他分片置为 1(类似于一个结束标记位)。

13位片偏移(fragment offset): 分片相对于原始IP报文开始处的偏移,详细 ->点击跳转

8位生存时间(Time To Live): IP数据报在传输的过程中路线复杂,有环路问题。TTL是数据报到达目的地的最大报文跳数,一般是64。每经过一个路由,TTL--,一直减到 0 还没有到达目的地,这个报文就会被丢弃,以此来解决环路死循环。

8位协议号: 表示上层协议是UDP还是TCP(还是其他)。

16位头部校验和: 使用 CRC 进行校验,来鉴别头部是否损坏。

选择字段: 不定长,最多40字节。

2. 网段划分

2.1 网络号和主机号

IP地址分为两个部分,网络号和主机号,IP = 网络号 + 主机号。

网络号:保证相互连接的两个网段具有不同的标识。

主机号:同一个网段内,主机之间具有相同的网络号,但是必定具有不同的主机号。

**任意一个IP,一定隶属于某一个子网。**不同的子网,就是把相同网络号的主机放在一起统一管理,如果子网中新增一台主机,这台主机的网络号必须与这个子网的网络号一致,主机号必须与子网中其他的主机不同。

子网中IP的分配不是手动管理,而是通过 DHCP 技术,自动给子网新增的主机分配IP地址。一般的路由器都带有 DHCP 技术,所以路由器可以看作一个 DHCP 服务器。

特殊IP地址:

  • IP地址的主机号如果全是0,就成为了网络号,表示整个局域网。

  • IP地址中的主机号如果全是1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。

  • 127.*的IP地址用于本机环回(loop back)测试,通常是 127.0.0.1

2.2 IP地址的数量限制

IP地址(IPv4)是一个四字节32位的正整数,而TCP/IP协议规定,每一个主机都要有一个IP地址,那么理论上IP协议就能够给43亿个主机分配IP地址。

但由于一些特殊IP地址的存在,能分配的IP地址数量远没有43亿个,且IP地址不是按照主机的数量来分配的,而是每一个网卡都需要一个或多个IP地址。

为解决IP地址数量不足问题,一些技术被应用在IP协议中:

子网掩码:CIDR 技术的子网掩码一定程度上缓解了IP地址不足的问题,提高了IP地址的利用率、减少了浪费。

动态分配IP地址:只给接入网络的设备分配 IP 地址。因此同一个 MAC 地址的设备,每次接入互联网中,得到的 IP 地址不一定是相同的。

NAT技术:NAT、内网穿透、vpn

2.3 子网掩码

过去提出过一种划分网络号和主机号的方案,把IP分为五类:

IP2

A 类 0.0.0.0127.255.255.255 B 类 128.0.0.0191.255.255.255

C 类 192.0.0.0223.255.255.255 D 类 224.0.0.0239.255.255.255

E 类 240.0.0.0247.255.255.255

A类和B类IP地址的子网,都能允许大量的主机存在,但现实是一个子网中绝对不会有这么多的主机,所以随着互联网的高速发展,大多数组织都申请B类地址,导致B类地址很快就被分配完了,但是却同时造成了大量的IP地址的浪费。

针对这种情况,新的划分方案 CIDR(Classless Inter Domain Routing),引入了子网掩码的概念。

子网掩码(subnet mask)用于区分网络号和主机号,是一个32位的正整数,通常用一串 0 来结尾。将IP地址和子网掩码进行 按位与 操作就能得到网络号。从此,网络号和主机号的划分就与A类、B类还是C类地址无关。

IP地址和子网掩码有一种间接的表示方法,IP/n:

140.252.20.68/24,表示IP地址为140.252.20.68。子网掩码的高 24 位都是 1,其余 8位都是 0,即 255.255.255.0

3. 私有IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不是直接连接到 Internet 上,那么局域网内主机的IP地址就需要考虑重复了,RFC 1918就规定了用于组建局域网的私有IP地址的格式:

10.*,前8位是网络号,共可以有 16,777,216 个地址。

这种10开头的IP地址一般常见于校园网等地方。

172.16*172.31.*,前12位是网络号,共可以有 1,048,576个地址。

192.168.*,前16位是网络号,共可以有 65,536 个地址。

这种IP地址常见于家用路由器分配的IP地址

包括在这个范围中的IP地址,都是私有IP,其余的全部是全局IP(或称公网IP)

3.1 路由器

一个路由器可以配置两个IP地址, WAN口 IP 和 LAN口 IP(子网IP)

WAN口 IP的地址由运营商分配并统一管理,这些WAN口IP又作为运营商大路由器的子网中的一个节点,在子网之上还有另一个子网,这样的运营商路由器可能会有很多级。最外层的运营商路由器的WAN口 IP 就是一个公网 IP 了。

路由器LAN口连接的主机,都属于当前路由器的子网当中,这个LAN口IP(子网IP)通常都是 192.168.1.1,子网内主机的IP地址不能重复,但是子网之间的IP地址可以重复。

3.2 路由和NAT技术

路由,即在复杂的网络结构中,找到一条通往终点的路。实现路由功能的设备就是路由器,路由器既能构建子网,也能在网络传输中的过程中,作为运营商大子网的一个个节点,报文在各个节点之间跳跃,直至抵达终点,就是路由的全过程。

子网内的主机需要和外网通信时,路由器怎么知道IP报文是给子网中的主机的,还是给外网中的主机的呢?

当 IP 数据包到达路由器时,路由器会先查看目的 IP。路由器根据目的 IP 决定数据包是直接发送给子网中的目标主机,还是发送给下一个路由器。下一个路由器,也会查看 IP 数据包里的目的 IP,如此反复。直到到达目标 IP 地址。

在路由器中,管理着一份路由表,这份路由表在子网中的主机都能获取到,它包含了局域网中所有主机的IP地址。子网中的主机与外网通信,其发送的IP报头必定包含着对方主机的 IP 地址,这个 IP 地址在路由表中遍历匹配路由条目,如果能够匹配就发送给匹配的 IP 地址,即使不匹配也有缺省路由条目将其交给下一个路由器处理。

IP3

命令route查看当前路由器的路由表

Destination: 目的网络地址

Gateway: 下一跳 IP 地址

Genmask: 子网掩码,目的 IP 与子网掩码做按位与运算,得出结果等于 Destination 就表示匹配。

Iface: 发送接口,当路由表条目与目的 IP 匹配后,就通过该接口发送出去。

Flags: U 标志表示此条目有效(可以禁用), G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络是与本机接口直接连接的网络,不必经过路由器转发。 H 标志表示目标地址是一个主机。

default: 为缺省路由条目,当遍历完路由表其他条目后没有匹配的IP地址,就走这里。

而子网主机发往外网的IP报头中的srcIP,肯定是子网中的IP地址,但这个IP地址在公网上肯定是无效的。所以路由器在把子网主机的报文发往外网时,还需要进行一项工作,将IP报头中的srcIP地址替换为 WAN 口 IP,经过层层替换,最终报头中的IP地址变成一个公网IP。这种报文在转发的过程中不断替换srcIP的技术就叫做NAT(Network Address Translation,网络地址转换),NAT转换只在内网做转换。

任何主机,都有能力知道自己直连的网络号是多少。

4. IP分片和组装

数据链路层规定,MUT (Maximum Transmission Unit,最大传输单元)是 1500 字节,大于 MUT 的内容都会被丢弃。但如 TCP 协议的报文上限大小是 65535 字节,所以 IP 协议想要既不得罪传输层也不得罪数据链路层,就需要对大于 1500 字节的报文(包括 IP 封装报头后的大小)进行分片

4.1 分片过程

在 IP 报头中,16位总长度记录了 IP 数据报的总长度(包括分片),13位片偏移记录了分片的偏移量(从有效载荷开始算)。当传输层送过来的数据报,加上 IP 头,总长度超过了 1500 字节, IP 协议就要对其进行分片。

例如此时总长度为 3000 字节,IP 头占 20 字节(假设没有选项),IP 协议在分片时,并不是把 3000 字节分成两个 1500 字节的片,因为这 3000 字节中,包含了 IP 头的 20 字节,传输层送过来的数据报总大小是 2980 字节,而每一个片,都要包含一个 IP 头,否则 IP 协议就不知道每一个片的具体信息。所以分出来的片,还需要加上 20 字节的 IP 头,所以分片的总大小是 3040 字节。

IP4

假如 IP 数据报的总大小超过了13位,怎么办呢?

如果ip报文真的非常大,13位片偏移不够直接表示。所以 IP 协议规定,在写入时偏移量要右移三位(>>3)相当于除以8,读取时偏移量左移三位(<<3)相当于乘以 8,低三位补 0 凑够16位,所以低三位原本就必须是 0,在十进制中的体现就是必定是 8 的倍数,所以 IP 报文的总长度必须是8的倍数。(1480能整除8)

4.2 组装过程

在同一组分片的 IP 头中,16位标识必须是一致的,用于区分哪些片是同一组;而13位片偏移一定是不同的,用于将不同的片在组装时能够按顺序组装;3位标志用于标记分片是不是尾分片,最后一个分片是置为0,其他分片置为 1(类似于一个结束标记位)。

当对方端的网络层收到陆续送过来的 IP 分片后,依靠片偏移的大小作升序排序,再依靠更多分片标志位判断是否还有分片,就可以对其进行组装了。

IP5

片偏移是偏移量除以8

4.4 注意事项

网络层没有超时重传和高速重发之类的机制,如果 IP 分片丢一个片就相当于丢了整个包。发生丢包就只能整个重传,为了防止过多的片增加丢包概率,传输层的滑动窗口一个段不会超过最大传输单元(包括 IP 协议封装后的大小)。 从而避免 IP 协议对数据报进行分包操作。

;