JavaEE初阶|计算机网络 - IP协议

IP协议是网络层中最重要的协议, 它主要完成两方面的工作:

  1. 地址管理
  2. 路由选择
IP协议数据报:
JavaEE初阶|计算机网络 - IP协议
文章图片

  1. 4位版本:IP协议的版本号, 现在使用的IP协议只有两种, 因此版本号也只有两种取值, 分别为4和6
  2. 4位首部长度:代表报头长度(与TCP协议相同, 报头长度可变)
  3. 8位TOS:8位TOS中仅有四位有效, 分别为最小延时, 最大吞吐量, 最高可靠性, 最小成本, 这四位同一时刻只能实现一种状态(将一个设为1, 其他只能为0), IP协议能够规划两点间最合适的路径, 所谓"合适"就是在这四位TOS中选择一项, 并优先考虑这一项
  4. 16位总长度:单个IP数据报最大长度为64k, 如果要表示一个更长的数据报, IP协议内部实现了分包和组包这样的操作, 具体的实现方式就是下面的这几个字段
  5. 16位标识, 3位标志, 13位片偏移:用于实现分包和组包的字段
IP协议分包:
JavaEE初阶|计算机网络 - IP协议
文章图片

??分包操作就是将一个较长的数据包分成多个较短的数据包, 这里的分包只是单纯的对数据进行拆分, 并不关注数据内容, 也不关注某个包内部是否有TCP报头.
那么, 对一个数据包进行拆分后, 接收方如何能区分哪些小的数据包能拼接成一个完整的IP数据包呢?
??我们注意到, 每个拆分后的数据包都有一个IP报头, 上面有一个字段叫做16位标识, 同一个数据包分包后产生的小的数据包的16位标识是相同的, 这样, 接收方就能通过相同的16位标识来找到这些数据包并进行组包, 并且通过13位片偏移量来描述这些被拆分的包的顺序, 片偏移量越小, 包的位置越前. 3位标志位中仅有一位有效, 这一位为0, 表示这个包后面还有别的包, 为1表示这个包是最后一个包.
  1. 8位生存时间: 表示一个IP数据包在网络传输中还能存在多久, 单位为转发次数. IP数据包被发送时, 会有一个初始的TTL(常见的初始值为128或64), IP数据包每经过一个路由器, TTL会减一, 如果TTL减到0, 收到这个包的路由器就会丢弃这个数据包.
为什么要为IP数据包设置TTL呢?
??有些IP数据包中的IP地址可能有误, 可能永远无法到达这个IP地址, 这样的包不能在网络传输中无休止地转发, 无休止地转发会占用大量的硬件资源, 因此, 如果数据包的TTL减到0, 代表这个数据包的转发次数过多, IP地址可能有误, 就会丢弃这个数据包.
注意: 正常情况下TTL不会减到0, IP数据包会在TTL减到0之间到达目的地.
  1. 8位协议: 表示上层(也就是传输层)使用的协议类型, 协议不同, 这里的取值也不同.
  2. 16位首部校验和: 校验数据是否正确.
    注意: 校验和的结果并不是准确无误的, 校验和正确不代表数据一定正确, 校验和不正确, 数据一定是不正确的.
  3. 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地址:
  1. 如果IP地址全为0, 表明这个IP为网络号(局域网中的正常设备, 主机号无法设置为0)
  2. 如果IP地址全为1(255.255.255.255), 表明这个IP为广播地址, 向这个广播地址中发送数据, 整个局域网中的设备都能收到
  3. 如果IP地址为127开头(如127.0.0.1), 这个IP是一个"环回IP", 表示主机自己, 127.0.0.1就是环回IP的典型代表
  4. IP地址是10开头(如101.0.0.1), 192.168开头, 172.16~172.31开头, 表示这个IP地址是一个局域网内部的IP(内网IP), 除此之外的IP均为外网IP.
    我们规定外网IP一定是唯一的, 每个外网IP都对应到一台设备, 而内网IP只在当前局域网中是唯一的, 对于不同的局域网, 可以有相同的内网IP.
当前的IPv4协议使用的IP地址是32位整数, 32位整数能表示的范围<43亿, 如果每个设备都分配一个IP, 那32位IP地址明显不够用了, 因此, 无法实现让每台设备都有自己单独的IP, 那么, 如何区分网络中这么多的设备呢?
  1. 动态分配IP地址: 让每台设备只有在连接到网络时才有IP地址, 不联网时这个IP可能被别的设备使用. 这个方法并没有减少设备数量, 也没有增加IP地址, 如果同时连接网络的设备超过了43亿, 这种方法就会失效.
  2. NAT机制: 多个设备共用同一个外网IP, 将网络分为内网(局域网)和广域网(外网), 要求外网IP必须表示唯一的设备, 内网IP仅在一个局域网内具有唯一性, 同一内网中的若干设备, 可以共用一个外网IP.
什么叫内网IP和外网IP?
??举个例子, 我们将一个学校看做一个局域网, 学校的名字就是一个外网IP, 每个学校在全世界是独一无二的, 而在学校的内部, 例如A栋教学楼203教室, 这就是一个内网IP, 这个IP地址在一个学校内部是唯一的, 但其他学校里也会有A栋教学楼203教室.
??同一内网中的设备可以共用同一个外网IP, 就好比某个学校的学生取快递时, 收货地址都是这个学校, 快递小哥只需要将这些快递放在学校的快递收发室即可, 不需要针对到每个人.
注意:对于一个外网IP, 可以在互联网中的任意位置访问到, 对于一个内网IP, 只能通过局域网内部访问, 也就是两台设备之间不能跨局域网直接进行通信.
  1. IPv6
【JavaEE初阶|计算机网络 - IP协议】??IPv6中使用了一个更长的字段来表示IP地址, 长度为16个字节, 也就是128位, 极大地扩大了IP地址的范围, 但由于IPv4和IPv6互不兼容, 而现在大量的网络设备都使用的是IPv4, 因此, 虽然IPv6的普及程度很广, 但也有很大一部分用户使用IPv4+NAT机制.

    推荐阅读