引言
? IP是TCP/IP协议簇中最核心的协议之一。IP提供不可靠、无连接的数据报传输服务。
? 不可靠(unreliable)的意思是IP不能保证数据报能成功地到达目的地,它仅仅尽最大努力提供最好的传输服务。当其发生某种错误时,例如路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报(通常是最后达到的数据报),然后发送ICMP消息报给主机。任何可靠性的要求都由上层的TCP来提供。
? 无连接(connectionless)的意思是IP并不维护任何已经发送出去的数据报的相关信息,每个数据报都是单独处理,也就是说IP可以不按顺序发送数据报。
IP头部
IPv4数据报头部如下:
IPv6数据报头部如下:
4个字节的32位值以如下次序传输:首先是0-7位,接着8-15位,然后16-23位,最后24-31位,这种传输次序被称为大端字节序(big endian),也叫做网络字节序。然而大部分主机使用的是小端字节序,与其刚好相反,如果主机使用的是小段字节序,则需要对其进行转换。
【补充说明】:大端字节序指的是对于内存中的一个32位的整数,低位字节的内存地址存储的是整数的高位字节,高位字节的内存地址存储的是整数的低位字节;小端字节序则是低位字节的内存地址存储整数的低位字节。
IP头部区域
版本号(Version):占4位,表明IP数据报的版本号,4表示为IPv4,6表示为IPv6。
头部长度(IHL(Internet Header Length)):表明IPv4数据报头部占32位字长的数目,包含了选项(Options)。由于头部长度占4位,故而IPv4数据报头部最长为32 / 8 * 15 = 60个字节,而IPv6没有该字段是因为IPv6头部固定为40字节。
服务类型(ToS):8位被划分为两部分,前6位表示区分服务字段(DSField(Differentiated Services Field)),后两位表示为显式拥塞通知(ECN(Explicit Congestion Notification))。在IPv4中叫做服务类型,而在IPv6则叫做流量级别(Traffic Class)。服务类型的前3位表示一个优先权子字段(现在已被忽略),接着是3位的ToS子字段和1位必须置0的未用位。其中4位的ToS子字段分别表示最小延迟、最大吞吐量、最高可靠性和最小费用。
总长度(Total Length):占16位,指整个IPv4数据报的长度,以字节为单位。通过头部长度字段(IHL)和该总长度字段就可以得出IPv4数据报中数据的长度。总长度是IPv4头部中必须的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。根据总长度可以算出整个IPv4数据报最大长度为65535字节。
标识(Identification):占16位,唯一地标识主机发送出去的每一份IPv4数据报,通常每发送一份IPv4数据报则该值加1。
标志(Flags)和片段偏移(Fragment Offset):与IP分片相关,由于大部分链路层(如以太网)不能传输整个IPv4数据报,故而需要将IPv4数据报分片传输。IPv4数据报分片在UDP协议中会详解介绍,需要注意的是IPv4数据报分片之后,每个分片的IPv4数据报中的总长度反映了该分片的IPv4数据报的总长度。而IPv6头部移除了标识、标志和片段偏移,而是用16位的**有效长度(Payload Length)**表示IPv6数据报不包含其头部的有效数据的长度。如果IPv6的发送主机想要对数据报进行分片,就需要使用扩展报头实现。由于IPv6扩展报头被认为是有效数据的一部分,因此也被包括在有效长度的计算之内。
生存时间(TTL(Time to Live)):占8位,表明IPv4数据报可以经过的最多路由器数,也就是IPv4数据报的生存时间。TTL的初值由源主机设置(一般为32或64),一旦经过一个处理它的路由器,该值就减1,当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
协议(Protocol):占8位,表明IPv4数据报中数据使用的协议。其中值大概率为17表示UDP,6表示TCP。
头部检验和(Header Checksum):占16位,根据IPv4头部计算的校验和码。由于IP是一种尽力而为的传输协议,保证数据完整性的责任属于上层协议,传输层(TCP和UDP)中有一个校验和字段,IPv6为了提高处理速度去掉了该字段。
每一份IPv4数据报都包含32位源IP地址(Source IP Address)和目的IP地址(Destination IP Address),而IPv6数据报的源IP地址和目的IP地址为128位。
选项(Options):是IPv4数据报中一个可变长度的可选信息。它以32位作为界限,在必要的时候插入0值的填充字段,保证IPv4数据报头部长度始终是32位的整数倍。
流标签(Flow Label):占20位,用于标记需要相同处理的IPv6数据报的次序,这样可使路由器的效率更高。路由器跟踪数据流并更有效地处理属于相同数据流的IPv6数据报,无须重新处理每个IPv6数据报的报头,数据流由流标签和源节点的地址唯一标识,属于同一数据流的所有IPv6数据报必须具有相同的源IP地址和目的IP地址。
下个报头(Next Header):占1字节,包含扩展的IPv6报头的一个协议号或值。该字段是IPv4中协议(Protocl)字段的重新命名,以反映出重新组织的IPv6数据报。
帧数限制(Hop Limit):IPv6数据报每经过一个路由则值减1,该字段和IPv4报头的TTL字段类似。
IPv4校验和
以一个书上例子来说明IPv4报头的校验和计算。
假设某个IPv4数据报报头为:E3 4F 23 96 44 27 99 F3 [00 00]
【注】:上述报头中括号扩起来的就是checksum。
- 校验和的初始值自动被设置为0
- 然后以16位为单位,两两相加,对于上述例子则为:E34F + 2396 + 4427 + 99F3 = 1E4FF
- 若步骤2计算结果不大于0xFFFF,那么直接进行步骤4;若步骤2计算结果大于0xFFFF,则将其高16位加到低16位,对于上述例子则为 E4FF + 0001 = E500
- 最后,将步骤3值取反,上述例子即为~(E500) = 1AFF
上述为发送方的计算,下面再来计算接收方的校验和:
- 接收方报头应该为:E3 4F 23 96 44 27 99 F3 1A FF
- 此时前8字节内容不变,相加的值为E500,然后将E500与上述计算得到的校验和1AFF相加
- 若计算结果为FFFF,再将其取反~(FFFF) = 0000,表明数据报正常,没有错误
IPv6扩展头部
在IPv6中,那些由IPv4选项提供的特殊功能,通过在IPv6头部之后增加扩展头部实现。例如IPv4路由和时间戳,虽然分片很少在IPv6中使用(IPv6中没有分配字段),但是仍然需要。基于此类设计,IPv6头部固定为40字节,扩展头部仅在需要的时候添加。
扩展头部和更高层协议(例如TCP、UDP)头部与IPv6头部链接,形成级联的头部。如下所示:
IPv6下一个头部字段值(Next Header)可能表示扩展头部或其他协议头部,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSy2753K-1652851348767)(https://astralcon.oss-cn-hangzhou.aliyuncs.com/img/KEV`JR6KJ{EW]MY@MVMPX.jpg)]
IP转发
如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(如以太网),那么IP数据报就直接发送到目的主机上。否则,主机就把数据报发往一默认的路由器上,由路由器来转发该数据报。
IP层既可以配置成路由器的功能,也可以配置成主机的功能。本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。
转发表
IP协议没有表明转发表中需要的精确数据,而是将这个选择留给了IP协议的具体实现。尽管如此,实现转发表时的一些关键信息部分是必需的,在转发表或者路由表中每个entry都包含以下信息:
目的地(Destination):IPv4中占32位,IPv6中占128位,其用来匹配经过掩码操作后的结果。可以将其所有位置0表示涵盖所有目的地的“默认路由”,也可以设为完整长度的IP地址表示一个目的地的“主机路由”。
掩码(Mask):IPv4中占32位,IPv6中占128位,用作数据报目的IP地址按位与操作的掩码,其中的目的IP地址是要在转发表中查找的地址。掩码结果与转发表entry中的多个目的地进行比较。
下一站(Next-hop):下一个IP实体(路由器或主机)的32位IPv4地址或128位IPv6地址,数据报将被转发到该地址。
接口(Interface):包含一个由IP层使用的标识符,以确定将数据报发送到下一站的网络接口。
IP转发行为
当一台主机或路由器中的IP层需要向下一站的主机或路由器发送数据报时,该主机或路由器会首先检查数据报中的目的IP地址(用D表示),在转发表中用D来执行最长前缀匹配算法。
IP转发行为有两种,一种是所有系统使用相同的网络前缀的直接交付;另一种叫间接交付。
直接交付:不需要路由器,IP数据报封装在一个链路层帧中,可以直接识别数据源地址或目的地址。
间接交付:涉及到路由器,数据转发到路由器,并使用该路由器的链路层地址作为目的地址。
间接交付
首先看上图直接交付的情况,源IP地址和目的IP地址对应相应的源主机和目的主机,对于下层(如以太网)地址也是如此。但是在间接交付中,IP地址对应相应的源主机和目的主机,而下层地址不对应。实际上是下层地址决定哪台机器在每跳的基础上接受包含数据报的帧。如上述例子所示,R1通过其a侧的下层地址响应后,S将向R1发送数据报,R1接收到数据报之后,通过查找转发表,会通过其b侧将数据报转发给R2,R2通过其a侧下层地址响应。
移动IP
移动IP是网络层的一种通信协议,使计算机在不改变IP地址的前提下,可以实现跨越不同网段进行网络通信。
移动IP和动态IP的区别:动态IP是指在局域网中的计算机可以通过DHCP动态的获取IP地址,不需要用户在计算机网络的设置中指定。
基本模型:双向隧道
上图显示了MIPv6运行中涉及的实体,大部分术语也适用于MIPv4:
- 移动节点(MN):具有无线网络通信功能,并且可以到处移动的通信设备,例如手机、笔记本电脑。
- 通信节点(CNs):与移动节点通信的主机。
- 家乡代理(HA):位于家乡链路上并具有代理功能的路由器。
- 家乡地址(HoA):由家乡网络的网络前缀获得的IP地址。
- 转交地址(CoA):当移动节点漫游到一个可访问的网络时,它被赋予的另一个地址。
工作过程
移动IP工作过程也叫漫游。你的主机在你自己家有一个IP地址可以通信,然后你出门去别的地方了,不可能再去申请一个IP地址,这个时候就会产生三样东西:移动节点、家乡地址和转交地址。在移动IP协议中,每一个移动节点都有一个唯一的家乡地址,该移动节点移动时家乡地址是不变的,当该移动节点连接到外部网络时,转交地址就用来标识移动节点所在的位置,以便进行路由选择。移动节点的家乡地址(HoA)和当前转交地址(CoA)的联合就称为MN绑定。当移动节点获得一个新的转交地址时,通过MN绑定向家乡代理进行注册,也就是当一个CN与一个MN通信时,该流量需要通过MN的家乡代理(HA)来路由。
移动IP技术通信流程如下:
- 移动节点在家乡网络时,按传统的TCP/IP方式进行通信。
- 移动节点漫游到一个外部网络时,仍然适用固定的IP地址进行通信,为了能够收到通信对端发给它的IP分组,移动节点需要向本地代理注册当前的位置地址,这个位置地址就是转交地址。
- 家乡代理接收来自转交地址的注册后,就会构建一个通向转交地址的双向隧道,将收到的发给移动节点的IP分组通过隧道送到转交地址处。
- 在转交地址处解除隧道封装,恢复原始的IP分组,最后送至移动节点,这样移动节点就能够在外网收到发给它的IP分组。
- 移动节点在外网通过外网代理向通信对端发送IP数据包。
- 当移动节点来到另一个外网时,只需要向家乡代理更新注册的转交地址就可以继续通信。
- 当移动节点回到家乡网络时,移动节点向家乡代理注销转交地址,这时移动节点又将适用传统通信方式。
路由优化
双向隧道使MIPv6工作在一种相对简单的方式下,并使用了那些不被移动IP所感知的CN,但是路由效率极低,特别是在MN与CN之间距离近,但与HA之间距离较远的情况下。为了改善路由效率,可以使用路由优化(RO),只要该方法被需要优化的设别支持。
在使用RO时涉及一个通信注册过程,一个移动节点(MN)将当前转交地址(CoA)通知相应通信节点(CN),允许它们执行无需HA协助的路由。RO操作分为两部分:
为了与自己的CN建立一个绑定,MN必须向每个CN证明自己的身份,这通过一个**返回路由程序(RRP)**来完成。
RRP使用以下这些移动消息,它们是IPv6移动扩展头部的子类型:
- 家乡测试初始化(HoTI)
- 家乡测试(HoT)
- 转交测试初始化(CoTI)
- 转交测试(CoT)
这些消息向CN验证一个特定MN的家乡地址(HoTI和HoT消息)和转交地址(CoTI和CoT消息)是否可到达。
【注】:刚吃辣条,不小心把油滴在书上了!!!心痛2022~
MN开始向CN发送HoTI和CoTI消息,HoTI消息在到达CN途中通过HA转发,CN以某种顺序接收到这两种消息,并分别以HoT和CoT消息响应。HoT消息经由HA发送到MN,这些消息中包含称为令牌的随机字符串,MN使用它形成一个加密密钥。随后,这个密钥被用于生成发送给CN的经过认证的绑定更新。如果成功,路由可优化,数据可以在MN与CN之间直接传输。
IP数据报的主机处理
尽管路由器不需要考虑转发的IP数据报的源IP地址和目的IP地址,但是主机必须考虑。
主机模式
确定一个单播数据报是否匹配一台主机的IP地址并被处理,取决于接收系统的主机模式,以及该主机是否为最相关的多宿主主机。主机模式有两种:
- 强主机模式(strong host model):只有当目的IP地址字段中包含的IP地址与数据报到达的接口配置的IP地址匹配时,才同意将数据报交付到本地协议栈。
- 弱主机模式(weak host model):数据报携带的目的地址与它到达的任何接口的任何本地地址匹配,无论它到达哪个网络接口,它都会被接收的协议栈处理。
地址选择
在当前的IP实现中,数据报的源IP地址和目的IP地址字段中使用的IP地址,是通过一组称为源地址选择程序和目的地址选择程序获取的。
IPv6默认地址的选择:
- 优先在相同范围内选择成对的源/目的地址
- 优先选择更小而不是更大的范围以避免在其他地址可用时使用临时地址
- 优先选择具有更长的通用前缀的成对地址
- 当全球地址有效时,优先选择它而不是临时地址
源地址选择算法
- 优先选择相同地址
- 优先选择适当范围,避免过期地址
- 优先选择家乡地址
- 优先选择输出接口,优先选择匹配标签,优先选择非临时地址,使用最长匹配前缀
目的地址选择算法
- 避免不可用的目的地,优先选择匹配范围,避免过期地址
- 优先选择家乡地址
- 优先选择匹配标签
- 优先选择更高优先级
- 优先选择本地传输
- 优先选择更小范围,使用最长匹配前缀
参考文献
- 《TCP/IP详解》卷一(英文版)
- https://www.likecs.com/show-203916684.html
- https://zhuanlan.zhihu.com/p/374507635
- https://blog.csdn.net/Aztl_/article/details/117167808
- https://blog.csdn.net/qq_39346534/article/details/106373627?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106373627-blog-117167808.pc_relevant_eslanding_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106373627-blog-117167808.pc_relevant_eslanding_v3&utm_relevant_index=2
- https://blog.51cto.com/u_15346415/3674289
|