目录
- 前言
- IP协议概述
- IP协议工作原理
- IP协议的特点
- IP地址
- IPV4与IPV6
- 特殊地址
- 私有地址
- 子网技术
- 子网掩码
- 超网技术
- IP数据包
- 本机字节序
- 大端字节序
- 小端字节序
- 网络字节序
- IP数据包的格式
- 分片与重组
- 本机字节序
- 参考资料
前言
参照清华大学出版社-罗军周主编的《TCP/IP协议及网络编程技术》进行学习。
本篇主要参考第三章:《IP协议》
介绍IP地址、子网、IP协议协议的工作原理以及IP数据包的详细格式(并不包含数据包的错误控制)
IP协议概述
- IP协议是整个TCP/IP协议族中最重要的协议。
- 互联网上所有的数据包、都要经过IP协议进行传输。
也是通讯网络与高层协议的分界。 - 位于网络层、上接传输层、下启物理链路层。
帮助上层协议屏蔽了各种不同物理链路的差别、因此可以将各种不同介质的网络互联起来。
IP协议工作原理
可以类比快递系统
- 源主机(
发件人A
)系统先将要发送的数据准备好并指明目的地、然后将数据交给IP协议。 - IP协议(
邮局A员工
)将数据组成数组包并将数据包发送到源网络设备(邮局A
)、由一个个网络设备(中转邮局BCD
)(路由设或交换机)备将数据包传送到正确的地址。 - 目的地网络设备(
邮局B
)接收到IP数据包后由IP协议解析('邮局B员工')并根据其目的地址将数据包发送给目的主机系统(收件人B
)。
但是和实体快递业务也有区别:
1、数据包的接收与发送是流水性的、随到随走
2、IP协议中会将过大的包拆分成小包、但不会将同地址的小包组合
IP协议的特点
- IP协议的工作对象是数据包
在运送的时候只会根据分组数据包本身进行处理、不会考虑不同数据包间的先后关系(只关心如何把单个分组数据包送往目的地)。 - IP协议的责任是讲数据正确的传输到目的地
所以IP协议能够表示和识别数据包的地址、并能根据地址选择路径。 - IP协议提供无连接的数据包传送服务
它不能保证将IP数据包成功的送达目的地、只保证提供最好的传输服务(由路由器根据目标地址和当前网络状况、通讯流量等。选择合适的线路、将分组发送到距离目标更近的节点
)。
IP地址
IP地址是任何连入网络的设备、用于区分其他设备的标识。
IPV4与IPV6
- IPV4
第四版IP协议(V-Version)
地址长度为32位、所以最多有2^32 ≈ 43亿个地址。
一般的书写法为4个用小数点分开的十进制数。即xxx.xxx.xxx.xxx。
每段最多可以存放8位2进制字符、也就是2^8=256、从0开始计算就是255。
地址类型(共32位)
网络号(接入网络位置)和主机号(局域网内位置)
常用的网络地址为ABC三类:
A类:0开头、后24位作为主机号、其余作为网络号。
B类:10开头、后16位作为主机号、其余作为网络号。
C类:110开头、后8位作为主机号、其余作为网络号(最常用)
根据表示的不同、应用场景下局域网内可以含有的主机号越来越小。
如在C类网络中,前24位为网络地址,后8位为局域网地址,可提供254(2^8-2)个设备地址(因为有两个地址不能为网络设备使用: 255为广播地址,0代表此网络本身)
- IPV6
这里可能不太全面和系统。因为书里并没有写很多都是自己查的。将来系统整理的时候会再补充。
第六版IP协议
地址长度128位、所以最多存在2^128≈340万亿个地址。
书写方法为8个16位进制数。中间用:隔开。
每段最多可以存放16为2进制数、也就是ffff。
中间空位太多比如:1080:0000:0000:0000:0008:0800:200C:417A
可以简化为1080:0:0:0:8:800:200C:417A
地址类型
IPv6 并没有A类、B类和C类的划分。而是定义以下地址类型:
-
二者区别
1、地址空间的差别
IPv4(43亿)即将耗尽全部数量的地址。实际上、已经有40多亿个设备在共享IP地址。
而IPV6(340万亿)即使地球上每个人都有几十个联网设备、分配的话也绰绰有余.
2、地址表示方式
IPv4地址表示为点分十进制格式、32位的地址分成4个8位分组、每个8位以十进制数显式、中间用点号分隔。
例如:192.0.0.1
而IPv6采用的是十六进制格式、既128位地址是以16位为一分组、每个16位分组写成4个十六进制数、中间用冒号分十六进制格式。
例如:1080:0000:0000:0000:0008:0800:200C:417A、但可以简化成1080:0:0:0:8:800:200C:417A
3、报文头部格式的差别
IPv6报头占40字节、相对于IPv4报头(变长的24字节)看似长。其实、有些IPv4报文头部字段被删除或称为可选部分、减少数据包处理成本、让IPv6报头的带宽成本尽可能低。虽然IPv6地址长度是IPv4的4倍、但IPv6报文的头部长度只有IPv4报文头部长度的2倍。
IPV6使用新的头部格式,其选项与基本头部分开,如果需要,可将选项插入到基本头部与上层数据之间。这就简化和加速了路由选择过程,因为大多数的选项不需要由路由选择
4、组播及对流支持的差别
IPv6增加了增强的组播(Multicast)支持以及对流的支持(Flow-control)。这使得网络上的多媒体应用有了长足发展的机会,为服务质量(QoS)控制提供了良好的网络平台。
5、连网方式的差别
在IPv4中,动态主机配置协议(DynamicHostConfigurationProtocol,DHCP)实现了主机IP地址及其相关配置的自动设置。
IPv6继承了IPv4的这种自动配置服务,并将其称为全状态自动配置(StatefulAutoconfiguration)。只要机器一连接上网络便可自动设定地址,这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。
6、网络层的认证与加密的差别
由于在IP协议设计之初没有考虑安全性,因而在早期的Internet上时常发生诸如企业或机构网络遭到攻击、机密数据被窃取等不幸的事情。为了加强Internet的安全性,从1995年开始,IETF着手研究制定了一套用于保护IP通信的IP安全(IPSec)协议。IPSec是IPv4的一个可选扩展协议,是IPv6的一个必须组成部分。
7、服务质量的差别
IPv4在设计之初,只有一种简单的服务质量,即采用“尽最大努力”(Besteffort)传输,从原理上讲服务质量是无保证的。
IPv6新增加了一个服务质量(QoS)功能,增加了对数据包标记的功能,通过标记知道数据包属于哪个特定的通信流。
8、对移动通讯支持的差别
移动IPv6的设计汲取了移动IPv4的设计经验,并且利用了许多新的特征,所以提供了比移动IPv4更多的、更好的特点。
9、IPv6使用更小的路由表
IPv6使用更小的路由表。IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表中用一条记录(Entry)表示一片子网,大大减小了路由器中路由表的长度,提高了路由器转发数据包的速度。
10、允许扩充
如果新的技术或应用需要时,IPV6允许协议进行扩充。
-
特殊地址
根据对IP地址的描述。我们可以对具有特殊作用的IP地址进行归纳:
特殊地址
也可以参考教材
对于IPV6而言:
■::/96 即0:0:0:0:0:d:d:d:d 兼容IPV4地址
■::/128 即0:0:0:0:0:0:0:0:0 不确定地址。它不能分配给任何节点。它的一个应用示例是初始化主机时,在主机未取得自己的地址以前,可在它发送的任何IPv6包的源地址字段放上不确定地址。不确定地址不能在IPv6包中用作目的地址,也不能用在IPv6路由头中
■::1/128 即0:0:0:0:0:0:0:0:1 回环地址。节点用它来向自身发送IPv6包。它不能分配给任何物理接口。功能很像我们熟悉的127.0.0.1
■2001:db8::/32 即2001:db8:0:0:0:d:d:d:d 可以理解为保留地址,共特殊目的使用。
■ ff01::1/128(或者只是ff01::1)。接口本地作用域的所有节点多播地址。
■ ff02::1/128(或者只是ff02::1)。链路本地作用域的所有节点多播地址,与IPv4中的广播地址类似。
■ ff02::2/128(或者只是ff02::2)。链路本地作用域的所有路由器多播地址。
■ ff05::2/128(或者只是ff05::2)。站点本地作用域的所有路由器多播地址。
■ 2002::/16。该前缀用于6to4寻址。
■ ff00::/8。用于多播地址。
■ fe80::/64。链路本地地址,它是一种自动分配的IP地址,类似于在IPv4中的自动专用IP地址(APIPA)。如果看到接口分配了一个这样的地址,表示DHCPv6服务器不可用。更多信息可参看本小节的"链路本地地址"部分。
■ fc00::/8或fd00::/8。ULA可以在Intranet上路由,不能在Internet上路由。ULA在功能上与私有IPv4网络(10.0.0.0/8,172.16.0.0/12和192.168.0.0/16)类似,因为它们允许创建复杂的内部网络,并且无需分配公共地址空间。
-
私有地址
可能存在这样的情况:某个组织网络使用了TCP/IP技术、但并没有接入到Internet。如果这样、他可以使用所有的IP地址作为内网地址。但是、一旦接入到Internet、不可能修改所有的内部主机IP。于是、在每类地址中、都预留出一段地址作为内部网络地址:
对于IPV6、私有地址为:
FEC0:0000:0000:0000:0000:0000:0000:0000/10
由于IPv6没有A类、B类和C类的划分。因此所有私有IP地址都是以前缀FEC0::/10开头的,这个前缀可以给予内部网络所有节点和网络设备,同样这个IPv6私有地址不能在互联网上路由。这里请注意,如果一个网络全部由IPv6协议组成,是不希望希望使用NAT的。IPv6地址空间很大,这样可以保持IP协议的端到端的有效性。
子网技术
可以将某网络组织的网络继续划分、并在他们之间路由。从Internet的角度看、具有多个子网的组织应该被看做只有一个网络。因此、他们能共享一个IP地址的范围。
目的
- 充分利用IP地址、减少单个网络内主机数。
IP地址的位数有限、能表示的信息也是有限的。假如我们像邮政编码那样规定,例如:
前8位为子网掩码、后24位为主机编号、也就是一个网段中最多可以有2^24‑2台主机、再多的话就无法编码。
假如一个网段中只有两台主机、那就根本不需要那么多位数来标识主机、就使大量的IP地址无法使用。
假如这个网段中主机比较多、超过了24位所能表达的数目、那就会出现IP地址不够用的情况。
因此如果规定了位数、就会非常不灵活、没办法更好地利用IP资源。
- 隔离网络
为了满足不同网络的需求(比如安全等)
如何确定IP地址中的网络位与主机位
-
子网掩码
高级设置中的子网掩码子网掩码就是要告诉大家,子网占了多少位,主机编号占了多少位的。
一个32位的二进制数、用于区分任意IP地址中的网络地址和主机地址。
网络地址取1、主机地址取0。
子网掩码不能单独存在、是与IP地址结合在一起使用的。
举例说明
一个纯C类地址的子网掩码:
11111111 11111111 11111111 00000000
==>
255.255.255.000
这个C类地址中就会被划分成1个等大小的子网。每个含有主机2^8个。
一个C类地址取主机号的前两位为子网号
11111111 11111111 11111111 11000000
==>
255.255.255.192
这个C类地址中就会被划分成4个等大小的子网。每个含有主机2^6个。
超网技术
可以解决主机数介于C类(255)和B类(65536)的情况。
目的
将多个网络聚合、形成一个单一的、具有共同地址前缀的网络。
有点
可以减少路由表中地址数量、提高网络空间利用率。
举例说明
其实就是将一个介于C类与B类之间的子网掩码、比如:
11111111 11111111 11111110 00000000
==>
255.255.254.0
可以分为128个子网、每个子网主机数为512。
IP数据包
本机字节序
在计算机中、最基本的数据长度单位是字节、能表示8位二进制数。
一个整数、在二进制下可以表示成8位整数、16位整数、32位整数。
其中8位整数对应一个字节。
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。
- 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
- 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
举例来说,我有一个需要2个字节存储的整数。为了方便说明、使用16进制表示这两个数。即
0x2211
。那么:
高位字节是0x22
,低位字节是0x11
。
-
为什么要有两种字节序?
- 计算机的内部处理都是小端字节序
计算机电路先处理低位字节、效率比较高。因为计算都是从低位开始的。 - 人类还是习惯读写大端字节序
所以、除了计算机的内部处理、其他的场合几乎都是大端字节序。比如网络传输和文件储存。
- 计算机的内部处理都是小端字节序
-
字节序的处理
只有读取的时候,才必须区分字节序,其他情况都不用考虑。
处理器读取外部数据的时候,必须知道数据的字节序,将其转成正确的值。然后,就正常使用这个值,完全不用再考虑字节序。
即使是向外部设备写入数据,也不用考虑字节序,正常写入一个值即可。外部设备会自己处理字节序的问题。
网络字节序
TCP/IP协议规定、RFC1700规定使用“大端”字节序为网络字节序。
网络设备发送数据的时候必须要将自己的主机字节序转换为网络字节序(即“大端”字节序)、接收数据的时候再转换为自己的主机字节序。
IP数据包的格式
IP数据包的报文格式-
数据包的头4位为IP协议版本号
一般的值为0100(IPv4)、0110(IPv6) -
首部长度也为4位、标识着包头的长度
这个字段的作用是为了描述IP包头的长度、因为在IP包头中有变长的可选部分。
这个值以4字节为单位、IP协议首部的固定长度为20字节,如果IP包没有选项,那么这个值为5。 -
服务类型
长度8位。分别按位被如下定义 PPP DTRC0 响应位置填写上二进制数就得出 110 01010-
PPP、过程字段:
3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制) -
D、延迟字段:
1位,取值:0(正常)、1(期特低的延迟) -
T、流量字段:
1位,取值:0(正常)、1(期特高的流量) -
R可靠性字段:
1位,取值:0(正常)、1(期特高的可靠性) -
M成本字段:
1位,取值:0(正常)、1(期特最小成本) -
0保留字段:
1位 ,未使用
-
-
总长度
长度16位。 以字节为单位计算的IP包的长度 (包括头部和数据)、所以IP包最大长度2^16 -1 = 65535字节。 -
标识、标志和偏移字段放在IP数据包的分片和重组中去说
-
生存时间
长度8位、代表多少次转发后将会被丢弃。最大255、推荐值64。
每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去。 -
协议
长度8位、标识上层所使用的协议。以下是比较常用的协议号:- 1 ICMP
- 2 IGMP
- 6 TCP
- 17 UDP
- 88 IGRP
- 89 OSPF
-
校验和
长度16位。用来做IP头部的正确性检测、但不包含数据部分。
因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。如果计算不匹配IP协议则丢弃该数据包。 -
源IP地址、目的IP地址
32位二进制数
至此、总计20字节的IP包头已经介绍完毕。下面两个为可选项:
-
可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
-
松散源路由(Loose source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。
-
严格源路由(Strict source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。
-
路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。
-
时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。
-
-
填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍
分片与重组
由于总长度被限制为65535个字节、或者在不同的物理网络中、对数据帧的长度是有限制(MTU)的(例如以太网的MTU为1500个字节、ATM的MTU为48个字节)。所以、实际使用中经常会遇到一个IP包传输不完、需要拆分的情况。
对于大于MTU的数据包、会被拆分然后传输、最后在目的地重组恢复。
分片动作通常由路由器完成、重组由目标主机完成(降低了中间路由器压力)。
-
标识
在分片时、需要将同一数据源的分片打上标识。
标识的值有数据源主机决定。在源主机上通过维护一个全局变量来设置标识、每产生一个数据包、就将其变量加一。
目标主机通过源主机IP以及自增的标识便可以确定该组合哪些数据包。 -
标志位和偏移
标志位和偏移
举个例子:两个分片后的数据包
其中第二片数据包的偏移为第一个数据包数据的大小。
在对已经分片的IP数据包进行再分片时。需要根据之前的分片标志位以及偏移位来进行填写。
参考资料
IT世界大解密:IPv4与IPv6
一文读懂IPV6:IPV6是什么 IPV6与 IPV6有什么区别
百度文库《几类特殊的IP地址》
IPv6的私有地址网络段是什么啊?
知乎《如何理解子网掩码中的“子网”?》
阮一峰《理解字节序》
知乎《“字节序”是个什么鬼?》
IP数据包的格式及分片
ip包格式说明
网友评论