网络基础(五)-IP协议
参考文献
- IP-rfc791
- CIDR-rfc4632
- 趣谈网络协议
IP
协议
- 主要目的是解决寻址和路由问题,以及如何在两点之间传送数据包.
IP
协议使用“IP 地址”的概念来定位互联网上的每一台计算机.
- 不可靠(
unreliable
)的意思是它不能保证IP数据报能成功地到达目的地.IP仅提供最好的传输服务.如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端.任何要求的可靠性必须由上层来提供(如TCP). - 无连接(
connectionless
)这个术语的意思是IP并不维护任何关于后续数据报的状态信息. 每个数据报的处理是相互独立的.这也说明,IP数据报可以不按发送顺序接收.如果一信源向相同的信宿发送两个连续的数据报(先是 A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达.
IP
地址
-
IP
地址的规则中,网络号和主机号连起来总共32比特.通过子网掩码来区分网络号和主机号- 子网掩码为1的部分为网络号,子网掩码为0的部分表示主机号.
IP
地址的主机号:- 全0: 表示整个子网
- 全1: 表示向子网上所有设备发送包,即"广播"
-
IPV4
地址是用四个**“.”**分隔数字,总数有个,大约42亿个可以分配的地址. -
IPV6
地址是用八个**“:”**分隔数字,总数有个.
IP
地址的分类
IP
地址被分为了五类
- A、B、C三类地址所能包含的主机的数量
- D类是组播地址.使用这一类地址,属于某个组的机器都能收到.这有点类似在公司里面大家都加入了一个邮件组.发送邮件,加入这个组的都能收到.
子网掩码
- 在没有子网的网络环境下,路由器通过IP地址的前八位来决定是哪一类型的网络,从而它们知道哪些是网络ID哪些是主机ID.划分子网时,路由器也需要知道主机ID是如何划分成子网ID与主机ID的,但是划分方法可以是任意组合,也没有办法从IP地址看出来.因此,必须有额外的信息告知解析IP地址的设备,这一信息称为子网掩码,以32比特数的形式呈现.
- 掩码位的1和0结合布尔函数与和或的功能对于地址中的比特位进行选择或清除.子网掩码中的32位对应于IP地址相同位置上的数字.掩码位为1时,则地址中该位作为网络ID或子网ID,而掩码位为0时,则地址中该位表示主机ID.
- 子网掩码为1: 将IP地址中的0或1与1进行与操作,即: 当子网掩码位为1,IP地址保持不变.
- 子网掩码为0: 任何数和0做与操作都是0,即: 当子网掩码位为0,IP地址清零.
无类型域间选路(CIDR
)
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 |
- 无类型域间选路(CIDR)是一种用于对IPv4地址进行编址和路由的方法.它通过将一组地址块聚合到较大的前缀中,减少了路由表的大小,提高了路由效率.
- 在传统的IP地址分配中,使用固定长度的网络掩码来表示一个网络的地址范围.例如,一个Class C网络具有一个24位(255.255.255.0)的网络掩码,可以容纳256个主机.这种方式导致了大量的地址空间浪费和路由表的庞大.
- CIDR引入了可变长度子网掩码(VLSM),可以在不同网络之间分配不同数量的IP地址.CIDR地址表示法将网络前缀和子网掩码写在IP地址后面,例如:192.168.0.0/16.其中,/16表示网络前缀的长度为16位,即前16位为网络地址,后16位为主机地址.
- 伴随着CIDR存在的,一个是广播地址,10.100.122.255.如果发送这个地址,所有10.100.122网络里面的机器都可以收到.另一个是子网掩码,255.255.255.0.
- 将子网掩码和IP地址进行AND计算.前面三个255,转成二进制都是1.1和任何数值取AND,都是原来数值,因而前三个数不变,为10.100.122.后面一个0,转换成二进制是0,0和任何数值取AND,都是0,因而最后一个数变为0,合起来就是10.100.122.0.这就是网络号.将子网掩码和IP地址按位计算AND,就可得到网络号.
- 在IP地址的后面有个
scope
,对于eth0
这张网卡来讲,是global
,说明这张网卡是可以对外的,可以接收来自各个地方的包.对于lo来讲,是host,说明这张网卡仅仅可以供本机相互通信. - lo全称是**
loopback
,又称环回接口**,往往会被分配到127.0.0.1这个地址.这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现.
IP
数据报首部格式
1 | 0 1 2 3 |
1 | Example 1: |
-
Version
版本号: 指IP
协议所使用的版本.通信双方使用的IP
协议版本必须一致.目前广泛使用的IP
协议版本号为4,即IPv4
. -
IHL
首部长度:IP
的首部长度,可表示的最大十进制数值是15.注意,该字段所表示的单位是32位字长(4字节).因此,当IP
首部长度为1111(即十进制的15)时,首部长度就达到60字节.当IP
分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充. -
Type of Service
服务类型:优先级标志位和服务类型标志位.被路由器用来进行流量的优先排序.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Bits 0-2: Precedence.
Bit 3: 0 = Normal Delay, 1 = Low Delay.
Bits 4: 0 = Normal Throughput, 1 = High Throughput.
Bits 5: 0 = Normal Relibility, 1 = High Relibility.
Bit 6-7: Reserved for Future Use.
0 1 2 3 4 5 6 7
+-----+-----+-----+-----+-----+-----+-----+-----+
| | | | | | |
| PRECEDENCE | D | T | R | 0 | 0 |
| | | | | | |
+-----+-----+-----+-----+-----+-----+-----+-----+
Precedence
111 - Network Control
110 - Internetwork Control
101 - CRITIC/ECP
100 - Flash Override
011 - Flash
010 - Immediate
001 - Priority
000 - Routine -
Total Length
总长度:指IP
首部和数据报中数据之后的长度,单位为字节.总长度字段为16位,因此数据报的最大长度为$2^{16}-1 $=65535字节. -
Identification
标识符:一个唯一的标识数字,用来识别一个数据报或者被分片数据包的次序. -
Flags
标记:用来标记一个数据报是否是一组分片数据报的一部分.标志字段中的最低位记为MF(More Fragment
).MF=1即表示后面"还有分片"的数据报.MF=0表示这个已是若干数据包分片中最后一个.标志字段中间的一位记为DF
(Don't Fragment
),意思是"不能分片".只有当DF=0时,才允许分片.1
2
3
4
5
6
7
8
9Bit 0: reserved, must be zero
Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment.
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
0 1 2
+---+---+---+
| | D | M |
| 0 | F | F |
+---+---+---+ -
Fragment Offset
分片偏移:一个数据报是一个分片,这个域中的值就会被用来将数据报以正确的顺序重新组装. -
Time to Live
存活时间:用来定义数据报的生成周期,以经过路由器的条数/秒数进行描述. -
Protocol
协议:用来识别在数据包序列中上层协议数据报的类型.1表示为ICMP协议,2表示为IGMP协议,6表示为TCP协议,17表示为UDP协议 -
Header Checksum
首部校验和:一个错误检测机制,用来确认IP
首部的内容有没有被损坏或者被篡改. -
Source Address
源IP
地址:发出数据报的主机的IP
地址. -
Destination Address
目的IP
地址:数据报目的地IP
地址. -
Options
选项:保留作额外的IP
选项,它包含着源站选路和时间戳的一些选项.
TTL
- 存活时间(TTL)值定义了在该数据报被丢弃之前,所能经历的时间,或者能经过的最大路由数目.TTL在数据报被创建时就会被定义,而且通常在每次被发往一个路由器的时候减1.
IP
分片
- 数据报分片是将一个数据流分为更小的片段,是IP用于解决跨域不同类型网络时可靠的一个特性.一个数据报的分片主要是基于第二层数据链路层所使用的最大传输单元(
Maximum Transmission Unit MTU
)的大小,以及使用这些二层协议的设备情况.在多数情况下,第二层所使用的最大数据报大小是1500字节(不包括14字节的以太网头本身). - 当一个设备这边传输一个
IP
数据报时,它将会比较这个数据报的大小,以及将要把这个数据报传送出去的网络接口MTU
,用于决定是否需要将这个数据报分片.如果数据报的大小大于MTU
,那么这个数据报将会被分片.将一个数据报分片包括下列几个步骤:- 设备将数据分为若干个可成功进行传输的数据报.
- 每个
IP
首部的总长度域会被设置为每个分片的片段长度. - 更多分片标志将会在数据流的所有数据报中设置为1,除了最后一个数据报.
IP
头中分片部分的分片偏移将会被设置.- 数据报被发送出去.
- IP数据报是指IP层端到端的传输单元(在分片之前和重新组装之后),分组是指在IP层和链路层之间传送的数据单元。一个分组可以是一个完整的 I P数据报,也可以是I P数据报的一个分片
IP
寻址
IPv4
协议的寻址过程是逐级寻址
具体过程
-
步骤 1:找到顶层网络
-
比如
192.168.11.102
最顶层的网络号可以和255.0.0.0
(子网掩码)做位与运算得到,如下所示:1
192.168.11.102 & 255.0.0.0 = 192.0.0.0
-
因此
192.0.0.0
就是192.168.11.102
所在的顶层网络.255.0.0.0.
称作子网掩码.子网掩码的作用就是帮助根据 IP 地址找到对应子网.子网掩码是很多个1
接着很多个0
,和 IP 地址一起使用.
-
-
步骤 2:找到下一层网络
-
接下来要找到下一级网络,就需要用 IP 地址和下一级的子网掩码做位与运算.比如:
1
192.168.11.102 & 255.255.0.0 = 103.168.0.0
-
其中
103.168.0.0
就是下一级的网络号.
-
-
步骤 3:找到再下一级网络
- 接下来使用
255.255.255.0
子网掩码找到下一级网络是192.168.11.0
.
- 接下来使用
-
步骤 4:定位设备
-
设备就在子网
192.168.11.0
中,最终找到的设备号是1
. -
当然子网掩码也不一定都是
255
,比如这个子网掩码255.240.0.0
也是可以的.但通常我们把 IPv4 的网络分成这样 4 层.
-
如何配置IP地址
- 当你需要手动配置一台机器的网络IP时,一定要好好问问你的网络管理员.如果在机房里面,要去网络管理员那里申请,让他给你分配一段正确的IP地址.当然,真正配置的时候,一定不是直接用命令配置的,而是放在一个配置文件里面.不同系统的配置文件格式不同,但是无非就是CIDR、子网掩码、广播地址和网关地址.
使用net-tools
1 | $ sudo ifconfig eth1 10.0.0.1/24 |
使用iproute2
1 | $ sudo ip addr add 10.0.0.1/24 dev eth1 |
路由(Routing
)
- 在寻址过程中,数据总是存于某个局域网中.如果目的地在局域网中,就可以直接定位到设备了.如果目的地不在局域网中,这个时候,就需再去往其他网络.
- IP层在 内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果确实是这样,数据报就被送到由 IP首部协议字段所指定的协议模块进行处理.如果数据报的目的不是这些地址,那么(1)如果IP层被设置为路由器的功能,那么就对数据报进行转发;否则(2)数据报被丢弃.
- 由于网络和网络间是网关在连接,因此如果目的地 IP 不在局域网中,就需要为 IP 封包选择通往下一个网络的路径,其实就是选择其中一个网关.
- 为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是 I P路由选择机制的另一个基本特性。
1 | aliyun:~$ route |
ICMP
-
Internet Control Message Protocol
,就是互联网控制报文协议.ICMP
是IP
协议的附属协议.IP
层用它来与其他主机或路由器交换错误报文和其他重要信息 -
ping
是基于ICMP
协议工作的 -
ICMP
报文是封装在IP
包里面的.因为传输指令的时候,肯定需要源地址和目标地址ICMP
报文有很多的类型,不同的类型有不同的代码.最常用的类型是主动请求为8,主动请求的应答为0.
查询报文类型
- 常用的**ping就是查询报文,是一种主动请求,并且获得主动应答的ICMP协议.**所以,ping发的包也是符合ICMP协议格式的,只不过它在后面增加了自己的格式.
- 对ping的主动请求,进行网络抓包,称为ICMP ECHO REQUEST.同理主动请求的回复,称为ICMP ECHO REPLY.比起原生的ICMP,这里面多了两个字段,一个是标识符.这个很好理解,你派出去两队侦查兵,一队是侦查战况的,一队是去查找水源的,要有个标识才能区分.另一个是序号,你派出去的侦查兵,都要编个号.如果派出去10个,回来10个,就说明前方战况不错;如果派出去10个,回来2个,说明情况可能不妙.
- 在选项数据中,ping还会存放发送请求的时间值,来计算往返时间,说明路程的长短.
差错报文类型
- 终点不可达为3
- 源抑制为4
- 超时为11
- 路由重定向为5
ping
查询报文类型的使用
- ping命令执行的时候,源主机首先会构建一个ICMP请求数据包,ICMP数据包内包含多个字段.最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为 8;另外一个是顺序号,主要用于区分连续ping的时候发出的多个数据包.每发出一个请求数据包,顺序号会自动加1.为了能够计算往返时间RTT,它会在报文的数据部分插入发送时间.
Traceroute
: 差错报文类型的使用
- Traceroute的第一个作用就是故意设置特殊的TTL,来追踪去往目的地时沿途经过的路由器.
- Traceroute的参数指向某个目的IP地址,它会发送一个UDP的数据包.将TTL设置成1,也就是说一旦遇到一个路由器或者一个关卡,就表示它“牺牲”了.
- Traceroute还有一个作用是故意设置不分片,从而确定路径的MTU
- 要做的工作首先是发送分组,并设置“不分片”标志.发送的第一个分组的长度正好与出口MTU相等.如果中间遇到窄的关口会被卡住,会发送ICMP网络差错包,类型为“需要进行分片但设置了不分片位”.其实,这是人家故意的好吧,每次收到ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机.
动态主机配置协议(DHCP
)
DHCP
的典型工作流程
- DHCP Discover: 当一台新加入局域网的机器(称为DHCP客户端)启动时,它会广播一个DHCP Discover消息来寻找可用的DHCP服务器.该消息中包含了一个特殊的源IP地址(0.0.0.0)和目标IP地址(255.255.255.255),以确保消息可以被局域网内的所有DHCP服务器收到.
- DHCP Offer: 局域网内的DHCP服务器接收到DHCP Discover消息后,会向DHCP客户端发送一个DHCP Offer消息.这个消息包含一个可用的IP地址、子网掩码、默认网关、DNS服务器等网络配置信息.DHCP服务器可能会从一个地址池中选择一个可用的IP地址来提供给客户端.
- DHCP Request: DHCP客户端在收到DHCP Offer后,会选择其中一个DHCP服务器所提供的网络配置,并将一个DHCP Request消息广播回局域网,确认该配置的有效性.
- DHCP Acknowledge: 接收到DHCP Request消息的DHCP服务器会向DHCP客户端发送一个DHCP Acknowledge消息,确认所选网络配置的有效性,并提供最终的IP地址和其他配置信息.
- IP地址的配置: DHCP客户端收到DHCP Acknowledge消息后,将使用所提供的IP地址和其他配置信息来配置自己的网络接口.现在,该客户端可以正常地与局域网内的其他设备进行通信.
- 整个过程中,DHCP服务器负责管理IP地址池、响应客户端请求并提供网络配置信息,而DHCP客户端则负责发送广播消息来获取有效的IP地址和配置信息.
IP
地址的收回和续租
- 租约分配: 当DHCP服务器为客户端分配一个IP地址时,会与该IP地址关联一个租约,包括租约的有效期限和其他网络配置信息.
- IP地址续租: 在租约有效期快到期之前,客户端可以向DHCP服务器发送DHCP Request消息来请求续租.客户端通常会在过了租约的一半时间后发起续租请求,以确保及时获得新的租约.
- DHCP服务器响应: DHCP服务器接收到续租请求后,会验证客户端的身份和租约信息,并根据情况来决定是否批准续租.如果续租请求合法且地址仍然可用,则DHCP服务器将发送DHCP Acknowledge消息,确认续租并更新租约的有效期.客户端会相应地更新自己的IP地址和网络配置.
- IP地址收回: 如果一个租约到期或者客户端在续租阶段没有成功续租,则DHCP服务器会将该IP地址收回并重新放入可用地址池中,以便将来分配给其他客户端.此时,之前使用该IP地址的客户端将不再拥有该地址,并需要重新请求新的IP地址.
- 通过租约管理,DHCP可以动态地管理IP地址的分配和释放,使得网络管理员能够灵活地利用有限的IP地址资源.客户端可以在租约到期前续租,以保持持续的网络连接.如果客户端不再需要IP地址或离开了网络,它可以发送DHCP Release消息来显式释放IP地址,使其能够被其他客户端使用.
广播和多播
- 广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主机(由IP地址确定)内的两进程(由端口号确定)间存在一条连接.
多播
- IP多播提供两类服务:
- 向多个目的地址传送数据。有许多向多个接收者传送信息的应用:例如交互式会议系统和向多个接收者分发邮件或新闻。如果不采用多播,目前这些应用大多采用TCP来完成(向每个目的地址传送一个单独的数据复制)。然而,即使使用多播,某些应用可能继续采用TCP来保证它的可靠性。
- 客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器。目前,这项服务是通过广播来提供的,但是使用多播可降低不提供这项服务主机的负担。
- 多播组地址包括为1110的最高4bit和多播组号。它们通常可表示为点分十进制数,范围从224.0.0.0到239.255.255.255
- 能够接收发往一个特定多播组地址数据的主机集合称为主机组(host group)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息
IGMP
Internet
组管理协议
-
支持主机和路由器进行多播的
Internet
组管理协议(IGMP
)。它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。IGMP
在RFC 1112
中定义. -
正如ICMP一样,IGMP也被当作IP层的一部分。IGMP报文通过IP数据报进行传输。不像我们已经见到的其他协议,IGMP有固定的报文长度,没有可选数据.IGMP报文通过I P首部中协议字段值为2来指明。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22| |
| Upper-Layer Protocol Modules |
|__________________________________________________________|
--------------------- IP Service Interface -----------------------
__________________________________________________________
| | | |
| | ICMP | IGMP |
| IP |______________|______________|
| Module |
| |
|__________________________________________________________|
---------------- Local Network Service Interface -----------------
__________________________________________________________
| | |
| Local | IP-to-local address mapping |
| Network | (e.g., ARP) |
| Modules |_____________________________|
| (e.g., Ethernet) |
| |