程序员程序猿阵线联盟-汇总各类技术干货IOS

网络协议补完计划--IP协议

2018-05-30  本文已影响44人  kirito_song

目录


前言

参照清华大学出版社-罗军周主编的《TCP/IP协议及网络编程技术》进行学习。
本篇主要参考第三章:《IP协议》
介绍IP地址、子网、IP协议协议的工作原理以及IP数据包的详细格式(并不包含数据包的错误控制)


IP协议概述


IP协议工作原理

可以类比快递系统

但是和实体快递业务也有区别:
1、数据包的接收与发送是流水性的、随到随走
2、IP协议中会将过大的包拆分成小包、但不会将同地址的小包组合


IP协议的特点


IP地址

IP地址是任何连入网络的设备、用于区分其他设备的标识。

IPV4与IPV6

地址类型(共32位)



网络号(接入网络位置)和主机号(局域网内位置)

常用的网络地址为ABC三类:
A类:0开头、后24位作为主机号、其余作为网络号。
B类:10开头、后16位作为主机号、其余作为网络号。
C类:110开头、后8位作为主机号、其余作为网络号(最常用)
根据表示的不同、应用场景下局域网内可以含有的主机号越来越小。
如在C类网络中,前24位为网络地址,后8位为局域网地址,可提供254(2^8-2)个设备地址(因为有两个地址不能为网络设备使用: 255为广播地址,0代表此网络本身)

这里可能不太全面和系统。因为书里并没有写很多都是自己查的。将来系统整理的时候会再补充。

第六版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. 单播地址(Unicast)用于单个接口的标识符,发送到此地址的数据包被传递给标识的接口。通过高序位八位字节的值来将单播地址与多路广播地址区分开来,多路广播地址的高序列八位字节具有十六进制值 FF,此八位字节的任何其他值都标识单播地址。

  2. 任播地址(Anycast)也叫泛播地址,一组接口的标识符(通常属于不同的节点),发送到此地址的数据包被传递给该地址标识的所有接口(根据路由走最近的路线)。任播地址类型代替 IPv4广播地址

  3. 组播地址(Multicast)IPv6中的组播在功能上与IPv4中的组播类似,表现为一组接口对看到的流量都很感兴趣。

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地址的位数有限、能表示的信息也是有限的。假如我们像邮政编码那样规定,例如:
前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)

举例来说,我有一个需要2个字节存储的整数。为了方便说明、使用16进制表示这两个数。即0x2211。那么:
高位字节是0x22,低位字节是0x11

只有读取的时候,才必须区分字节序,其他情况都不用考虑。

处理器读取外部数据的时候,必须知道数据的字节序,将其转成正确的值。然后,就正常使用这个值,完全不用再考虑字节序。
即使是向外部设备写入数据,也不用考虑字节序,正常写入一个值即可。外部设备会自己处理字节序的问题。

网络字节序

TCP/IP协议规定、RFC1700规定使用“大端”字节序为网络字节序。

网络设备发送数据的时候必须要将自己的主机字节序转换为网络字节序(即“大端”字节序)、接收数据的时候再转换为自己的主机字节序。

IP数据包的格式

IP数据包的报文格式
至此、总计20字节的IP包头已经介绍完毕。下面两个为可选项:

分片与重组

由于总长度被限制为65535个字节、或者在不同的物理网络中、对数据帧的长度是有限制(MTU)的(例如以太网的MTU为1500个字节、ATM的MTU为48个字节)。所以、实际使用中经常会遇到一个IP包传输不完、需要拆分的情况。

对于大于MTU的数据包、会被拆分然后传输、最后在目的地重组恢复。
分片动作通常由路由器完成、重组由目标主机完成(降低了中间路由器压力)。


参考资料

IT世界大解密:IPv4与IPv6
一文读懂IPV6:IPV6是什么 IPV6与 IPV6有什么区别
百度文库《几类特殊的IP地址》
IPv6的私有地址网络段是什么啊?
知乎《如何理解子网掩码中的“子网”?》
阮一峰《理解字节序》
知乎《“字节序”是个什么鬼?》
IP数据包的格式及分片
ip包格式说明

上一篇 下一篇

猜你喜欢

热点阅读