IP协议(报头格式 | 网段划分)

IP协议报头格式

在这里插入图片描述
版本
        占 4 位,表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4,即 IPv4。
首部长度
        IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节。当 IP 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。
区分服务(TOS)
        也叫作服务类型。占8位,3位优先权字段(已经弃用),4位TOS字段, 和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时, 最大吞吐量,,最高可靠性,最小成本.。这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序,最小延时比较重要; 对于ftp这样的程序,最大吞吐量比较重要。
总长度
        16位总长度(total length): IP数据报整体占多少个字节。和UDP不同,虽然报头里都是16位长度,但是IP协议自身支持 拆包和组包~
标识
        16位。 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。
标志
        第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记。
片偏移
        是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。
生存时间(TTL)
         数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
协议
        表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。
首部检验和
        16位。使用CRC进行校验, 来鉴别头部是否损坏。
源地址,目的地址
        32位,表示发送端和接收端。IP地址本质上是一个32位的整数~,我们平常看见的:36.46.71.180,这是通过点分十进制来表示的。每个部分的范围是0-255。
可选字段
        该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
数据部分
        表示传输层的数据,如保存 TCP、UDP、ICMP 或 IGMP 的数据。数据部分的长度不固定。

网段划分

IP地址分为两部分:
网络号:局域网的身份表示
主机号:用来区分同一个局域网中的不同主机~
同一个局域网中,各个设备的网络号相同,主机号不同,两个相邻的局域网,网络号也不能相同~

1.传统划分方式

将IP地址分为5类(A,B,C,D,E)类
在这里插入图片描述

  • A类 0.0.0.0到127.255.255.255
  • B类 128.0.0.0到191.255.255.255
  • C类 192.0.0.0到223.255.255.255
  • D类 224.0.0.0到239.255.255.255
  • E类 240.0.0.0到247.255.255.255

但是这样划分会有一些问题:
(1)IP地址空间的利用率降低:一个B类网络中最多可以表示的IP地址为65534个,而某些种类网络由于链路的特点能够连接的结点个数有限,所以就会造成大量的IP地址浪费;由于C类网络能连接的结点个数有限。所以,单位会申请B类网络,但一般又用不了这么多的IP地址,所以会造成IP地址的浪费。同理,A类网络的IP地址也会造成大量的浪费;

(2)如果给每一个物理网络都分配一个网络号,就会导致路由表过大。此时就会造成路由表的管理成本增加,同时查询的效率也会增加。

(3)当一个单位申请了一个网络号。他想将该网络能表示的IP地址再分给它下属的几个小单位时。如果在申请新的网络就会造成浪费。

2.通过“子网掩码”划分

所以,开始放弃IP地址的分类,采用任意长度分割IP地址的网络标识和主机标识,它与ABC类的划分没有任何关系。称为CIDR。它可以不受IP地址分类的限制,自由进行分配。

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
  • 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

子网掩码也是一个32位的整数,特点就是,从二进制的角度来看,前半部分都是1,后半部分都是0
拿着 子网掩码 和 IP地址进行按位与操作,得到的结果就是网络号,剩下的部分就是主机号~~

举个例子:
在这里插入图片描述

拓展:
还有一些特殊的IP地址
下图为我自己电脑的IP地址
在这里插入图片描述
1.将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
192.168.0.0 这就相当于一个网络号,用来区分当前局域网

2.将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包
192.168.1.255 这个就叫做广播地址 并不能赋给某一个主机,但是如果我往这个IP上发送消息,意味着整个局域网的所有主机都能收到。

3.127.* 的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

就相当于你往这个IP发消息,发进去之后,绕了一圈之后又回来了,还是自己收到,访问自己主机。
通过环回IP来访问数据,速度是非常快的,虽然也需要通过协议栈进行封装分用,但是一系列的动作都是在内存中完成的~


版权声明:本文为wlm123666原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。