IP地址及编址方式
IP地址基础概念
IP地址的本质
- 定义:用于唯一标识互联网上设备的逻辑地址
- 结构:采用两级结构(网络号 + 主机号)
- 唯一性:在整个互联网范围内是唯一的
- 表示方法:点分十进制记法(如:192.168.1.1)
IP地址的表示
二进制: 11000000 10101000 00000001 00000001 十六进制: 0xC0 0xA8 0x01 0x01 十进制: 192.168.1.1分类IP地址
IP地址分类结构
- 任意一个IP地址都可以迅速的得出类别,并计算得出网络号
- 当一个主机通过两个网卡同时连接到两网络时,也就是该主机同时拥有两个IP地址,该主机被称为多归属主机
- 一个路由器至少连接到两个不同的网络,一个路由器至少拥有两个IP地址
各类地址的指派范围
| 类别 | 网络号范围 | 可指派网络数 | 每个网络主机数 |
|---|---|---|---|
| A类 | 1-126 | 126 | 2²⁴-2 = 16,777,214 |
| B类 | 128.0-191.255 | 16,384 | 2¹⁶-2 = 65,534 |
| C类 | 192.0.0-223.255.255 | 2,097,152 | 2⁸-2 = 254 |
特殊地址
| 地址类型 | 示例 | 用途 |
|---|---|---|
| 本机地址 | 0.0.0.0 | 绑定到所有接口 |
| 环回地址 | 127.0.0.1 | 本地环回测试 |
| 广播地址 | 255.255.255.255 | 受限广播 |
| 网络地址 | 192.168.1.0 | 代表整个网络 |
| 全1主机号 | 192.168.1.255 | 定向广播 |
注意:全0和全1主机号不能分配给主机
分类的 IP 地址的优缺点
优点
管理简单;使用方便;转发分组迅速;划分子网,灵活地使用
缺点
设计上不合理:大地址块,浪费地址资源;即使采用划分子网的方法,也无法解决 IP 地址枯竭的问题
CIDR(无分类编址)-- 现代标准
划分子网
- 一个拥有1000台主机的组织,需要申请一个B类地址,这就会导致超过64000个地址不能被其他组织使用
- 随着加入互联网的组织数量的迅速增加,IP地址面临被分配完的危险
- 为了解决上述问题,IETF提出了划分子网的编址改进方案
- 三级IP地址:网络号、子网号和主机号
无分类地址CIDR
- 消除分类:不再有A/B/C类划分
- 灵活前缀:网络前缀位数n可在0-32间任意取值
- 表示方法:斜线记法(CIDR记法)
网络前缀
192.168.1.100/24 # 前24位是网络前缀 10.0.0.1/8 # 前8位是网络前缀地址块
- CIDR 把网络前缀都相同的所有连续的 IP 地址组成一个 CIDR 地址块
- 一个 CIDR 地址块包含的 IP 地址数目,取决于网络前缀的位数
| 128.14.35.7/20 | 是 IP 地址,同时指明了网络前缀为 20 位 该地址是 128.14.32.0/20 地址块中的一个地址 |
|---|---|
| 128.14.32.0/20 | 是包含有多个 IP 地址的地址块,同时也是这个地址块中主机号为全 0 的 IP 地址 |
| 128.14.35.7 | 是 IP 地址,但未指明网络前缀长度,不知道其网络地址 |
| 128.14.32.0 | 不能指明一个网络地址,因为无法知道网络前缀是多少 |
地址掩码(子网掩码)
- 作用:从IP地址中快速提取网络地址
- 格式:一连串1(网络前缀)+ 一连串0(主机号)
IP地址: 192.168.1.100/24 二进制: 11000000.10101000.00000001.01100100 掩码: 11111111.11111111.11111111.00000000 (255.255.255.0) 网络地址 = IP地址 AND 掩码 = 192.168.1.0- 网络地址计算API
- IP地址与地址掩码逐位进行AND运算
// 计算网络地址的伪代码 uint32_t calculate_network_address(uint32_t ip_addr, uint32_t netmask) { return ip_addr & netmask; } // 192.168.1.100 & 255.255.255.0 = 192.168.1.0- 默认地址掩码:
IPv6地址简介
IPv6特点
- 地址长度:128位,地址空间巨大(3.4×10³⁸)
- 表示方法:冒号十六进制记法
2001:0db8:85a3:0000:0000:8a2e:0370:7334简写规则
- 前导零省略:0000 → 0,0200 → 200
- 零压缩:连续多个0块可用::代替(只能使用一次)
2001:0db8:0000:0000:0000:0000:1428:57ab → 2001:db8::1428:57ab特殊IPv6地址
constchar*loopback="::1";// 环回地址constchar*unspecified="::";// 未指定地址constchar*multicast_prefix="ff00::/8";// 多播地址端口号
基本概念
为什么需要端口号
- 进程标识:IP地址标识主机,端口号标识主机内的进程
- 多路复用:多个应用进程共享同一IP地址
- 动态性:进程的创建和撤销是动态的
特性
- 长度:16位(0-65535)
- 本地意义:只在当前主机内有意义
- 唯一标识:<IP地址, 端口号, 协议> 三元组唯一标识一个通信端点
端口号分类
IANA标准分类
| 类型 | 范围 | 权限 | 用途 | 示例 |
|---|---|---|---|---|
| 熟知端口 | 0-1023 | 系统/root | 标准服务 | HTTP(80), HTTPS(443) |
| 登记端口 | 1024-49151 | 用户/系统 | 注册服务 | MySQL(3306), Redis(6379) |
| 短暂端口 | 49152-65535 | 用户 | 客户端临时端口 | 客户端连接时动态分配 |
常见端口号
基础网络服务
// 常用端口定义(编程时可作为常量)#definePORT_FTP21// 文件传输协议#definePORT_SSH22// 安全Shell#definePORT_TELNET23// 远程登录#definePORT_SMTP25// 简单邮件传输#definePORT_DNS53// 域名系统#definePORT_HTTP80// 超文本传输#definePORT_POP3110// 邮局协议#definePORT_HTTPS443// 安全HTTP#definePORT_MQTT1883// MQTT协议(物联网常用)#definePORT_MQTTS8883// 安全MQTTLinux系统视角(BSD端口分类)
- 0不使用,1-1023为系统端口,也叫BSD保留端口
- 0-1023: BSD保留端口,也叫系统端口,这些端口只有系统特许的进程才能使用
- 1024~65535为用户端口,其中:
- 1024-5000: BSD临时端口,一般的应用程序使用1024到4999来进行通讯;
- 5001-65535:BSD服务器(非特权)端口,用来给用户自定义端口
# 查看系统端口范围配置 cat/proc/sys/net/ipv4/ip_local_port_range # 通常输出:3276861000# 常用分类(Linux实际使用): #0-1023: 特权端口(需要root权限绑定) #1024-49151: 用户端口 #32768-61000:临时端口(客户端常用)