IP协议是网络层中最重要的协议, 它主要完成两方面的工作:
IP协议分包:
分包操作就是将一个较长的数据包分成多个较短的数据包, 这里的分包只是单纯的对数据进行拆分, 并不关注数据内容, 也不关注某个包内部是否有TCP报头.
那么, 对一个数据包进行拆分后, 接收方如何能区分哪些小的数据包能拼接成一个完整的IP数据包呢?
我们注意到, 每个拆分后的数据包都有一个IP报头, 上面有一个字段叫做16位标识, 同一个数据包分包后产生的小的数据包的16位标识是相同的, 这样, 接收方就能通过相同的16位标识来找到这些数据包并进行组包, 并且通过13位片偏移量来描述这些被拆分的包的顺序, 片偏移量越小, 包的位置越前. 3位标志位中仅有一位有效, 这一位为0, 表示这个包后面还有别的包, 为1表示这个包是最后一个包.
为什么要为IP数据包设置TTL呢?
有些IP数据包中的IP地址可能有误, 可能永远无法到达这个IP地址, 这样的包不能在网络传输中无休止地转发, 无休止地转发会占用大量的硬件资源, 因此, 如果数据包的TTL减到0, 代表这个数据包的转发次数过多, IP地址可能有误, 就会丢弃这个数据包.
注意: 正常情况下TTL不会减到0, IP数据包会在TTL减到0之间到达目的地.
8位协议: 表示上层(也就是传输层)使用的协议类型, 协议不同, 这里的取值也不同.
16位首部校验和: 校验数据是否正确.
注意: 校验和的结果并不是准确无误的, 校验和正确不代表数据一定正确, 校验和不正确, 数据一定是不正确的.
32位源IP, 32位目的IP: 源IP表示发送方的网络地址, 目的IP表示接收方的网络地址.
IP地址:
IP地址是一个32位的二进制整数, 通过"点分十进制"的方式将IP地址分为了4个8位2进制数, 这4个数之间用"."连接, 例如, 152.168.0.1, 注意, 一个8位二进制的最大值为255, 因此, IP地址中这四个数的大小不能超过255.
IP可以分为两个部分, 网络号+主机号, 网络号描述了当前的网段信息, 也就是局域网的标识, 主机号区分了局域网内部的主机.
注意:在同一个局域网内部, 网络号是相同的, 但主机号不能相同, 同一个路由器连接的不同局域网的网络号不同.
那么到底多少位是网络号, 多少位是主机号?
这个是不固定的, 为了表示多少个bit位是网络号, 我们引入一个概念, “子网掩码”. 子网掩码也是一个32位的二进制数, 子网掩码的左侧均为1, 右侧均为0, 不会出现1在0的右边这种情况, 左边的所有1表示这些位是网络号, 右边的所有0表示这些位是主机号.
例如, 一个子网掩码为255.255.255.0, 转为二进制为1111 1111 1111 1111 1111 1111 0000 0000, 代表IP地址中前24位为网络号, 后8位为主机号.
一些特殊的IP地址:
当前的IPv4协议使用的IP地址是32位整数, 32位整数能表示的范围<43亿, 如果每个设备都分配一个IP, 那32位IP地址明显不够用了, 因此, 无法实现让每台设备都有自己单独的IP, 那么, 如何区分网络中这么多的设备呢?
什么叫内网IP和外网IP?
举个例子, 我们将一个学校看做一个局域网, 学校的名字就是一个外网IP, 每个学校在全世界是独一无二的, 而在学校的内部, 例如A栋教学楼203教室, 这就是一个内网IP, 这个IP地址在一个学校内部是唯一的, 但其他学校里也会有A栋教学楼203教室.
同一内网中的设备可以共用同一个外网IP, 就好比某个学校的学生取快递时, 收货地址都是这个学校, 快递小哥只需要将这些快递放在学校的快递收发室即可, 不需要针对到每个人.
注意:对于一个外网IP, 可以在互联网中的任意位置访问到, 对于一个内网IP, 只能通过局域网内部访问, 也就是两台设备之间不能跨局域网直接进行通信.
IPv6中使用了一个更长的字段来表示IP地址, 长度为16个字节, 也就是128位, 极大地扩大了IP地址的范围, 但由于IPv4和IPv6互不兼容, 而现在大量的网络设备都使用的是IPv4, 因此, 虽然IPv6的普及程度很广, 但也有很大一部分用户使用IPv4+NAT机制.