网络层(一):IPv4协议的基本内容
网络层通过路由选择算法,为IP分组从源主机到目的主机选择一条合适的传输路径,为传输层提供端-端数据传输服务。
1、IP协议
1.1、IP协议是一种无连接、不可靠的分组传送服务的协议
无连接(connectionless)意味着IP协议并不维护IP分组发送后的任何状态信息。每个分组的传输过程是相互独立的。
不可靠(unreliable)意味着IP协议不能保证每个IP分组都能正确的、不丢失和顺序的达到目的主机。
1.2、IP协议是点-点的网络层通信协议
IP协议要保证数据分组从一个到另一个路由器,通过多条路径从源主机到达目的主机。IP协议是针对源主机-路由器、路由器-路由器、路由器-目的主机之间的数据传输的点-点线路的网络层通信协议。
1.3、IP协议屏蔽了互联的网络在数据链路层、物理层协议与实现技术上的差异
通过IP协议,网络层向传输层提供的是同一的IP分组,传输层不需要考虑互联网络在数据链路层、物理层协议与实现技术上的差异,IP协议使得异构网络的互连变得容易。
2、IPv4分组格式
2.1、IPv4分组结构
IPv4分组由两部分组成:分组头和数据。
分组头有时也称为首部,长度可变,常用4字节为基本单元表示分组头字段。
图中前5行是每个分组头中必须有的字段,第6行开始的是选项字段,IPv4分组头的基本长度是20字节。若加上最长的40字节的选项,则IP分组头最大长度为60字节。
2.2、IPv4分组头格式
版本(version),长度为4字节,表示锁使用的网络层IP协议的版本号。版本字段值为4,表示IPv4;版本字段值为6,表示IPv6。在处理分组前,必须检查版本号。
分组头长度(IHL),字段长度为4,定义了以4字节为一个单位的分组头的长度。分组头中除了IP选项字段与填充字段外,其他各项是定长的。报头的固定长度部分为20字节。因此,分组头长度字段最小值为5 (5 × 4B = 20B)。协议规定:IP分组的分组头长度必须是4字节的整数倍,如果不是4字节的整数倍,则由填充字段"添0"补齐。
区分服务(DS),字段长度为8位服务类型(ToS)。ToS字段用了4位:D(延迟)、T(吞吐量)、R(可靠性)、C(成本)。区分服务只有在IPv4网络中提供区分服务时才起作用。区分服务的后两位显示拥塞通知(ECN)字段,当一个被标识的分组被目的结点接收时,有些协议会发现分组被标识,并通知发送方,降低发送速度,可以在路由器因过载而丢弃分组之前缓解拥塞。
总长度(total length)字段定义了以字节为单位的分组头字段与数据字段长度之和,该字段长度为16位,能表示IP分组最大长度为65535字节,IP分组的数据长度=分组总长度 - 分组头长度。
生存时间,IP分组从源主机到达目的主机的传输延迟是不确定的,若出现路由器的路由表错误,则可能造成分组在网络中循环、无休止的流动。为防止这种情况,IPv4协议设计一个生存时间(time-to-live,TTL)字段。生存时间TTL用来设定分组在Internet中的"存活时间",它通常是用转发分组最多的路由器跳数(hop)来度量。生存时间TTL的初始值由源主机设置,经过一个路由器转发之后TTL值减1。当TTL值为0时,路由器丢弃该分组,并向源主机发送ICMP报文。
协议(protocol),使用IP协议的高层协议类型,协议字段长度为8位。
头校验和(header checksum)字段长度为8位。设置头检验和实为了保证分组头部的数据完整性。
IP分组只对分组头进行校验,而不包括分组数据。有两点原因:
·IP分组头之外的部分属于高层数据,高层数据都会有相应的校验字段,IP分组可以不对高层数据做校验;
· 每经过一个路由器,IP分组头都要改变一次,但是数据部分并不改变。设置头检验和只对变化部分进行校验是合理的,可以减少路由器对每个接收分组的处理时间,提高路由器的运行效率。
地址(address),包括 源地址(source address) 和 目的地址(destination address)。源地址与目的地址长度都是32位,分别发送分组的源主机与接收分组的目的主机的IP地址,在分组的整个传输过程中,无论采用何种传输路径或如何分片,源地址与目的地址始终保持不变。
2.3、IP分组的分片与组装
IP分组作为互联网络结构中网络层的数据必然听过数据链路层,封装成帧之后,再经过物理层来传输。
不同的网络的数据链路层MTU的长度可能不同,路由器在接收到分组并准备转发目的主机时,首先根据下一个网络的数据链路层MTU,决定该分组在转发之前是否需要分片。
未分片与分片后的IP分组头:
IP报头中有3个字段与分片有关,即标识、标志与片偏移字段。标识(identification)字段长度为16位,最多可分配65535个ID值。主机在发送每一个IP分组时,讲一个内部计数器值加1来产生标识字段的值。"标识"(Ident)用来表示属于同一个IP数据字段的分片。如主机A发送的IP分组分配的"标识"字段值是6205,则当这个分组被分片时,3个分片的"标识"字段均为6205。目的主机B在接收到多个分片时,就将标识字段为6205的分片挑出来,重新组装成一个数据报。
"片偏移"(fragment offset) 表示分片在整个分组中的相对位置。长度为13位。片偏移值以8字节为单位来计数,选择的分片长度应为8字节的整数倍。第一个分片的偏移值为0;第二个分片的偏移值为512/8=64;第三个分片的偏移值(512 + 512)/8 = 128。
标志字段的结构:
标志(flags)字段共3位,最高位为0,该值必须复制到所有分组中。
不分片(do not fragment,DF)位的值必须被复制。DF=0,标识路由器可以分片;DF=1,标识路由器不能对分组进行分片。若分组长度超过MTU,又不可以分片,则这个分组只能丢弃,路由器用ICMP差错报文向源主机报告分组被丢弃。
分片(more frgment,MF)值表示该分片是不是最后一个分片。
不分片DF位是通知路由器不能对接收到的分组进行分片处理。
2.4、IP分组头选项
2.4.1、设置IP分组头选项的目的
设置IP分组头选项主要用于控制与测试。
作为分组头选项,用户可不使用,但所有实现IP的硬件或软件都应该能够处理它;
选项的最大长度为40字节,若用户使用的选项长度不是4字节的整数倍,需要添加填充位,补成4字节的整数倍;
分组头选项时由选项码、长度与选项数据三部分组成。选项码用于确定该选项具体功能。长度表示选项数据的大小;
2.4.2、源路由
源路由是指由发送分组的源主机指定的传输路径,用来区别由路由器通过路由选择算法确定的路径。源路由主要用于测试某个网络的吞吐量,绕开出错的网络,也可以用于保证分组传输安全的应用中。源路由分为 严格源路由 和 松散源路由。
严格源路由,规定分组要经过的路径上的每个路由器,相邻路由器之间不能插入其他路由器,并且经过的路由器顺序不能改变。
松散源路由,规定分组一定要经过的路由器,但不是一条完整的传输路径,中途可经过其他路由器。
记录路由,将分组经过的每个路由器IP地址记录下来。记录路路由选项常用于网络测试。
时间戳(TS),时间戳可以记录分组经过每个路由器的本地时间,单位是毫秒(ms)。
2.5、校验和计算方法
IP分组头的校验和采取"二进制反码求和"算法,具体计算方法如下:
将IP分组头看成是16位字组成的二进制比特序列,计算之前将校验和字段置0。
对16位字进行求和运算。如最高位出现进位,则将进位加到结果的最低位1。
将最终求和结果取反,得校验和,计算结束后,将校验和放到分组头的校验字段。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)