IP协议处于五层模型(也可以说七层模型)中的网络层,网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。上一篇文章中我们讲到了TCP(传输层)会认为它负责将数据从一个设备传输到另一个设备,事实上它并不负责,TCP只是保障如何端到端的将报文完整的达到,而不负责怎么送达,IP协议的任务就是负责将报文如何通过一跳一跳的中间节点送达到目的地。
一:IP协议的特点
1,无连接性
IP协议是一种无连接的协议,不需要像TCP一样在传输数据之前需要建立连接。这意味着每个IP数据包都是独立的,IP数据包可以按照任意顺序发送,并可以根据中间路由节点选择不同的路径进行传输
2,不可靠性
IP协议是一种不可靠的协议,它给自己的定位就是尽力将报文送到下一跳,但它不能提供数据包的可靠传输,没有TCP的各种可靠传输的手段(如超时重传),虽然IP有检验数据包的能力,当数据包在传输过程中丢失、损坏或重复时,IP协议没有机制来修复或重新传输这些数据包。但是分层不同能力各有特点,TCP可以保障数据能正确到达,IP的这种设计可以提高网络的灵活性和效率,而不用追求大而全的功能。
3,分组和交换
IP协议使用分组交换方式传输数据。数据被分为合适的数据包,每个数据包都带有源地址和目标地址。数据包可以通过不同的路径进行传输,从而提高网络的可靠性和可扩展性。
4,网络独立性
IP协议可以在不同类型的网络上运行,包括以太网、无线网络等。这意味着IP协议可以跨越不同的网络进行通信,来连接不同类型的网络设备,使其互通互联。
5,简单性
IP协议被设计为简单的协议。它的功能有限,聚焦于数据包的路由功能。
二:IP首部格式
IP首部的格式对于IPV4和IPV6大体是一样的,但是也有细微的区别。
本次只详细讲解IPv4的首部格式
下面对IPv4的首部各个字段进行详细解释:
1,版本(Version)
占用 4 bit,标识目前采用的IP协议的版本号,一般取值为 0100(IPv4)和 0110(IPv6)。
2,首部长度(Header Length)
占用 4 bit,即 IP 报头长度,这个字段的作用是为了描述 IP 报头的长度。由于在 IP 报头中有变长的可选部分,为了能多表示一些长度,因此采用 4 字节(32 bit)为本字段数值的单位,比如,4 bit 最大能表示为 1111,即 15,单位是 4 字节,因此最多能表示的长度为 15×4=60 字节。
3,服务类型(Type of Service,TOS)
占用 8 bit,可用 PPP、D、T、R、C、0 这 8 个字符来表示,其中,PPP定义了数据报的优先级,取值越大表示数据越重要,取值如下表所示。
ppp 取值 | 含 义 |
---|---|
000 | 普通(Routine) |
001 | 优先(Priority) |
010 | 立即(Immediate) |
011 | 闪速(Flash) |
100 | 疾速(Flash Override) |
101 | 关键(Critic) |
110 | 网间控制(Internetwork Control) |
111 | 网络控制(Network Control) |
- D:时延,0 表示普通,1表示延迟尽量小;
- T:吞吐量,0 表示普通,1表示流量尽量大;
- R:可靠性,0 表示普通,1表示可靠性尽量大;
- C:传输成本,0 表示普通,1表示成本尽量小;
- 0:这是最后一位,被保留,恒定为 0;
4,总长度
占用 16 bit,该字段表示以字节为单位的 IP 数据报的总长度(包括 IP 报头部分和 IP 数据部分)。如果该字段全为 1,就是最大长度了,即 216-1= 65535字节≈63.9990234375KB,有些教程上写最大是 64KB,其实是达不到的,最大长度只能是 65535 字节,而不是 65536 字节。
5,标识
占用 16 bit。在协议栈中保持着一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。
注意这个“标识符”并不是序号,IP 是无连接服务,数据报不存在按序接收的问题。当 IP 数据报由于长度超过网络的 MTU(Maximum Transmission Unit,最大传输单元)而必须分片(把一个大的网络数据报拆分成一个个小的数据报)时,这个标识字段的值就被复制到所有的小分片的标识字段中。相同的标识字段的值使得分片后的各数据报片最后能正确地重装成为原来的大数据报。该字段占用 16 bit。
6,标志(Flags)
占用 3 bit,该字段最高位不使用,第二位称 DF(Don't Fragment)位,DF 位设为 1 时表明路由器不对该上层数据报分片。如果一个上层数据报无法在不分段的情况下进行转发,则路由器会丢弃该上层数据报并返回一个错误信息。最低位称 MF(More Fragments)位,为 1 时说明这个 IP 数据报是分片的,并且后续还有数据报;为 0 时说明这个 IP 数据报是分片的,但已经是最后一个分片了。
7,片偏移
占用13 bit,该字段的含义是某个分片在原 IP 数据报中的相对位置。第一个分片的偏移量为 0。片偏移以 8 个字节为偏移单位。这样,每个分片的长度一定是 8 字节(64 位)的整数倍。
8,生存时间(TTL,Time to Live,也称存活时间)
占用8 bit。表示数据报到达目标地址之前的路由跳数。TTL 是由发送端主机设置的一个计数器,每经过一个路由节点就减 1,减到为 0 时,路由就丢弃该数据报,向源端发送 ICMP 差错报文。这个字段的主要作用是防止数据报不断在 IP 互联网络上循环转发
9,协议
占用8 bit。该字段用来标识数据部分所使用的协议,比如取值1表示 ICMP、取值 2 表示 IGMP、取值 6 表示 TCP、取值 17 表示 UDP、取值 88 表示 IGRP、取值 89 表示 OSPF。
10,首部校验和(Header Checksum)
占用16 bit。该字段用于对 IP 头部的正确性检测,但不包含数据部分。由于每个路由器会改变 TTL 的值,所以路由器会为每个通过的数据报重新计算首部校验和。
11,源IP地址和目的IP地址
两个字段分别都占用 32 bit。用于标识这个 IP 数据报的起源和目标 IP 地址。值得注意的是,除非使用 NAT(网络地址转换),否则整个传输的过程中,这两个地址不会改变。
12,选项(可选)
这是一个可变长的字段。该字段属于可选项,主要是给一些特殊的情况使用,最大长度是 40 字节。
13,填充(Padding)
由于 IP 报头长度这个字段的单位为 32 bit,所以 IP 报头的长度必须为 32bit 的整数倍。因此,在可选项后面,IP 协议会填充若干个 0,以达到 32bit 的整数倍。
三:IP分片
IP 协议在传输数据报时,将数据报分为若干分片(小数据报)后进行传输,并在目的系统中进行重组,这一过程称为分片(Fragmentation)。
要理解 IP 分片,首先要理解 MTU,物理网络一次传送的数据是有最大长度的,因此网络层的下层(数据链路层)的传输单元(数据帧)也有一个最大长度,这个最大长度值就是 MTU,每一种物理网络都会规定链路层数据帧的最大长度,比如以太网的 MTU 为 1500 字节。
IP 协议在传输数据报时,若IP数据报加上数据帧头部后长度大于 MTU,则将数据报切分成若干分片后再进行传输,并在目标系统中进行重组。IP 分片既可能在源端主机进行,也可能发生在中间的路由器处,因为不同网络的 MTU 是不一样的,而传输的整个过程可能会经过不同的物理网络。如果传输路径上的某个网络的 MTU 比源端网络的 MTU 要小,路由器就可能对 IP 数据报再次进行分片。分片数据的重组只会发生在目的端的 IP 层。
IP首部内有三个字段用于实现分片和重组:
- 标识字段
- 标志字段
- 偏移字段
1,标识
- 对于发送的每份IP数据报,标识字段都包含一个唯一的值。该值在数据报分片时被复制到每个片中;
- 标志字段用其中1 bit表示“更多的片”;
- 除最后一片外,其他每一个组成数据报的片都要把该比特置1;
2,标志
标志字段由三个1bit标志组成:
- 比特0是保留的,必须为0;
- 比特1是“不分片”(DF)标志;
- 比特2是“更多分片”(MF)标志;
即:
DF=0表示可以分片,DF=1表示不可以分片;
MF=0表示后面没有分片,MF=1表示后面有分片;
3,偏移
- 该片偏移原始数据报开始处的位置;
- 当数据报被分片后,每个片的总长度值要改为该片的长度值;
- 片偏移字段以8字节为单位
举例:
一个长4000B的IP数据报4000字节为例,看如何分片:
分片一:标识:666,MF=1,DF=0, 片偏移=0,有效数据:1480(编号0~1479)
分片二:标识:666,MF=1, DF=0, 片偏移=185,185=1480/8,有效数据:1480(编号1480~2959)
分片三:标识:666,MF=0, DF=0, 片偏移=370, 370=2960/8,有效数据:1020(编号2960~3979)