IP
1. 基本介绍
TCP/IP 协议的心脏是网络层,主要“实现节点之间的通信”,即“点对点(end-to-end)通信”。
网络层包含IP(Internet Protocol)及ARP(Address Resolution Protocol)ICMP(Internet Control Message Protocol)等协议。
网络层与数据链路层的关系
数据链路层提供两个直连设备间的通信,网络层通过IP实现不同数据链路上节点间的通信。
为了从A地到达B地需要制定行程表,并且购买相应的机票与火车票。
行程表的作用就相当于网络层。机票与火车票用于在某一限定“区间内”移动,“区间内”就相当于通信网络上的数据链路,“区间内”的出发地点和目的地点就如同某一个数据链路的源地址(源 MAC)和目标地址(目的MAC)等首部信息。
2. IP地址
IP 地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。
2.1 IPv4与IPv6
(1)IPv4
IPv4 地址由 32 位正整数来表示,在计算机内部以二进制方式被处理。 2 32 = 4 , 294 , 967 , 296 2^{32}=4,294,967,296 232=4,294,967,296理论上可将43亿台计算机设备同时连接到网络。
一般将32 位的IP地址以每8位为一组,分成4组,每组以“.”隔开,再将每组数转换为十进制数。 10101100. 00010100. 00000001. 00000001 10101100. \; \;00010100. \; \;00000001. \; \;00000001 10101100.00010100.00000001.00000001 172. 20. 1. 1 172.\; \;\; \;\; \; \;\;\; \; \;20.\; \;\; \;\; \; \;\;\; \; \;1.\; \;\; \;\; \;\; \; \;\;\; \; \;\; \;1\; \;\; \;\; \; \;\;\;\; \;\; 172.20.1.1
(2)IPv6
IPv6地址由128位正整数表示 2 128 ≈ 3.4 × 1 0 28 2^{128}\approx 3.4 \times 10 ^{28} 2128≈3.4×1028
一般将128位比特的IPv6地址每16bit为一组,每组用冒号(:)分割标记。如果出现连续的0,可以将0省略,并用两个冒个(::)隔开。
e.g.
二进制: 1111111011011100 : 1011101010011000 : 0111011001010100 : 0011001000010000 : 1111111011011100 : 1011101010011000 : 0111011001010100 : 0011001000010000 1111111011011100:1011101010011000:\\0111011001010100:0011001000010000:\\1111111011011100:1011101010011000:\\0111011001010100:0011001000010000 1111111011011100:1011101010011000:0111011001010100:0011001000010000:1111111011011100:1011101010011000:0111011001010100:0011001000010000十六进制: F E D C : B A 98 : 7654 : 3210 : F E D C : B A 98 : 7654 : 3210 FEDC:BA98:7654:3210:\\FEDC:BA98:7654:3210 FEDC:BA98:7654:3210:FEDC:BA98:7654:3210二进制: 0001000010000000 : 0000000000000000 : 0000000000000000 : 0000000000000000 : 0000000000000100 : 0000100000000000 : 0010000000001100 : 0100000101111010 0001000010000000:0000000000000000:\\0000000000000000:0000000000000000:\\0000000000000100:0000100000000000:\\0010000000001100:0100000101111010 0001000010000000:0000000000000000:0000000000000000:0000000000000000:0000000000000100:0000100000000000:0010000000001100:0100000101111010十六进制(省略后): 1080 : : 8 : 800 : 200 C : 417 A 1080::8:800:200C:417A 1080::8:800:200C:417A
2.2 IP地址分类
IP地址由“网络标识(网络地址)+主机标识(主机地址)”组成,根据IP地址第1位到第四位的值,分为A、B、C、D四类地址。
(1)A类地址
A类地址以0开头,第1至8位为网络地址,后面24位为主机地址。网络地址范围为: 0.0.0.0 ∼ 127.0.0.0 0.0.0.0\sim127.0.0.0 0.0.0.0∼127.0.0.0由于全0和全1的地址为保留地址,因此一个A类网段可以分配 2 24 − 2 = 16777214 2^{24}-2=16777214 224−2=16777214个主机。
(2)B类地址
B类地址以10开头,第1至16位为网络地址,后面16位为主机地址。网络地址范围为:
128.0.0.0
∼
191.0.0.0
128.0.0.0\sim191.0.0.0
128.0.0.0∼191.0.0.0由于全0和全1的地址为保留地址,因此一个B类网段可以分配
2
16
−
2
=
65534
2^{16}-2=65534
216−2=65534个主机。
(3)C类地址
C类地址以110开头,第1至24位为网络地址,后面8位为主机地址。网络地址范围为:
192.0.0.0
∼
223.255.255.0
192.0.0.0\sim223.255.255.0
192.0.0.0∼223.255.255.0由于全0和全1的地址为保留地址,因此一个C类网段可以分配
2
8
−
2
=
254
2^{8}-2=254
28−2=254个主机。
(4)D类地址
D类地址以1110开头,第1至32位为网络地址,后面8位为主机地址。网络地址范围为: 224.0.0.0 ∼ 239.255.255.255 224.0.0.0\sim239.255.255.255 224.0.0.0∼239.255.255.255
D类地址没有主机标识,常被用于多播(将包发送给特定组内的所有主机)。
2.3 子网掩码
子网掩码(subnet mask)用来标识网络地址与主机地址,实现网络地址长度的灵活标识。
子网掩码也是一个32位的数字,对应IP地址网络标识部分的位全部为1,对应IP主机标识部分的位全部为0。
e.g.
IP地址:172.20.100.52
子网掩码:255.255.255.192
由于192的二进制表示为:11000000,因此172.20.100.52的前26位是网络地址,有时也表示为 172.20.100.52/24
2.4 全局地址与私有地址
互联网中任何一台主机或路由器必须有一个唯一的IP地址,这个全局IP地址由互联网名称与数字地址分配机构(ICANN,Internet Corporation for Assigned Names and Numbers)进行管理。
ICANN是一个非营利性的国际组织,成立于1998年10月,负责全球IP地址的分配等工作。
随着互联网的迅速普及,IP地址不足的问题日趋显著,于是又出现了私有网络的IP地址,只要保证在这个网络内地址唯一即可,其地址范围如下:
- A类 :10. 0. 0. 0 ~10. 255.255.255 (10/8)
- B类 :172.16.0. 0 ~ 172.31. 255. 255 (172.16/12)
- C类:192.168.0.0 ~192.168.255.255((192.168/16)
在上述范围内的IP地址都属于私有IP或内网IP,而在此之外的IP地址称为全局 IP或公网IP。
3. IP首部格式
通过IP通信时,需要在数据签名加入IP首部信息,IP首部信息包含了用IP协议进行发包控制的相关信息。
3.1 IPv4首部
- 版本(Version) :表示标识IP首部的版本号,4位。IPv4的版本号即为4,因此在这个字段上的值也是“4”。
- 首部长度(IHL:InternetHeader Length):表明IP首部的大小(单位为4字节,32比特),4位。
- 区分服务(TOS:Type Of Service):表明服务质量,通常由应用指定,8位。
- 总长度(Total Length):表示 IP首部与数据部分合起来的总字节数,16位,因此IP包的最大长度为 65535 ( = 2 16 ) 65535(=2^{16}) 65535(=216)字节。
- 标识(ID:Identification):用于分片重组,16位。同一个分片的标识值相同,不同分片的标识值不同。通常,每发送一个IP包,它的值也逐渐递增。此外,即使ID相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片。
- 标志(Flags):表示包被分片的相关信息,3位。
- 片偏移(FO:Fragment Offset):标识被分片的每一个分段相对于原始数据的位置,13位。第一个分片对应的值为0。由于FO域占13位,因此最多可以表示 8192 ( = 2 13 ) 8192(=2^{13}) 8192(=213)个相对位置。单位为8字节,因此最大可表示原始数据 8 × 8192 = 65536 8\times8192=65536 8×8192=65536字节的位置。
- 生存时间(TTL:Time To Live):8位,最初是以秒为单位记录当前包在网络上应该生存的期限。然而,实际中它是指可以中转多少个路由器的意思。每经过一个路由器, TTL会减少1,直到变成0则丢弃该包。TTL占8位,可以表示0~255 的数字,因此一个包的中转路由的次数不会超过 2 8 = 256 2^8=256 28=256 个。由此可以避免IP包在网络内无限传递的问题。
- 协议(Protocol):表示IP首部的下一个首部属于哪个协议,8位。
- 首部校验和(HeaderChecksum):IP首部校验和只校验数据报的首部,不校验数据部分,主要确保IP数据报不被破坏,16位。
- 源地址(Source Address):发送端IP地址,32位。
- 目标地址(Destination Address):接收端IP 地址,32位。
- 可选项(Options):长度可变,通常只在进行实验或诊断时使用。该字段包含如下信息:安全级别、源路径、路径记录、时间戳。
- 填充(Padding):也称作填补物。在有可选项的情况下,首部长度可能不是32 比特的整数倍。为此,通过向字段填充0,调整为32 比特的整数倍。
3.2 IPv6首部
IPv6 的IP数据首部格式相比IPv4,已经发生了巨大变化:
- IPv6 中省略了首部校验和字段(TCP 和 UDP 在做校验和计算的时候使用伪首部,所以可以验证IP地址或协议是否正确。因此,即使在IP层无法提供校验,在TCP或 UDP层也可以提供校验),因此路由器不再需要计算校验和,从而提高了包的转发效率。
- 此外,分片处理所用的识别码成为可选项。为了让64位CPU的计算机处理起来更方便,IPv6的首部及可选项都由8字节构成。
- 版本(Version):4位,IPv6其版本号为6,因此在这个字段上的值为“6”。
- 通信量类(Traffic Class):相当于IPv4的TOS(TypeOf Service)字段,8位。
- 流标号(Flow Label):用于服务质量(QoS:QualityOf Service)控制,20位。
- 有效载荷长度(Payload Length):有效载荷是指包的数据部分。IPv4的TL(Total Length)是指包括首部在内的所有长度。IPv6中的这个Playload Length不包括首部,只表示数据部分的长度。由于IPv6的可选项是指连接IPv6首部的数据,因此当有可选项时,此处包含可选项数据的所有长度就是Playload Length。该字段长度为16 比特,因此数据最大长度可达65535 字节。为了让更大的数据也能通过一个IP 包发送出去,便增加了大型有效载荷选项( Jumbo Payload Option)。该选项长度为32 比特。有了它 IPv6 一次可以发送最大4G 字节的包。
- 下一个首部(Next Header):相当于IPv4中的协议字段,8位。通常表示IP的上一层协议是TCP或 UDP。在有IPv6扩展首部的情况下,该字段表示后面第一个扩展首部的协议类型。
- 跳数限制(Hop Limit):与IPv4中的TTL意思相同,8位。为了强调“可通过路由器个数”这个概念,才将名字改成了“HopLimit”。数据每经过一次路由器就减1,减到0则丢弃数据。
- 源地址(Source Address):表示发送端IP地址,128位。
- 目标地址(Destination Address):表示接收端IP地址,128位。
- IPv6 扩展首部:IPv6 的首部长度固定,无法将可选项加入其中。取而代之的是通过扩展首部对功能进行了有效扩展。扩展首部通常介于IPv6首部与TCP/UDP首部中间,IPv6的扩展首部可以是任意长度。扩展首部当中还可以包含扩展首部协议以及下一个扩展首部字段。
4. 网络层相关协议
4.1 ARP
(1)定义
地址解析协议(ARP,Address Resolution Protocol)以目标I IP 地址为线索,来定位下一个
应该接收数据分包的网络设备对应的MAC地址。 如果目标主机不在同一个链路上
时,可以通过ARP查找下一跳路由器的MAC 地址址。
ARP只适用于IPv4,不能用于 IPv6。IPv6中可以用ICMPv6替代 ARP发 送邻居探索消息。
(2)工作机制
- 主机A为了获得主机B的MAC地址,通过广播发送一个ARP 请求包。这个包包含了主机B的IP地址172.20.1.2。由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包也就会被这同一个链路上所有的主机和路由器进行解析。
- 如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,将会造成不必要的网络流量,通常是把获取到的MAC地址缓存一段时间,即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆。
记录IP地址与MAC地址对应关系的数据库叫做ARP 表。在 UNIX或 Windows 中可以通过“arp-a”
命令获取该表信息。
(3)APR包格式
HLEN:MAC地址长度=6(字节)
PLEN:IP地址长度=4(字节)
IP 地址和MAC 地址缺一不可
4.2 RARP
反向地址转换协议(RARP,Reverse Address Resolution Protocol)是将ARP反过来,从MAC地址定位IP地址的一种协议。
例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。需要架设一台RARP服务器,从而在这个服务器上注册设备的MAC地址及其IP地址。
4.3 ICMP
(1)定义
因特网控制报文协议(ICMP,Internet Control Message Protocol)是一个差错报告机制,主要用于在IP主机和路由器之间传递控制消息,用于报告主机是否可达、路由是否可用等。
这些控制消息虽然并不传输用户数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有至关重要的作用。
(2)ICMP包格式
每一个ICMP消息都将包含引发这条ICMP消息的数据包的完全IP包头,ICMP报文则作为IP数据包的数据部分封装在IP数据包内部。ICMP包头中包含的三个固定字段就是源端设备确定发生错误的类型的主要依据。
- Type字段表示ICMP消息的类型;
- Code字段表示ICMP消息类型细分的子类型;
- Checksum字段表示ICMP报文的校验和。
(3)应用
IP数据报及其他应用程序通过ICMP报文可以实现多种应用,其中Ping程序和Tracert(Traceroute)程序最为常见。
IP包中有一个字段叫做TTL(Time To Live),它的值随着每经过一次路由器就会减1,直到减到0时该IP包会被丢弃。此时,IP路由器将会发送一个ICMP超时的消息(ICMPTime Exceeded Message,错误号0)给发送端主机,并通知该包已被丢弃。
admin@admindeMacBook-Pro ~ % traceroute www.baidu.com
traceroute: Warning: www.baidu.com has multiple addresses; using 220.181.38.149
traceroute to www.a.shifen.com (220.181.38.149), 64 hops max, 40 byte packets
1 192.168.85.12 (192.168.85.12) 6.673 ms 8.284 ms 5.257 ms
2 * * *
3 10.255.0.1 (10.255.0.1) 79.821 ms
10.255.0.33 (10.255.0.33) 27.872 ms
10.255.0.1 (10.255.0.1) 48.177 ms
4 * * *
5 36.112.243.137 (36.112.243.137) 63.266 ms 21.281 ms 38.849 ms
6 36.112.238.218 (36.112.238.218) 29.252 ms
36.112.243.157 (36.112.243.157) 31.258 ms
36.112.243.153 (36.112.243.153) 35.470 ms
7 36.110.246.2 (36.110.246.2) 25.048 ms *
36.110.247.42 (36.110.247.42) 86.454 ms
8 * 36.110.246.201 (36.110.246.201) 88.457 ms
36.110.246.69 (36.110.246.69) 40.293 ms
9 106.38.212.142 (106.38.212.142) 82.811 ms * 78.934 ms
10 * 106.38.212.142 (106.38.212.142) 114.557 ms *
11 * * *
12 * * *
13 * * *
traceroute利用 IP 包的生存期限从1开始按照顺序递增的同时发送UDP包,强制接收 ICMP超时消息,可以显示出由执行程序的主机到达特定主机之前历经多少路由器。
traceroute 一台主机时,记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关。有些行是以星号表示的,可能是防火墙封掉了ICMP的返回信息,所以无法相关数据包。