Radius 协议中的ipv6 处理算法思路

本文介绍了一种使用C#处理IPv6地址的方法,包括标准、压缩和混合形式的IPv6地址转换为数组。同时讨论了IPv6地址的不同表示形式及其特点。

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

如果我们想要模拟一个协议或者多个协议进行相关的操作,那么首先我们要了解这个协议中的数据发送传输,如何定义包的类型和格式。通常情况下,很少有人用C#来做这些东西。因为如此底层的东西,C#做不了,我也不打算用C#做底层协议UDP或者Radius中的通信,但是如果你用来测试某个协议,从底层到上层两个终端之间的通信的话,我想C#还是可以做的。

引入:如果做协议包的收发测试,对于一般包的定义格式,通常情况下,会用byte[]数组对一个ip地址进行存储和发送。有的时候,例如一个ipv4地址,的话,简单的函数调用Split('.") 192.168.1.1就可以按着'.'进行了分割。那么对于radius协议中,如果使用ipv6进行通信地址格式的话,我们应该如何处理地址到一些字符数组中呢。下面看一下 RFC中的地址格式定义:

 

A summary of the NAS-IPv6-Address Attribute format is shown below.
   The fields are transmitted from left to right.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     |             Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               Address             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

我们姑且不管如何到byte[]数组,毕竟他的存储范围是有限的,暂且在这篇文章中使用string数组进行存储。分割好的IPv6地址。说到IPV6的地址格式,对于不是很清楚的童鞋们,我简单的进行阐述。

算法输出结果预估,先写出来大家对算法目的看的更清楚

Input : n:n:n:n:n:n:n:n。

OutPut:new string[8] {"n",....."n"} 直接输出

Input:3FFE:FFFF::8:800:20C4:0              ::1

OutPut:{"3FFE","FFFF","0","0",...."20C4","0"} 补零输出  {"0","0",......"1"}

Input:n:n:n:n:n:n:d.d.d.d

OutPut: {"n","n"....."d.d->16位16进制","d.d->16位16进制"}

Input: n:n::d.d.d.d

Output: {"n","n","0","0",...."d.d->16位16进制"}

算法部分:对于此种的ipv6地址,就算是当他最标准的吧,从头到尾都是:分割,那么,直接使用split函数以:分割即可,得到一个长度为8的数组。

对于有(::)在地址里面的,我们首先使用::将IP地址分成前后两个部分,之后计算前后两部分的长度,填充中间的省略的0的个数,返回冒号十六进制的形式IPV6标准数组。

对于混合式的IPv6地址比较复杂,因为如果单纯的是前96位:表示的IPv6地址加上后面的32位IPv4地址,也好处理,将后面的部分以'.'分割之后,变换成连个16位的ipv6即可。但是考虑到前面会有省略的一部分0的,也就是存在::形式的IPv6地址,那么就要参考压缩式的处理方式先对::进行分割后,在对存在'.'的ipv4混合地址进行处理。

附上代码,没来得及优化,测试几个还行。比较乱,有几个罗嗦的地方还需要改进。

ContractedBlock.gif ExpandedBlockStart.gif Code
public static string[] IPAddressToArray(string address)
        {
            
string[] result = new string[8];
            
//address = string.Empty;
            string[] ip = null;
            
string[] iptemp = null;
            
string[] iptempv4 = null;
            
string[] ipresult = new string[8];
            
//address = "5::2:10:20";
            string[] a = { "::" };
            
if (address.Contains(':')) // ipv6 must contain ':'
            {
                
if (address.Contains("::")) // for the ipv6 omit some zero (0) in the address
                {
                    ip 
= address.Split(a, StringSplitOptions.None);
                    iptemp 
= ip[0].Split(':');
                    iptempv4 
= ip[1].Split(':');
                    
int iptempLength = 0;
                    
if (iptemp[0!= string.Empty)
                    {
                        iptempLength 
= iptemp.Length;
                    }
                    
int iptempv4Length = iptempv4.Length;
                    
int j = 0;
                    
int n = 0;
                    
int k = 8 - iptempLength - iptempv4Length;
                    
bool containsPoint = false;
                    
foreach (string ipa in iptempv4)
                    {
                        
if (ipa.Contains('.'))
                        {
                            containsPoint 
= true;
                        }
                    }
                    
if (!containsPoint) // ipv6 type not contain extended ipv4 (e.g. fec0:0:0:1::1234)
                    {
                        
for (int i = 0; i < 8; i++)
                        {
                            
while (iptempLength != 0 && j < iptempLength)
                            {
                                ipresult[i] 
= iptemp[j];
                                i
++;
                                j
++;
                            }
                            
while (k != 0)
                            {
                                ipresult[i] 
= "0";
                                i
++;
                                k
--;
                            }
                            
int m = 0;
                            
while ((8 - i) != 0)
                            {
                                ipresult[i] 
= iptempv4[m];
                                i
++;
                                m
++;
                            }
                        }
                    }
                    
else // incluede extended ipv4 in the address (e.g. 0:0:0:0:0:0:10.1.2.3 ===== ::10.1.2.3)
                    {
                        
int i =0;
                        
while(i<8)
                        {
                            
while (iptempLength != 0 && j < iptempLength)
                            {
                                ipresult[i] 
= iptemp[j];
                                i
++;
                                j
++;
                            }
                            
while (k - 1 != 0)
                            {
                                ipresult[i] 
= "0";
                                i
++;
                                k
--;
                            }
                            
while (iptempv4Length != 0 && !iptempv4[n].Contains ('.'))
                            {
                                iptempv4Length
--;
                                ipresult[i] 
= iptempv4[n];
                                n
++;
                            }
                            ipresult[i] 
= MergeIpv4ToV6Type(iptempv4[iptempv4.Length - 1])[0];
                            ipresult[
++i] = MergeIpv4ToV6Type(iptempv4[iptemp.Length - 1])[1];
                            i
++;
                        }
                        result 
= ipresult;
                    }
                }
                
else
                {
                    
//no contains ipv6 means it do not ignore some zero in address (x:x:x:x:x:x:x:x or x:x:x:x:x:x:1.2.3.4)
                    iptemp = address.Split(':');
                    
int iptempLength = iptemp.Length;
                    
int m = 0;
                    
for (int i = 0; i < iptemp.Length; i++)
                    {
                        
while (iptempLength != 0 && !iptemp[i].Contains('.'))
                        {
                            ipresult[m] 
= iptemp[i];
                            m
++;
                            i
++;
                            iptempLength
--;
                        }
                        
if (iptemp[i].Contains('.'&& iptempLength !=0)
                        {
                            ipresult[
6= MergeIpv4ToV6Type(iptemp[iptemp.Length - 1])[0];
                            ipresult[
7= MergeIpv4ToV6Type(iptemp[iptemp.Length - 1])[1];
                        }
                    }
                    result 
= ipresult;
                }

            }
            
else // ipv4 split it directly
            {
                result 
= address.Split('.');
            }

            
return result;
        }
        
public static string[] MergeIpv4ToV6Type(string ipv4)
        {
            
string[] ipresult = new string[2];
            
string[] ipv4Array = ipv4.Split('.');
            ipresult[
0= Convert.ToString((Convert.ToInt32(ipv4Array[0]) + Convert.ToInt32(ipv4Array[1])), 16);
            ipresult[
1= Convert.ToString((Convert.ToInt32(ipv4Array[2] )+ Convert.ToInt32(ipv4Array[3])), 16);
            
return ipresult;
        }

 

写的不好大家多拍砖。算法也可能有没覆盖的地方,多多包含。我也不多废话,直接引入百科内容,附上IPV6部分内容。

==============

在 Internet 协议版本 6 (IPv6) 中,地址的长度是 128 位。地址空间如此大的一个原因是将可用地址细分为反映 Internet 的拓扑的路由域的层次结构。另一个原因是映射将设备连接到网络的网络适配器(或接口)的地址。IPv6 提供了内在的功能,可以在其最低层(在网络接口层)解析地址,并且还具有自动配置功能。

  文本表示形式

  以下是用来将 IPv6 地址表示为文本字符串的三种常规形式:

  (一)冒号十六进制形式。

  这是首选形式 n:n:n:n:n:n:n:n。每个 n 都表示八个 16 位地址元素之一的十六进制值。例如:

  3FFE:FFFF:7654:FEDA:1245:BA98:3210:4562.

  (二)压缩形式。

  由于地址长度要求,地址包含由零组成的长字符串的情况十分常见。为了简化对这些地址的写入,可以使用压缩形式,在这一压缩形式中,多个 0 块的单个连续序列由双冒号符号 (::) 表示。此符号只能在地址中出现一次。例如,多路广播地址 FFED:0:0:0:0:BA98:3210:4562 的压缩形式为 FFED::BA98:3210:4562。单播地址 3FFE:FFFF:0:0:8:800:20C4:0 的压缩形式为 3FFE:FFFF::8:800:20C4:0。环回地址 0:0:0:0:0:0:0:1 的压缩形式为 ::1。未指定的地址 0:0:0:0:0:0:0:0 的压缩形式为 ::。

  (三)混合形式。

  此形式组合 IPv4 和 IPv6 地址。在此情况下,地址格式为 n:n:n:n:n:n:d.d.d.d,其中每个 n 都表示六个 IPv6 高序位 16 位地址元素之一的十六进制值,每个 d 都表示 IPv4 地址的十进制值。

=====================

转载于:https://www.cnblogs.com/AlexLiu/archive/2009/10/15/1584149.html

69. 路由优选的原则(如何成为Active路由并被使用) ```Answer ``` 70. 路由表的生成与匹配(一个数据包如何决定使用该条路由做转发依据) ```Answer ``` 71. 什么是明细路由和缺省路由(默认路由) ```Answer ``` 72. 什么是直连路由 ```Answer ``` 73. 直连路由数据如何转发 ```Answer ``` 74. 非直连路由数据如何转发 ```Answer ``` 75. 多跳转发时数据的封装与解封装过程 ```Answer ``` 76. 什么是等价路由 ```Answer ``` 77. 什么是路由递归(路由迭代) ```Answer ``` 78. 什么是CIDR ```Answer ``` 79. 什么是路由聚合 ```Answer ``` 80. 路由聚合需要注意什么问题 ```Answer ``` 81. 什么是静态路由 ```Answer ``` 82. 什么是浮动静态路由 ```Answer ``` 83. 为什么需要动态路由协议 ```Answer ``` 84. 动态路由协议的大致分类有哪些 ```Answer ``` 85. 简介OSPF协议 ```Answer ``` 86. 什么是Router-ID及其选举规则 ```Answer ``` 87. 什么是Area-ID及其定义 ```Answer ``` 88. 什么是邻居关系 ```Answer ``` 89. 什么是邻接关系 ```Answer ``` 90. 什么是LSA ```Answer ``` 91. 什么是LSDB,如何构成LSDB ```Answer ``` 92. OSPF如何从LSDB条目构成OSPF路由表 ```Answer ``` 93. OSPF如何计算Cost开销 ```Answer ``` 94. OSPF支持哪些网络类型 ```Answer ``` 95. OSPF Hello报文的介绍与作用 ```Answer ``` 96. OSPF DD 报文的介绍与作用 ```Answer ``` 97. OSPF LSR 报文的介绍与作用 ```Answer ``` 98. OSPF LSU 报文的介绍与作用 ```Answer ``` 99. OSPF LSAck 报文的介绍与作用 ```Answer ``` 100. 介绍OSPF邻居状态Init ```Answer ``` 101. 介绍OSPF邻居状态2-Way ```Answer ``` 102. 介绍OSPF邻居状态ExStart ```Answer ``` 103. 介绍OSPF邻居状态Exchange ```Answer ``` 104. 介绍OSPF邻居状态Loading ```Answer ``` 105. 介绍OSPF邻接状态Full ```Answer ``` 106. 什么是DR / BDR及其作用 ```Answer ``` 107. 什么是BR / IR ```Answer ``` 108. 什么是ABR / ASBR ```Answer ``` 109. 什么是虚拟局域网VLAN ```Answer ``` 110. VLAN标签格式的构成 ```Answer ``` 111. 带有标签的数据帧是什么形态 ```Answer ``` 112. Access接口及其特性 ```Answer ``` 113. 什么是PVID ```Answer ``` 114. Trunk接口及其特性 ```Answer ``` 115. 什么是Allow-pass List ```Answer ``` 116. Hybrid接口及其特性 ```Answer ``` 117. 什么是Tagged / Untagged List ```Answer ``` 118. 什么是注册VLAN和放行VLAN ```Answer ``` 119. VLAN间通信解决方案 ```Answer ``` 120. 什么是三层子接口及其通信特性 ```Answer ``` 121. 什么是三层VLAN接口 ```Answer ``` 122. 二层环路的必要性 ```Answer ``` 123. 二层环路的风险和危害 ```Answer ``` 124. 二层环路和三层环路的危害比较 ```Answer ``` 125. 什么是生成树协议 ```Answer ``` 126. 介绍生成树协议中桥、根桥、非根桥、指定桥的定义 ```Answer ``` 127. 什么是桥ID ```Answer ``` 128. 什么是路径开销与根路径开销 ```Answer ``` 129. 什么是接口ID ```Answer ``` 130. 什么是根端口、指定端口、阻塞端口 ```Answer ``` 131. 端口状态有哪些分别做哪些操作 ```Answer ``` 132. STP的BPDU有哪些 ```Answer ``` 133. 什么是配置BPDU,以及有哪些子类,有什么作用 ```Answer ``` 134. 什么是TCN-BPDU ```Answer ``` 135. 如何选举根桥 ```Answer ``` 136. 如何定义端口角色 ```Answer ``` 137. 端口状态的设置和迁移 ```Answer ``` 138. 非直连链路 / 根桥故障时的收敛 ```Answer ``` 139. 直连链路故障时的收敛 ```Answer ``` 140. 异常收敛后的MAC地址表刷新机制 ```Answer ``` 141. 生成树协议的缺点 ```Answer ``` 142. 快速生成树协议的优势 ```Answer ``` 143. 快速生成树协议的不足 ```Answer ``` 144. 什么是多实例生成树和VBST ```Answer ``` 145. 什么是高可靠性技术 ```Answer ``` 146. 什么是链路聚合,可以实现哪些功能 ```Answer ``` 147. 介绍链路聚合的基本概念 ```Answer 聚合组: 成员接口: 成员链路: 活动接口 / 活动链路: 非活动接口 / 非活动链路: 聚合模式: 阈值 ``` 148. 什么是手动聚合及其实现方法 ```Answer ``` 149. 手动聚合的技术优劣势 ```Answer ``` 150. 什么是自动聚合及其实现方法 ```Answer ``` 151. 自动聚合的技术优劣势 ```Answer ``` 152. 什么是LACP ```Answer ``` 153. LACP协议细节概念 ```Answer LACP PDU: 系统优先级: 主动端与被动端: 接口优先级: 活动接口数量: 活动链路选举: 负载分担模式: 负载分担业务算法: ``` 154. 什么是堆叠 ```Answer ``` 155. 什么是集群 ```Answer ``` 156. 堆叠、集群的业务优势 ```Answer ``` 157. 什么是访问控制列表 ```Answer ``` 158. 什么是通配符掩码 ```Answer ``` 159. ACL的编号定义 ```Answer ``` 160. ACL的语法规则、动作和匹配项目 ```Answer ``` 161. ACL匹配的规则和机制 ```Answer 匹配顺序: 匹配结果: 匹配位置(方向): ``` 162. 什么是网络地址转换NAT ```Answer ``` 163. 什么是静态(对称)NAT ```Answer ``` 164. 什么是动态NAT(基于地址池) ```Answer ``` 165. 什么是NAPT ```Answer ``` 166. 什么是Easy-IP ```Answer ``` 167. NAT Session表项包含哪些条目信息 ```Answer ``` 168. 什么是NAT Server ```Answer ``` 169. 什么是AAA ```Answer ``` 170. 实现AAA需要哪些必要的设备和角色 ```Answer ``` 171. RADIUS协议的工作流程 ```Answer ``` 172. 简介FTP协议 ```Answer ``` 173. 简介FTP的主动模式和被动模式 ```Answer ``` 174. FTP实验配置时的注意事项 ```Answer ``` 175. 简介Telnet协议 ```Answer ``` 176. Telnet实验配置时的注意事项 ```Answer ``` 177. 简介DHCP协议及其协议优势 ```Answer ``` 178. DHCP地址分配协议报文交互过程 ```Answer ``` 179. DHCP地址续约(正常与异常)协议报文交互过程 ```Answer ``` 180. DHCP实验配置时的注意事项(接口与全局地址池) ```Answer ``` 181. 简介DNS协议及其查询过程 ```Answer ``` 182. PPP协议较以太网协议的比较 ```Answer ``` 183. PPP链路的建立流程 ```Answer ``` 184. LCP协商过程 ```Answer ``` 185. 认证协商过程-PAP ```Answer ``` 186. 认证协商过程-CHAP ```Answer ``` 187. NCP地址协商过程 ```Answer ``` 188. 什么是PPPoE以及应用场景 ```Answer ``` 189. PPPoE会话三阶段 ```Answer ``` 190. 什么是无线局域网 ```Answer ``` 191. 无线局域网的标准、技术关切与有线网的不同之处 ```Answer ``` 192. 常见无线网设备及其介绍 ```Answer AP: Fit AP: Fat AP: AC: PoE交换机: Sta: ``` 193. 什么是CAPWAP ```Answer ``` 194. 什么是二层组网、三层组网 ```Answer ``` 195. 什么是直连式组网,什么是旁挂式组网 ```Answer ``` 196. 什么是射频、信道、无线系统 ```Answer ``` 197. 什么是BSS、BSSID、SSID、VAP、ESS ```Answer ``` 198. 无线业务数据的转发模式及其优劣势 ```Answer ``` 199. IPv6的业务优势 ```Answer ``` 200. IPv6报文格式及相对IPv4的改进 ```Answer ``` 201. 什么是扩展报文头 ```Answer ``` 202. IPv6地址定义 ```Answer 地址定义: 缩写规范: 全球单播: 唯一本地: 链路本地: 组播: 被请求节点组播: 任播: ``` 203. EUI-64地址规范 ```Answer ``` 204. 什么是NDP协议,有哪些功能 ```Answer NS: NA: RS: RA: DAD: ``` 205. 什么是有状态地址配置 ```Answer ``` 206. 什么是无状态地址配置 ```Answer ```
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值