TCP/IP协议(1): IP 地址和寻址方式 —— IP 协议的基础
TCP/IP协议(1): IP 地址和寻址方式 —— IP 协议的基础
最近在重学计算机网络,给自己立一个 flag,有感而发的时候写关于 TCP/IP 协议栈的系列博客。
IP 地址
IP 地址(Internet Protocol address, IP address) 在 TCP/IP 协议栈中,起着至关重要的作用。IP 地址 不仅能唯一标识与之关联的主机,还能够指出该主机在网络中的位置,以方便我们在网络中找到该主机。
“它(IP 地址)是一个名字,标识出我们(在网络中)寻找的是什么。它也是一个地址,告诉我们要找的网络设备在网络中的哪个位置。他还是一个路线,指出我们可以如何到达与之关联的网络设备的位置。”
(“A name indicates what we seek. An address indicates where it is. A route indicates how to get there.”)
IPv4(Internet Protocol version 4) 地址
IPv4 最早在 ARPANET 中使用,如今已经在几乎所有的互联网使用。
IPv4 的地址由 32 位的非负整数表示, 通常用所谓的**点分十进制(Dot-decimal notation)**表示法表示。
点分十进制表示法将 IPv4 地址用点分成四份,每份八位。然后将每个八位转换成十进制非负整数。
如下表:
| 点分十进制表示 | 二进制表示 |
|---|---|
| 0.0.0.0 | 00000000 00000000 00000000 00000000 |
| 10.0.0.1 | 00001010 00000000 00000000 00000001 |
IPv6(Internet Protocol version 6) 地址
在 Internet 发展早期,加入网络的网络设备数量较少, 32 位的 IPv4 地址足以应付。
但,随着近些年 Internet 的高速发展,加入的网络设备越来越多,加之 IPv4 地址不合理的分配方式,可分配 IPv4 地址越来越少。
正是由于上述原因,IETF(Internet Engineering Task Force) 提出了 IPv6 协议。
IPv6 的地址长度为 128 位,由八个被称之为块或字段的四个十六进制数表示。如,5f05:2000:80ad:5800:0058:0800:2023:1d71。
本文主要是对 IPv4 的讲解。
IPv4 的编址方式
IPv4 地址的编址方式共经历了三个历史阶段:
- 分类寻址 将 IP地址 划分为五类。IP 地址 由网络号(net-id) 和主机号(host-id) 组成。路由器仅根据目的主机的网络号来转发分组,从而减小路由表所占用的存储空间以及查找路由表的时间。
A classful network is a network addressing architecture used in the Internet from 1981 until the introduction of Classless Inter-Domain Routing in 1993.
- 划分子网:这是对原始的 分类寻址 的改进,将原始的分类寻址进一步的划分。将之前的主机号 进一步划分为 子网号(subnet-id) 和 主机号,从而提高 IP地址 的利用率。
- 无类别域间路由:消除了传统的 A 类, B 类, C类地址以及划分子网的概念,因而更有效地分配 IPv4 的地址。
分类网络(classful network)
传统的 IP 地址被划分为五类:
- IP 地址管理机构在分配 IP地址 时,分配网络号,而剩下的主机号由得到该网络号的单位自行分配。从而方便管理。
- 路由器仅根据目的主机的网络号来转发分组,从而减小路由表所占用的存储空间以及查找路由表的时间。
- 主机号为全 0 的地址为子网的网络号,主机号 为全 1 的地址为子网的广播地址, 都不能被指派。
子网划分(subnetting): 分类网络的改进
可以看出,两级 IP 地址 不够灵活, 对 IP 地址空间的利用率比较低。如, C 类地址的局域网最多分配 254 个主机号, B 类地址的局域网最多分配 65534 个主机号。如果有个单位有 255 台主机,则只能为其分配一个 B 类地址的 网络号。这样就会浪费很多 IP 地址。
子网划分 将之前的主机号 进一步划分为 子网号(subnet-id) 和 主机号,从而提高 IP地址 的利用率。
RFC950 规定, 对分类的 IPv4 地址进行划分时,子网号 不能为全 0 或全 1;
在子网网络中保留和扩展这些特殊地址的解释(全 0 = this, 全 1 = all), 这就意味着不应该将子网号为全 0 或全一的 IP 地址分配给实际子网。
( It is useful to preserve and extend the interpretation of these special addresses in subnetted networks. This means the values of all zeros and all ones in the subnet field should not be assigned to actual (physical) subnets.)
但随着无类别域间路由的广泛使用,现在全 0 和全 1 的子网号也可以使用。
- 子网掩码寻址
子网掩码是一个与 IP 地址相对应的 32 位二进制串。它由一串 0 和跟随的一串 1 组成。其中,1 对应于 IP 地址 的网络号和子网号,而 0 对应于主机号。如 A 类地址用掩码表示为255.0.0.0, B 类 地址用掩码表示为255.255.0.0, C 类地址用掩码表示为255.255.255.0。
路由器将子网掩码和目标地址进行按位与操作,从而得到目标网络的网络号和子网号, 进而将数据包发送到相应的网络中去。
上图的例子解释了子网划分后到达 145.13.21.5 的数据包的传输:
(1) 在第一级网络中时。各路由器用 B 类地址的掩码 255.255.0.0 和 145.13.21.5 按位相与得到网络号 145.13.0.0。然后传递过程中遇到的路由器都将该数据包传输给 145.13.0.0 网络。
(2)在数据包到达 145.13.0.0 网络中后。145.13.0.0 网络通过子网掩码 255.255.255.0 将该网络划分为多个子网。145.13.0.0 网络中的路由器用划分子网的掩码 255.255.255.0 和 145.13.21.5 按位相与得到网络号和子网号 145.13.21.0。然后 145.13.0.0 网络内的路由器将该数据包传输给 145.13.21.0 子网。
(3) 在数据包到达 145.13.21.0 子网后。145.13.21.0 子网的路由器将数据包传输给目的主机 145.13.21.5。
可变长度子网掩码寻址(VLSM, Variable-Length Subnet Masking)
上一 part 的例子中,145.13.0.0网络用子网掩码255.255.255.0将该网络分为多个子网,但是,每个子网的最大可用主机号都是固定的(254 个)。而实际工作中,根据需求不同,各个子网的规模也不同,有的子网可能只需要几个主机号,而有的子网则可能需要成千上万个主机号,这就需要更灵活的分配方式来处理。可变长度子网掩码 允许将网络划分为不同大小的子网, 每个主机和路由器端口除了分配一个 IP 地址,还需要配置一个子网掩码,以确定其所在子网的规模。
###无类别域间路由 (CIDR, Classless Inter-Domain Routing)
无类别域间路由 在可变长度子网掩码寻址的基础上,消除了传统的 A、B、C 类网络划分。和其他相关协议一起构成所谓的 超网(Supernetwork)。
CIDR 将 IP 地址分为网络前缀(network-prefix) 和主机号 两部分。使用 CIDR 记法(IP 地址后面加上斜线,然后写上网络前缀所占位数)记录 IP 地址。如:128.14.35.7/20。
当一个单位需要 10 个主机号的 IP 地址时, 就只需给他分配一个 /12 (子网掩码为 255.255.255.240)的 CIDR 地址块,如, 128.14.32.0/12 到 128.14.32.15/12 地址块。分配到该地址块的单位根据实际情况的需要,可以继续将这个地址块划分成更小的子网。
私有网络(private network)地址
| IP address range | number of addresses | largest CIDR block (subnet mask) |
|---|---|---|
| 10.0.0.0 – 10.255.255.255 | 16777216 | 10.0.0.0/8 (255.0.0.0) |
| 172.16.0.0 – 172.31.255.255 | 1048576 | 172.16.0.0/12 (255.240.0.0) |
| 192.168.0.0 – 192.168.255.255 | 65536 | 192.168.0.0/16 (255.255.0.0) |
参考文献
- IP address - Wikipedia
- IPv4 - Wikipedia
- Dot-decimal notation - Wikipedia
- IPv6 - Wikipedia
- Classful network - Wikipedia
- Classless Inter-Domain Routing - Wikipedia
- Subnetwork - Wikipedia
- Supernetwork - Wikipedia
- private network - Wikipedia
- RFC950: Internet Standard Subnetting Procedure
- W.Richard Stevens等著,《TCP/IP 详解(卷一: 协议)》
- 谢希仁编著, 《计算机网络》
TCP/IP协议(1): IP 地址和寻址方式 —— IP 协议的基础的更多相关文章
- TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议
原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...
- IP地址和硬件地址 ARP协议
ip地址使用在网络层以上,是一个逻辑地址,物理地址是数据链路层和物理层使用的 在发送数据的时候,数据是从上层往下层发送的,通过tcp报文->ip数据报->mac数据帧 IP地址放在数据报的 ...
- TCP/IP(七)之玩转HTTP协议
前言 前面一篇的博文简单的介绍了一下属于应用层的HTTP协议,这一篇我将详细的学习HTTP协议,这也是做Web开发中一定要用到的协议.虽然我是做大数据的,但是多学习一点肯定是 没有坏处的.国庆放假7天 ...
- 《TCP/IP 详解 卷1:协议》第 5 章:Internet 协议
IP 是 TCPIP 协议族中的核心协议.所有 TCP.UDP.ICMP.IGMP 数据都通过 IP 数据包(又称为 packet)来传输.IP 的英文名为 Internet Protocol,是互联 ...
- 《TCP/IP 详解 卷1:协议》第 4 章:地址解析协议
链路层是经过单一链路通信的协议层. IP 网络层协议的设计目标是为跨越不同物理类型的.多节点网络的 packet ,提供主机寻址.路由操作. 在其中要注意的一点是:网络层使用的地址和底层网络硬件使用的 ...
- TCP/IP协议的数据传输过程详解——IP与以太网的包收发操作
MTU:一个网络包的最大长度,以太网中一般是1500字节:(含有头部长度,包括IP头部,TCP头部,不包括MAC头部) MSS:除去头部后,一个网络包所能容纳的TCP的数据的最大长度 下图为TCP/I ...
- TCP/IP网络编程之地址族与数据序列
分配IP地址和端口号 IP是Internet Protocol(网络协议)的简写,是为收发网络数据而分配给计算机的值.端口号并非赋予计算机的值,而是为区分程序中创建的套接字而分配给套接字的序号 网络地 ...
- 《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议
4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络如 ...
- TCP/IP学习笔记14--IP地址 之 全局地址,私有地址
只要明天还在,我就不会悲哀,冬雪终会悄悄融化,春雷定将滚滚而来.----<只要明天还在>,汪国真 全局地址,私有地址 , 一种为解决IP地址不足而产生的技术. 起初 ,互联网中的任何一台主 ...
- IP、子网的详述 ——IP分类、网关地址,子网掩码、子网作用(转)
IP地址 在Internet上连接的所有计算机,从大型机到微型计算机都是以独立的身份出现,我们称它为主机.为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址.就好像每一个住宅都有唯一的门 ...
随机推荐
- js 金钱3位格式化
function formatCash(str) { return str.split('').reverse().reduce((prev, next, index) => { return ...
- postman的运用
链接: https://pan.baidu.com/s/1gfaKoAv 密码: dp7t 最近要测试和其他系统对接,忽然想起了postman这款url测试神器. 现分享如下: 下载完成后解压到文件夹 ...
- Spring Security(7)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 有时某些业务或者功能,需要在用户请求到来之前就进行一些判断或执行某些动作,就像在Servlet中的FilterChain过滤器所做的那样,Spr ...
- 数电第7周周结_by_yc
一.通用双向移位寄存器: 功能描述: 4位的双向移位寄存器,含控制输入端(ctrl).串行输入端(Dsl.Dsr).4个并行输入端和4个并行输出端,要求实现5种功能:异步置零.同步置数.左移.右移 ...
- CTF中RSA常见类型解法
Python脚本 #十六进制转ASCII编码 import binascii print(binascii.unhexlify(hex(m)[2:])) #rsa import gmpy2 phi = ...
- MySQL基础知识(二)-超详细 Linux安装MySQL5.7完整版教程及遇到的坑
1.简介 我们经常会在Linux上安装MySQL数据库,但是安装的时候总是会这里错,那里错,不顺利,今天整理了一下安装流程,连续安装来了两遍,没有遇到什么大错误,基本上十分钟左右可以搞定,教程如下.写 ...
- MySQL字符编码、存储引擎、严格模式、字段类型之浮点 字符串 枚举与集合 日期类型
目录 字符编码与配置文件 数据路储存引擎 创建表的完整语法 字段类型之整型 严格模式 字段类型之浮点型 字段类型之字符串类型 数字的含义 字段类型之枚举与集合 字段类型之日期类型 字符编码与配置文件 ...
- 关于Git在Visual studio及Git Bush中的日常操作教程,有图有说明,会一直更新本页内容... (Git相对SVN具有更加安全的分布式存储, 分支版本之间切换秒级速度, 分支版本强大灵活等特点)
>安装命令行和TortoiseGit UI程序. <git bash的安装> https://git-scm.com/downloads <windows可视化工具 Torto ...
- [编程基础] C++多线程入门2-连接和分离线程
原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 文章目录 2 连接和 ...
- python之路50 ORM执行SQL语句 操作多表查询 双下线方法
ORM执行查询SQL语句 有时候ORM的操作效率可能偏低 我们是可以自己编写SQL的 方式1: models.User.objects.raw('select * from app01_user;') ...