概述
IPV4协议详解
- IPV4数据报头格式
- IPV4分组格式
- 特殊地址部分
- 子网掩码
- 网络地址(网段)的计算
- 数据分片方法
IPV4数据报头格式
前言
发送端的网络层在收到它的上一层——传输层发来的数据段时,需要通过网络层协议将其封装成数据报,也就是加上网络层IP协议(在此仅以IP协议为例进行介绍)头部。
IP协议头部主要是源和目的网络的IP地址,以便可以数据分段传输到目的网络中。然后数据包向下传输,到了数据链路层后又要封装成数据帧。
与在数据帧格式中包括帧头和数据部分类似,一个IP数据报也包括报头和数据这两个部分,如上图所示。其中数据部分就是来自传输层的完整数据段,而报头部分是为了正确传输数据报而增加的网络层IPV4/IPV6协议信息。
格式
版本(Version)
版本字段指定了IP数据报中使用的IP协议版本,占四位。
协议是IPV4,则值为0100,对应16进制为4;
协议是IPV6,则值为0110,对应16进制为6。
头部长度(Header Length)
头部长度字段指示IP数据报头部的总长度,IP数据报头部的总长度以4字节为单位,该字段占4位。
当报头中无选项字段时,报头的总长度为5(二进制0101),也就是5×4=20字节。这就是说IP数据报头部固定部分长度为20字节。当IP头部长度为15(二进制1111),头部的固定长度为15×4=60字节。
报头长度必须是32位(四字节)的整数倍,如果不是,需要在选项字段的填充(PAD)字段中补0凑齐。
区分服务(Differentialted Services)
最开始IP数据报的这个字段为优先级和服务类型字段,又称为服务类型(ToS)字段,用于表示数据报的优先级和服务类型,占八位。
它包括一个3位长度的优先级、4位长度的标志位。标志位分别是D(Delay延迟)、T(Throughput吞吐量)、R(Reliability可靠性)和C(Cost开销值),最高1位未用。
1998年IETF在RFC2474中把IP数据报中ToS字段改名为服务字段,同样为8位,前6位构成DSCP(Different Services Code Point,区分服务码点),是IP优先级和服务类型字段的组合,定义了0~63共64个优先级。最后两位未使用。
无论是哪种版本,该字段只有在使用区分服务时才起作用,如果没有区分服务,则该字段值为0。
总长度(Total Length)
总长度字段标识整个IP数据报的总长度,包括报头和数据部分,整个IP数据报的总长度以字节为单位,该字段占16位。由此可得出,IPv4数据报的最大长度为(2^16−1)字节即65535字节(64KB)。
说明:在网络层下面的每一种数据链路层都有自己的格式,其中包括表示数据字段的最大长度,这称为最大传送单元(Maximum Transfer Unit,MTU)。当一个数据报封装成链路层的帧时,此数据报的总长度(包括报头和数据部分)一定不能超过下面的数据链路层的MTU值
标识(Identification)
标识字段用于表示IP数据报的标识符,占16位,每个IP数据报有一个唯一的标识符。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给整个标识字段。
但整个标识并不是序号,因为IP是无连接服务,数据报不存在按序接受的问题。当数据报由于长度超过下面数据链路层的MTU(最大传输单元)值而必须分段的时候,这个标识符的值就被复制到所有的数据报分段的标识字段中。相同的标识字段的值分段后的各数据报分段最后能正确地组装成原来的数据报。
标志(Flags)
标志字段用以指出该IP数据报后面是否还有分段,也就是这个字段时分段标志,占3位。目前只有前两位有意义:最低以为记为MF(More Fragment),如果MF=1,则表示后面还有分段,如果MF=0表示这已是某个数据报的最后一个分段;中间一位记为DF(Don’t Fragment),当DF=1时表示不允许分段,DF=0表示允许分段;最高1位没有使用。
段偏移(Fragment Offset)
段偏移字段用以指出该分段在数据报中的相对位置,也就是说,相对于用户数据字段的起点,该分段从何处开始,占13位。
若有分段,段偏移以8字节为偏移单位,即每个分段的长度一定是8字节(64位)的整数倍。第一个分段偏移值就是0 0000 0000 0000,如果第一个分段一共是64字节,则0 0000 0000 1001,相当于10进制数的9,因为从第9个“8字节”数据块开始的。如果没有分段,则该字段值为0。
生存时间(Time To Live)
生存时间字段用来标识IP数据报在网络中传输的有效期,以秒来计数,占8位。最初的设计是以秒为单位,没经过一个路由器时,就在TTL(Time To Live)中减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1s,就把TTL值减1。TTL的建议值是32s,最长是(2^8−1)=255s。现在通常认为这个TTL是指数据报允许经过的路由器数,每经过一个路由器,则TTL减1,当TTL值为0时,就丢弃这个数据报。设定生存时间是为了防止数据报在网络中无限制地循环转发。
协议(Protocol)
协议字段用来标识此IP数据报在传输层所采用的协议类型(如TCP、UDP或ICMP等等),以便使目的主机的IP层直到应将数据部分上交给哪个处理过程,占8位。例如:
TCP的协议号是6,等于二进制的0000 1010;
UDP的协议号是17,等于二进制的0001 0001。
校验和(Checksum)
校验和字段用来检验IP数据报的报头部分(不包过“数据”部分)在传输到接收端后是否发生了变化,占16位。这是因为数据报每经过一个路由器,路由器都要重新计算一下报头检验和(因为一些字段,如生存时间、标识、段偏移等都可能发生变化),不检验数据部分可减少计算的工作量。
检验和的计算方法
利用校检和字段检验报头部分数据正确性的基本原理是:现在发送端校检和字段中填上一个特定的值,然后再接收端把包括校检和字段在内的报头部分进行二进制反码求和,再取反,如果结果为0,则表示报头部分在传输过程中没有发生变化,否则表示在传输过程中出现了差错。从以上可以看出,这里最关键的是在发送端计算出这个校检和的值。步骤如下:
source ip address:源IP地址,32bit 发送方的ip地址
Destination ip address:目的IP地址,32bit 接收方的IP地址
- 源地址和目的地址在传输过程中,有可能被(Network address translation,NAT)设备改变。
Option可选字段:Option字段很少使用,用于控制、转发要求、测试等
IPV4分组格式
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。
- IP地址的网络部分称为网络地址(Network),网络地址用于唯一地标识一个网段,或者若干网段的聚合,同一网段中的网络设备有同样的网络地址。
- IP地址的主机部分称为主机地址(Host),主机地址用于唯一的标识同一网段内的网络设备(如电脑,笔记本,手机等网络电子设备)。
我们经常用到的是A、B、C三类地址。IP地址由国际网络信息中心组织(International Network Information Center,InterNIC)根据公司大小进行分配。过去通常把A类地址保留给政府机构,B类地址分配给中等规模的公司,C类地址分配给小单位。
- A类IP地址的网络地址为第一个八位数组,第一个字节以“0”开始。因此,A类网络地址的有效位数为8-1=7位,A类地址的第一个字节为1~ 126之间(127留作它用)。例如10.1.1.1、126.2.4.78等为A类地址。A类地址的主机地址位数为后面的三个字节24位。A类地址的范围为1.0.0.0~126.255.255.255,每一个A类网络共有224个A类IP地址。
- B类IP地址的网络地址为前两个八位数组,第一个字节以“10”开始。因此,B类网络地址的有效位数为16-2=14位,B类地址的第一个字节为128~ 191之间。例如128.1.1.1、168.2.4.78等为B类地址。B类地址的主机地址位数为后面的二个字节16位。B类地址的范围为128.0.0.0~ 191.255.255.255,每一个B类网络共有216个B类IP地址。
- C类IP地址的网络地址为前三个八位数组,第一个字节以“110”开始。因此,C类网络地址的有效位数为24-3=21位,C类地址的第一个字节为192~223之间。
例如192.1.1.1、220.2.4.78等为C类地址。C类地址的主机地址部分为后面的一个字节8位。C类地址的范围为192.0.0.0~ 223.255.255.255,每一个C类网络共有2的8次方=256个C类IP地址。- D类IP地址第一个8位数组以“1110”开头,因此,D类地址的第一个字节为224~239。D类地址通常作为组播地址。关于组播地址。
- E类IP地址 第一个字节为240~255之间,保留用于科学研究。
在A、B、C类地址中,又划分了一部分为私有IP地址,另一部分为公有IP地址。由于公有IP地址都是运营商在操作,我们主要用到的是私有IP地址。
通常在公司内部网络使用私有IP地址。私有IP地址是由InterNIC预留的由各个企业内部网自由支配的IP地址。
InterNIC预留了以下网段作为私有IP地址:
- A类地址10.0.0.0~10.255.255.255;
- B类地址172.16.0.0~ 172.31.255.255;
- C类地址192.168.0.0~192.168.255.255。
- 使用私有IP地址不能直接访问Internet。原因很简单,私有IP地址不能在公网上使用,公网上没有针对私有地址的路由,会产生地址冲突问题。当访问Internet时,需要利用网络地址转换(NAT,Network Address Translation)技术,把私有IP地址转换为Internet可识别的公有IP地址。
- 使用私有IP地址,不仅减少了企业用于购买公有IP地址的投资,而且节省了IP地址资源。但是这并不能完全解决IP地址短缺问题,目前已经正式提出了IPv6协议。IPv6地址有128个二进制位,共约2128个IP地址,完全可以解决IP地址紧张问题。
特殊地址部分
- 主机部分全为“0”的IP地址,称为网络地址,网络地址用来标识一个网段。例如,A类地址1.0.0.0,私有地址10.0.0.0, 192.168.1.0。
- 主机部分全为“1”的IP地址,称为网段广播地址,广播地址用于标识一个网络的所有主机。例如,10.255.255.255 , 192.168.1.255等,路由器可以在10.0.0.0或者192.168.1.0等网段转发广播包。广播地址用于向本网段的所有节点发送数据包。
- 对于网络部分为127的IP地址,例如127.0.0.1往往用于环路测试目的。
- 全“0”的IP地址0.0.0.0代表所有的主机,路由器用0.0.0.0地址指定默认路由。
- 全“1”的IP地址255.255.255.255,也是广播地址,但255.255.255.255代表所有主机,用于向网络的所有节点发送数据包,这样的广播不能被路由器转发。
每一个网段可用主机地址:假定这个网段的主机部分位数为n,那么可用的主机地址个数为2的n次方-2个ip地址可以使用。
子网掩码
子网掩码:
网络设备使用子网掩码(subnet masking)决定IP地址中哪部分为网络部分,哪部分为主机部分。
子网掩码使用与IP地址一样的格式。子网掩码的网络部分和子网部分全都是1,主机部分全都是0。
缺省状态下,如果没有进行子网划分,A类网络的子网掩码为255.0.0.0,B类网络的子网掩码为255.255.0.0,C类网络子网掩码为255.255.255.0。利用子网,网络地址的使用会更有效。
IP地址对应的默认的子网掩码,然后它的网络地址计算出此IP地址的网段。
例如:
192.168.1.100 默认子网掩码:255.255.255.0 ,网段(网络地址):192.168.1.0
子网掩码另外一种表示方式
如果子网掩码默认为255.255.255.240。可以通过换算得到网络位是/28。
255.255.255.240的二进制形式是:
1111 1111.1111 1111.1111 1111.1111 0000
总共有28个1,所以又可以表示成 /28
255.255.255.240= /28位。
即192.168.1.7 255.255.255.240 也可以表示为:192.168.1.7/28。
网络地址(网段)的计算
把二进制IP地址的和二进制的子网掩码作与运算,就可以得到此IP地址的网段(网络地址)。
怎么知道有多少个IP地址可以给电脑、手机等设备使用呢?
主机IP数量的计算。每个网段IP有多少个,就看主机位。
主机数计算举例
可用于主机的IP地址个数是16-2=14个IP地址。也就是一个子网掩码为28位的,每个子网的可用IP地址个数为14个IP地址,供电脑、手机等设备使用。
192.168.1.100/28
可用主机位IP地址:192.168.1.97~192.168.1.110,这个地址段的IP地址,都是和192.168.1.100在同一个网段。
子网数计算举例:
无子网编址:
对于没有子网的IP地址组织,外部将该组织看作单一网络,不需要知道内部结构。例如,所有到地址172.16 .X.X的路由被认为同一方向,不考虑地址的第三和第四个8位分组,这种方案的好处是减少路由表的项目。
但这种方案没法区分一个大的网络内不同的子网网段,这使网络内所有主机都能收到在该大的网络内的广播,会降低网络的性能,另外也不利于管理。
比如,一个B类网可容纳65000个主机在网络内。但是没有任何一个单位能够同时管理这么多主机。这就需要一种方法将这种网络分为不同的网段。按照各个子网段进行管理。
带子网编址:
从地址分配的角度来看,子网是网段地址的扩充。网络管理员根据组织增长的需要决定子网的大小。
网络设备使用子网掩码(Subnet Masking)决定IP地址中哪部分为网络部分,哪部分为主机部分。
子网掩码使用与IP地址一样的格式。子网掩码的网络部分和子网部分全都是1,主机部分全都是0。缺省状态下,如果没有进行子网划分,A类网络的子网掩码为255.0.0.0,B类网络的子网掩码为255.255.0.0,C类网络子网掩码为255.255.255.0。利用子网,网络地址的使用会更有效。对外 仍为一个网络,对内部而言,则分为不同的子网。
如图:网络172.16.0.0 分为两个网段:172.16.4.0、172.16.8.0。
如果公司的财务部使用172.16.4.0 子网段;公司的工程部使用 172.16.8.0 子网段。这样可使路由器根据目的子网地址进行路由,从而限制一个子网的广播报文发送到其它网段,不对网络的效率产生影响。
子网规划举例:
例子:某公司分配到C类地址201.222.5.0。假设需要20个子网,每个子网有5台主机,我们该如何划分?
在这个例子中,网段地址是一个C类地址:201.222.5.0。假设需要20个子网,其中每个子网5个主机,就要把主机地址的最后一个八位组分成子网部分和主机部分。
子网部分的位数决定了子网的数目。在这个例子中,因为是C类地址,所以子网部分和主机部分总共是8位,因为24<20<25,所以子网部分占有5位,最大可提供30(25 -2)个子网。剩余3位为主机部分。一共有8个(23)值。主机部分全是0的IP地址,是子网网络地址;主机部分全是1的IP地址是本子网的广播地址。这样就剩余6个主机地址。可以满足需要。
每个网段分别为:
数据分片方法
路由接收到一个packet,检查目的地址,确定输出接口(outgoing interface)和接口的最大传输单元(Maximum Transmition Unit,MTU)。如果packet > MTU,且DF位是0,路由会对packet分片。
4000 bytes的packet,首部20bytes,没有options,router的MTU是1500 bytes,分片。
Fragment | Total bytes | Header bytes | Data Bytes | MF | Fragment offset |
---|---|---|---|---|---|
1 | 1500 | 20 | 1480 | 1 | 0 |
2 | 1500 | 20 | 1480 | 1 | 185 |
3 | 1000 | 20 | 980 | 0 | 370 |
如果接下来的router的MTU是1000 bytes,上表Fragment 1/2/3都会在分片,一个IP分组的所有分片的Identifier位相同,只有最后一个分片的MF=0。
最后
以上就是隐形画笔为你收集整理的IPV4协议详解+子网掩码的全部内容,希望文章能够帮你解决IPV4协议详解+子网掩码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复