• Java EE——网络层IP协议的格式与内容解析


    网络层

    网络层需要定义发送方和接收方的位置,并且在发送方和接收方中众多的交换机,路由器之中找到一个合理的路径进行传输数据

    IP协议报文格式

    1. 4位版本 (只有IPv4和IPv6两个版本)
    2. 4位首部长度 (和TCP一样,首部可以变长)
    3. 8位服务类型 (实际只有4位有效,并且4位中只有一个可以取1,代表IP协议的工作模式)
    4. 16位总长度 (代表IP数据报的长度)
    5. 16位标识 (同组的包有相同的标识,便于包的组装)
    6. 3位标志 (主要有两位起作用,一位代表当前是否分包,一位代表这个包是不是最后一个)
    7. 13位片偏移 (区分分包后的前后顺序)
    8. 8位生存时间 (单位是次数,一般是32/64/128,每经过一个路由器转发,次数就会减一,如果这个包的生存时间到了0还没有到达接受方,就销毁这个包,防止这个包陷入传输的循环,空空浪费传输的资源)
    9. 8位协议 (IP载荷中的数据报使用的传输层的协议,便于接受方在拆包时区分用哪个传输层协议解析数据)
    10. 32位源IP地址 (发送方IP地址)
    11. 32位目的IP地址 (接收方IP地址)
    12. 数据 (载荷)

    可以看到我们的IP地址只有32位,也就是说我们最多有42亿9000万个不同的主机,但是由于我们有各种服务器,物联网装备等等,所以这个数量对于我们来说是不够用的,我们通过以下
    方式解决这个问题

    动态分配IP地址

    并不是一个设备出厂时就绑定好一个IP地址,而是只有当其上网时才给分配一个IP地址,不上网时就把IP地址回收。这样的话当美国人那边到了深夜,就很多人不上网了,就可以给我们这分配很多的IP地址

    NAT机制

    并不是每个主机都有独立的IP地址

    将IP地址分成两类

    1. 外网/公网IP
    2. 内网/私网/局域网IP(例如10.xxx ,172.16xxx,172.31.xxx,192.168.xxx 这些都是内网IP)

    我们约定在同一个局域网内部,IP地址不可以重复,而在不同的局域网下,IP地址可以重复。在局域网内部如果访问外网的服务器,就用一个外网的IP来代替局域网中的所有设备

    例如我的路由器的IP地址是1.2.3.4,我有三个设备,手机IP是192.168.1.1,平板IP是192.168.1.2,电脑IP是192.168.1.3。这些设备在我的局域网中的IP地址是不能相同的。当我想拿我的手机访问CSDN的服务器(IP是5.6.7.8)时,会构造这样的一份数据报

    源IP地址:192.168.1.1
    目的IP地址:5.6.7.8
    
    • 1
    • 2

    而当这个数据报传输到路由器上时,会将192.168.1.1替换成1。2.3.4,并且记录这个映射关系,然后把数据发送给CSDN的服务器,服务器会收到这样的数据报

    源IP地址:1.2.3.4
    目的IP地址:5.6.7.8
    
    • 1
    • 2

    然后CSDN会根据请求生成响应,构造下面这样的数据报

    源IP地址:5.6.7.8
    目的IP地址:1.2.3.4
    
    • 1
    • 2

    而当这个数据发送到路由器上,路由器会根据之前的映射关系,把1.2.3.4替换成192.168.1.1,再发送回我的手机上

    这样的话,我们就可以用一个外网IP地址代替很多的设备的IP地址,也就可以解决IP地址数量不够用的问题了

    使用IPv6

    上述两个方法只是把不够用的资源通过不同的分配方式分给了主机,使得IP地址够用。然而想要根本上解决这个问题,我们可以使用IPv6这个协议。

    IPv4使用4个字节表示IP地址,因此只有42亿个
    而IPv6使用14个字节表示IP地址,这个数量就算给地球上每个沙子分配一个IP地址,也是够用的。

    而IPv6之所以没有大量普及,就是因为其和IPv4不兼容,因此需要花钱换路由器。然而在国家的强制要求下,许多企业都升级成了IPv6,这也是防止美国对我们的限制

    IP地址

    主要分为以下两个部分

    1. 网络号,用来标识网段,相互连接的两个网段有不同的标识
    2. 主机号,用来标识主机,同一网段下的主机有相同的网络号,但是有不同的主机号

    也就是说,同一个局域网下的设备的网络号是相同的,不同的主机有不同的主机号,两个相邻的局域网的网络号是不同的

    而子网掩码(32位)可以划分出来从哪一位到哪一位是网络号
    例如这32位中前面是23个一,就代表前23位是网络号,后9位是主机号,而所有连接在同一个局域网中的设备的网络号相同,因此前23位都是相同的
    而如果我的路由器连接了两个局域网,那么这两个局域网的网络号是不同的,也即是前23位是不同的

    特殊的IP地址

    1. 主机号为0,代表这个IP是网络号
    2. 主机号为1,代表这个IP是这个局域网的网关(一般就是路由器)
    3. 主机号为全1,代表这个IP是广播IP
    4. 127.XXX,代表这个IP是换回IP(例如我们的127.0.0.1)

    路由选择

    之所以我们的数据能够从发送者精确的规划出路径传送到接受者,就是因为路由选择的概念

    当我们的数据到达路由器时,会把我们的数据报中的IP地址提供给路由器,路由器中有一个叫“路由表”的数据结构,也就是这个路由器认识的通往各个IP地址的路,如果认识,就直接告诉数据报应该怎么走,如果不认识,路由器就会把这个数据报转发给别的有可能认识的路由器

    因此这个概念就相当于我们出去找地一样,问一个大爷路,这个大爷也许不知道应该怎么走,但是会告诉你一个大致的方向,你按照这个方向再去问问别人怎么走

  • 相关阅读:
    多玩家“角力”会议平板
    【Spring Boot】创建一个 Spring Boot 项目
    微信小程序&会议OA-登录获取手机号流程&登录-小程序&导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)
    golang http
    NativeBuffering,一种高性能、零内存分配的序列化解决方案[性能测试续篇]
    将设计模式门面模式运用到生活当中
    龙蜥开发者说:首次触电,原来你是这样的龙蜥社区? | 第 8 期
    vue 块级加载效果
    【JavaScript】Math对象知识全解
    php遍历某月份所有日期的实例
  • 原文地址:https://blog.csdn.net/m0_60867520/article/details/127447790