ipv4、ipv6格式校验代码

本文介绍了IPv4和IPv6地址的格式要求,并提供了格式校验的题目和解答。对于IPv4,强调了每组数字的范围和不能以0开头的规定;对于IPv6,讲解了16进制数字的组别限制和0的使用规则。内容包括如何判断字符串是否符合ipv4或ipv6格式,并给出了校验逻辑和代码实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ipv4、ipv6格式校验代码

一、题目

IPv4 地址格式:
IPv4地址由4组十进制数组成,每组范围为 0 - 255,用“.”分割。
注意:IPv4 地址内的数不能以 0 开头。
例:127.23.01.16 不合法,01以0开头

IPv6 地址格式:
IPv6由8组16进制的数字组成,每组由数字和字符组成,表示16位数。用 “:”分割。
注意:
不区分大小写;
数字可以以0 开头,但多余的 0 不被允许;
例:1027:00000:1901:234d:a908:2313:4432:0232不合法,出现00000超出4位。
不能因为某个组的值为 0,而使用一个空的组,以至于出现 ( :: ) 的情况;
例:1027::1901:234d:a908:2313:4432:232不合法,出现::。

输入格式:
键盘输入一个字符串

输出格式:
若字符串符合ipv4格式,则输出"ipv4";
若字符串符合ipv6格式,则输出"ipv6";
都不满足,则输出"Neither";

二、解答

规则分析:
ipv4校验逻辑:

  • ipv4分割后数组大小==4 ;
  • 每位数字长度[1,3];
  • 不能以多余的0开头;
  • 每位判断是否是数字;

ipv6校验逻辑:

  • ipv6分割后数组大小==8 ;
  • 每位长度[0,4];
  • 每位是否为数字、或小写字符a-f、或大写字符A-F

代码实现
【方式一】上述思路实现:

public class _ipv4_ipv6 {
   
    public static void main(String[] args) {
   
        Scanner sc = new Scanner(System.in);
        String IP = sc.nextLine();
        
        System.out.println(new _ipv4_ipv6().judgeIp(IP));
    }

    public String judgeIp(String IP) {
   
        if (IP.contains(".")) {
   
            String[] ipv4 = IP.split(
### IPv4IPv6报文结构及字段详解 #### 1. IPv4 报文结构 IPv4 数据报由固定部分和可变选项部分组成。其基本格式如下: | 字段名称 | 长度 (位) | 描述 | |------------------|-----------|----------------------------------------------------------------------| | 版本 | 4 | 表明协议版本号,对于 IPv4 始终为 4[^2]。 | | 头部长度 (IHL) | 4 | 指定头部的长度,单位为 32 位字,最小值为 5(即 20 字节)。 | | 差分服务字段 | 8 | 曾称为 TOS,用于 QoS 控制。 | | 总长度 | 16 | 整个数据报的总长度,包括头部和数据部分,单位为字节。 | | 标识符 | 16 | 用于唯一标识主机发送的数据报。 | | 标志 | 3 | 控制分片行为,通常用来防止进一步分片。 | | 分片偏移量 | 13 | 如果发生分片,则表示该片段相对于原始数据报的位置。 | | 生存时间 (TTL) | 8 | 定义数据报在网络中的最大跳数,每经过一个路由器减 1,直到变为 0 则丢弃。 | | 协议 | 8 | 指定上层协议类型,如 TCP 或 UDP。 | | 首部校验和 | 16 | 对整个首部进行错误检测。 | | 源地址 | 32 | 发送方的 IP 地址。 | | 目标地址 | 32 | 接收方的 IP 地址。 | IPv4 的主要特点是头部较复杂,包含许多固定的字段以及可选字段。 --- #### 2. IPv6 报文结构 IPv6 设计的目标之一是简化头部结构并提升性能。以下是 IPv6 报文的基本格式: | 字段名称 | 长度 (位) | 描述 | |------------------|-----------|----------------------------------------------------------------------| | 版本 | 4 | 表明协议版本号,对于 IPv6 始终为 6。 | | 流类别 | 8 | 类似于 IPv4 中的差分服务字段,用于流量分类。 | | 流标签 | 20 | 可用于标记特定流,便于中间节点优化处理。 | | 载荷长度 | 16 | 不包括基础头部在内的有效载荷长度,单位为字节。 | | 下一头部 | 8 | 指向下一个头部类型,类似于 IPv4 的协议字段。 | | 跳数限制 | 8 | 功能类似于 TTL,控制数据报的最大跳数。 | | 源地址 | 128 | 发送方的 IPv6 地址。 | | 目标地址 | 128 | 接收方的 IPv6 地址。 | 相比 IPv4IPv6 删除了一些冗余字段并将某些功能转移到扩展头部中,从而减少了固定头部的大小到仅 40 字节[^4]。 --- #### 3. 扩展头部 IPv6 支持多种类型的扩展头部,这些头部按顺序附加在基础头部之后。常见的扩展头部包括但不限于以下几种: - **逐跳选项头部**: 影响路径上的每一个节点的行为。 - **路由头部**: 提供显式的源路由机制。 - **分段头部**: 实现分片操作。 - **认证头部 (AH)** 和 **封装安全净荷 (ESP)**: 提供安全性支持。 通过这种模块化设计,IPv6 能够灵活适应不同的应用场景需求。 --- #### 4. IPv4IPv6 报文对比总结 | 属性 | IPv4 | IPv6 | |-------------------|------------------------------------|------------------------------------| | 固定头部长度 | 20 字节 | 40 字节 | | 地址空间大小 | 32 位 (约 43 亿个地址)[^3] | 128 位 (几乎无限多)[^3] | | 首部校验和 | 存在 | 移除 | | 自动配置能力 | 较弱 | 强大 | | 安全特性 | 需要额外协议实现 | 内置 IPSec | | 扩展性 | 使用选项字段 | 使用扩展头部 | 上述差异使得 IPv6 更加适合现代互联网的需求,在地址耗尽、移动性和安全性等方面具有显著优势[^3]。 ```python # 示例 Python 程序展示如何解析简单的 IPv4/IPv6 数据包头 import struct def parse_ipv4_header(packet): version_ihl, tos, total_length, identification, flags_offset, ttl, protocol, checksum, src_ip, dst_ip = \ struct.unpack('!BBHHHBBHII', packet[:20]) ihl = version_ihl & 0xF header_len = ihl * 4 return { 'version': version_ihl >> 4, 'header_length': header_len, 'tos': tos, 'total_length': total_length, 'identification': identification, 'flags_offset': flags_offset, 'ttl': ttl, 'protocol': protocol, 'checksum': checksum, 'src_ip': socket.inet_ntoa(struct.pack('!I', src_ip)), 'dst_ip': socket.inet_ntoa(struct.pack('!I', dst_ip)) } def parse_ipv6_header(packet): ver_tc_flow, payload_length, next_header, hop_limit, src_addr, dst_addr = \ struct.unpack('!IHBB16s16s', packet[:40]) return { 'version': ver_tc_flow >> 28, 'traffic_class': (ver_tc_flow >> 20) & 0xFF, 'flow_label': ver_tc_flow & 0xFFFFF, 'payload_length': payload_length, 'next_header': next_header, 'hop_limit': hop_limit, 'src_address': socket.inet_ntop(socket.AF_INET6, src_addr), 'dst_address': socket.inet_ntop(socket.AF_INET6, dst_addr) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值