IP协议是网络层中最重要的协议, 它主要完成两方面的工作:
- 地址管理
- 路由选择
文章图片
- 4位版本:IP协议的版本号, 现在使用的IP协议只有两种, 因此版本号也只有两种取值, 分别为4和6
- 4位首部长度:代表报头长度(与TCP协议相同, 报头长度可变)
- 8位TOS:8位TOS中仅有四位有效, 分别为最小延时, 最大吞吐量, 最高可靠性, 最小成本, 这四位同一时刻只能实现一种状态(将一个设为1, 其他只能为0), IP协议能够规划两点间最合适的路径, 所谓"合适"就是在这四位TOS中选择一项, 并优先考虑这一项
- 16位总长度:单个IP数据报最大长度为64k, 如果要表示一个更长的数据报, IP协议内部实现了分包和组包这样的操作, 具体的实现方式就是下面的这几个字段
- 16位标识, 3位标志, 13位片偏移:用于实现分包和组包的字段
文章图片
??分包操作就是将一个较长的数据包分成多个较短的数据包, 这里的分包只是单纯的对数据进行拆分, 并不关注数据内容, 也不关注某个包内部是否有TCP报头.
那么, 对一个数据包进行拆分后, 接收方如何能区分哪些小的数据包能拼接成一个完整的IP数据包呢?
??我们注意到, 每个拆分后的数据包都有一个IP报头, 上面有一个字段叫做16位标识, 同一个数据包分包后产生的小的数据包的16位标识是相同的, 这样, 接收方就能通过相同的16位标识来找到这些数据包并进行组包, 并且通过13位片偏移量来描述这些被拆分的包的顺序, 片偏移量越小, 包的位置越前. 3位标志位中仅有一位有效, 这一位为0, 表示这个包后面还有别的包, 为1表示这个包是最后一个包.
- 8位生存时间: 表示一个IP数据包在网络传输中还能存在多久, 单位为转发次数. IP数据包被发送时, 会有一个初始的TTL(常见的初始值为128或64), IP数据包每经过一个路由器, TTL会减一, 如果TTL减到0, 收到这个包的路由器就会丢弃这个数据包.
??有些IP数据包中的IP地址可能有误, 可能永远无法到达这个IP地址, 这样的包不能在网络传输中无休止地转发, 无休止地转发会占用大量的硬件资源, 因此, 如果数据包的TTL减到0, 代表这个数据包的转发次数过多, IP地址可能有误, 就会丢弃这个数据包.
注意: 正常情况下TTL不会减到0, IP数据包会在TTL减到0之间到达目的地.
- 8位协议: 表示上层(也就是传输层)使用的协议类型, 协议不同, 这里的取值也不同.
- 16位首部校验和: 校验数据是否正确.
注意: 校验和的结果并不是准确无误的, 校验和正确不代表数据一定正确, 校验和不正确, 数据一定是不正确的.
- 32位源IP, 32位目的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地址:
- 如果IP地址全为0, 表明这个IP为网络号(局域网中的正常设备, 主机号无法设置为0)
- 如果IP地址全为1(255.255.255.255), 表明这个IP为广播地址, 向这个广播地址中发送数据, 整个局域网中的设备都能收到
- 如果IP地址为127开头(如127.0.0.1), 这个IP是一个"环回IP", 表示主机自己, 127.0.0.1就是环回IP的典型代表
- IP地址是10开头(如101.0.0.1), 192.168开头, 172.16~172.31开头, 表示这个IP地址是一个局域网内部的IP(内网IP), 除此之外的IP均为外网IP.
我们规定外网IP一定是唯一的, 每个外网IP都对应到一台设备, 而内网IP只在当前局域网中是唯一的, 对于不同的局域网, 可以有相同的内网IP.
- 动态分配IP地址: 让每台设备只有在连接到网络时才有IP地址, 不联网时这个IP可能被别的设备使用. 这个方法并没有减少设备数量, 也没有增加IP地址, 如果同时连接网络的设备超过了43亿, 这种方法就会失效.
- NAT机制: 多个设备共用同一个外网IP, 将网络分为内网(局域网)和广域网(外网), 要求外网IP必须表示唯一的设备, 内网IP仅在一个局域网内具有唯一性, 同一内网中的若干设备, 可以共用一个外网IP.
??举个例子, 我们将一个学校看做一个局域网, 学校的名字就是一个外网IP, 每个学校在全世界是独一无二的, 而在学校的内部, 例如A栋教学楼203教室, 这就是一个内网IP, 这个IP地址在一个学校内部是唯一的, 但其他学校里也会有A栋教学楼203教室.
??同一内网中的设备可以共用同一个外网IP, 就好比某个学校的学生取快递时, 收货地址都是这个学校, 快递小哥只需要将这些快递放在学校的快递收发室即可, 不需要针对到每个人.
注意:对于一个外网IP, 可以在互联网中的任意位置访问到, 对于一个内网IP, 只能通过局域网内部访问, 也就是两台设备之间不能跨局域网直接进行通信.
- IPv6
推荐阅读
- spring|使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战
- Andriod|Andriod Studio实现保存QQ密码
- 如何解决Spring Boot内存泄漏问题
- 是什么使Java应用程序的CPU使用率飙升()
- 你真的知道Java中的4种引用类型吗()
- 如何在Java中实现线程间通信
- Java高效线程操作(精通线程通信)
- Java教程目录全集归档
- 烧脑算法|手撕六大经典排序算法(Java代码实现)