第二次寒假作业总结一

第二次寒假作业总结一

学习内容如下

  • 1.基本概念的认识
  • 2.基本思路的确定,以及文件输入输出的处理
  • 3.ip地址的点分十进制和十进制的转化规则
  • 4.传输协议对ip地址宽度的影响
  • 5.协议号规则

首先是对基本概念的认识

  • 1.五元组:

源IP地址,源端口,目的IP地址,目的端口,和传输层协议这五个量组成的一个集合。例如127.1.1.0/31就是一个五元组

  • 2.规则集:

规则集是匹配规则的集合,以五元组的形式给出范围

如178.139.217.251/32 126.0.44.183/32 0 : 65535 1526 : 1526 0x06/0xFF 0x1000/0x1000,其中178.139.217.251/32表示原IP地址,126.0.44.183/32表示目的IP地址,/32的意思是IP地址是32位的,0 : 65535规定源端口范围,表示从0到65535端口都可匹配,目的端口1526 : 1526同理,0x06/0xFF表示协议号,若0x06后是0xFF则表示只有0x06可匹配,若0x06/0x00则表示任意协议都可匹配,0x1000/0x1000表示规则优先级。(怎么说呢,最后的一条优先级规则问题在程序过程中没有用到,因为作业要求的是最早符合的就是最佳规则,于是在此就可以节省一些时间)

  • 3.数据集:

数据集是数据包的集合,同样以五元组的形式给出数据包的精确五元组信息

如2995509645 269990131 0 0 255,其中 2995509645 269990131分别是源IP和目的IP,与规则集的IP地址表示不同,规则集是点分十进制表示,而数据包IP是十进制表示,0 0是源、目的端口,255是协议号。

  • 4.规则匹配:

对于一个数据包P,当它每个字段的内容(源/目的IP,端口号,协议号)都在规则集中的某条规则的范围内时则匹配,一个数据包可能匹配多个规则,其中优先级最高的规则称作数据包的最佳匹配。

基本思路确定以及文件输入输出处理

基本思路:规则集文件输入数据--->数据处理--->储存数据--->
数据集文件输入数据--->数据对比--->输出结果

总体来说,比较陌生的是文件的输入输出问题,在此我使用的文件输入流是cin流,输出是cout流,这种流最大的弊端就是无法控制输入数据的格式会导致数据处理有很大的困难(大概就是能少写个200行代码)

比较特殊的是我直接用一个文件进行完成任务,总体的时间复杂度就是在判断时候的O(n平方),但是我使用的空间复杂度比较大(开了很多个10001的数组,不过感觉影响不大,(确信))

接下来是文件的输入输出问题

ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream 该数据类型表示输入文件流,用于从文件读取信息。

fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

输入数据直接使用ifstream创造一个函数名,然后用这个名替换cin进行一个输入,同理ofstream也是如此。

事例(举个输入例子,输出把if改成of即可):

ifstream file("text.txt");
	while ( ! file.eof() ) {
		file >> s >> num1[len] >> s >> num2[len] >> s >> num3[len] >> s >> num4[len] >> s >> num5[len];
		file >> num11[len] >> s >> num21[len] >> s >> num31[len] >> s >> num41[len] >> s >> num51[len];
		file >> duan1[len] >> s >> duan2[len] >> duan3[len] >> s >> duan4[len];
		file >> s1 >> s >> ds1[len] >> ds2[len] >> l >> s1 >> k >> ds3[len] >> ds4[len];

ip地址的点分十进制和十进制的转化规则

一句话A.B.C.D=A * 2^24 + B * 2^16 + C * 2^8 + 2^0 * D

但是这是在没有考虑传输协议的问题下,于是在此基础之上就需要做出改变

传输协议对ip地址宽度的影响

首先感谢ll学长(此处是两位学长,但是大概都是不愿意透露姓名)的帮助啊,每天都在晚上11点之后打扰了,不过学长也帮助我解决了不少问题
,第一个就是传输协议的问题

首先是他的计算方式问题

1:IP地址 = 网络地址 + 主机地址,二进制为:

11000000 10101000 00001001 00000011

2:子网掩码的二进制表示为:

11111111 11111111 11111110 00000000

解析:前面1的就是网络地址部分,后面0就是主机地址,所以此处有9位主机地址。

3:网络地址 = 子网掩码 & IP地址,即:192.168.8.0

4:广播地址 = 3中求出的网络地址的主机地址部分置1,即:192.168.9.255

5:有效的IP段计算:

开始地址 = 网络地址+1,即192.168.8.1

结束地址 = 广播地址-1,即192.168.9.254

那么当前示例的有效IP段为:192.168.8.1~192.168.9.254

算法有两种:第一就是用网络地址和广播地址来进行一个计算,但是存在两个弊端,1.计算麻烦 2./32,/31需要分类

第二是计算较小的地址(注:/31的情况无法判断网络地址和广播地址的大小,所以与/32一样不符合普遍规则),然后计算有多少的网址,就可判断网宽

总体来说第二种比较简单,注意点注意一下就行

最后我是使用的第一种,因为我太怕出bug了,而且第一种比较直观,代码量虽然比较多,但是改起来也快。

而且除了/32,/31的情况之外,/27之类的范围是网络地址和广播地址之间的闭区间,而不是开区间。这点就是问过学长的情况下知道的

最后的协议号规则

0x06后是0xFF则表示只有0x06可匹配,若0x06/0x00则表示任意协议都可匹配,这一点也是在询问学长之后才知道的,最后一条优先级的问题由于和原来的只要匹配就是最高的优先级矛盾(大概),所以如果考虑了最后的一条规则就会比较麻烦...幸好不用

最后最后再次感谢学长的解答

posted @ 2022-01-25 23:43  帝芬尼  阅读(31)  评论(0编辑  收藏  举报