【IP专题】
网络层
协议:IP(网际协议)、ARP(地址解析协议)、ICMP(网际控制协议)、IGMP(网际组管理协议)
今天就分析IP协议,下篇分析剩下三个协议
IP地址就是给互联网上的每一台主机或路由器分配的一个在全世界范围内的唯一的32位的标识符
IP地址有两种 :IPv4 和 IPv6
IPv4
IP地址的编址方法有三个阶段:
第一阶段 分类的IP地址:所谓“分类的IP地址”就是把IP地址划分成若干的固定类,每一类地址由两个固定长度的字段组成。
- 第一个字段:网络号:标志主机所连接的网络。一个网络号在整个互联网范围内必须是唯一的。
- 第二个字段:主机号:标志着该主机,一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。
- 由此可知,一个IP地址在整个互联网范围内是唯一的。
五类IP地址:
A类 :0开头、8位网络号、可指派的网络号为2^7 - 2个(网络号全0代表本网络,01111111(127)为本地软件环回测试本主机进程之间的通信
24位主机号 最大主机数 2^24 - 2 (全0代表本主机所连接的网络) (全1表示该网络上的所有主机)
B类 :10开头、 16位网络号、16位主机号
C类 :110开头、24位网络号、8位主机号
D类 :1110 开头 用于多播
E类 :1111 开头 保留
把IP地址分为A类、B类、C类三个类别是因为各种网络的差异,有的网络主机很多,有的网络主机很少。
以上,IP地址具有一些重要特点:
1.每一个IP地址都有网络号和主机号两部分组成,从这个意义上说,IP地址是一种分等级的地址结构
2.分两个等级有两个好处:第一:IP地址管理机构在分配IP地址时址分配网络号,而剩下的主机号则由得到该网络号
得单位自行分配。这样方便了IP地址的管理;第二,路由器仅仅根据目的主机所连接的网络号来转发分组而不考虑目的主机号
这样就可以使路由表的项目数大幅度减少,从而减少了路由器所占的存储空间以及查找路由器的时间。
第二阶段 划分子网
从两级IP地址到三级IP地址。
二级IP地址的不合理之处:
- IP地址空间的利用率低
- 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏
3.两级IP地址不够灵活
三级IP地址 = { 网络号 + 子网号 + 主机号}
注:划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号
路由器是怎么把数据报传到子网的呢?使用子网掩码。
在没有划分子网的二级地址 --使用默认子网掩码
A类 : 255.0.0.0 或 0xFF000000
B类 : 255.255.0.0 或 0xFFFF0000
C类 : 255.255.255.0 或 0xFFFFFF00
第三阶段 无分类编址CIDR(构造超网)
CIDR最主要的两个特点:
1.CIDR消除了传统的A类、B类、和C类地址以及划分子网的概念
2. CIDR把网络前缀都相同的连续的IP地址组成一个"CIDR地址块"
CIDR IP = {网络前缀 + 主机号} 斜线记法 : IP地址/网络前缀位数
通过IP地址能找出最大地址 和 最小地址
IP报文格式
-
IPV4
![]()
-
IPV6
![]()
IPV6所带来的主要变化是 :
1.更大的的地址空间(128位)
2.取消了首部长度字段,因为它的首部长度是固定的(40字节)
3.取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能
4.取消了标识、标志字段和片偏移字段,因为这些功能已包含在分片扩展首部中
5.把TTL字段改称为改为跳数限制字段(只是改个名字)作用一样
6.取消了协议字段,改用下一个首部字段。
7.取消了检验和字段,加快路由器处理数据包报的速度。网络层的差错检测没有必要
取消了选项字段,而用扩展首部来实现选项功能
class Solution {
public:
vector<string> ret;
vector<string> restoreIpAddresses(string s) {
dfs(s,0,0,"");
return ret;
}
void dfs(string s , int pos, int k, string path){
if(k == 4 && pos == s.size()){
path.pop_back();
ret.push_back(path);
return ;
}
if(k == 4) return;
for(int i = pos; i < s.size(); i++){
string t = s.substr(pos, i - pos + 1);
if(stoi(t) > 255) break;
if(t[0] == '0' && t.size() > 1) break;
dfs(s,i + 1, k + 1, path + t + '.');
}
}
};
class Solution:
def validIPv4(self, IP : str) -> str:
num = IP.split('.')
for x in num:
if(len(x) == 0 or len(x) > 3):
return "Neither"
if x[0] == '0' and len(x) != 1 or not x.isdigit() or int(x) > 255:
return "Neither"
return "IPv4"
def validIPv6(self, IP : str) -> str:
num = IP.split(':')
y = '0123456789abcdefABCDEF'
for x in num :
if len(x) < 1 or len(x) > 4 or not all(c in y for c in x):
return "Neither"
return "IPv6"
def validIPAddress(self, queryIP: str) -> str:
if queryIP.count('.') == 3:
return self.validIPv4(queryIP)
elif queryIP.count(':') == 7:
return self.validIPv6(queryIP)
else:
return "Neither"
哈哈哈C++代码处理字符串真是又长又臭 -- 所以用python -- 但是还不熟
python小专题
[] 列表
- 可装入任何变量
- 访问元素可用下标 下标为-1访问最后一个元素
- append() 添加元素
- insert(索引,元素)在索引处插入元素
- del 删除元指定下标元素
- pop() 移除末尾元素并返回 || 也可根据索引移除
- remove 根据值删除
- sort 永久排序 sorted 临时排序
- reverse() 反转列表
- len 列表长度
res = []
res.append(1)
res.append(4)
res.append(5)
res.append(3)
print(res)
print(res[-1])
print(sorted(res))
res.reverse()
# res.sort()
print(res)



浙公网安备 33010602011771号