版权声明:本文为博主原创文章,转载请注明博客地址: https://cloud.tencent.com/developer/article/1433298
在使用TCP/IP通信的时候,IP地址是一块基石。
IP地址(IPv4)
这里所说的IP地址是IPv4地址,IP地址由32位正整数来表示。他在计算机内部被以二进制方式处理,因此最多有2^32个IP地址,即:43亿个总IPv4地址。32位的IP地址被分为4组,每组8位。每组以“.”来进行分割。然后在将每组数转换为相应的十进制数字。例如:192.168.0.231,我们称之为点分十进制形式。将每组数组转换为二进制为:11000000.10101000.00000000.11100111
早期的IP地址被分组处理为A,B,C,D,E五组,其中实际被使用的是A,B,C,D四类,E类是实验保留用的。每一类IP地址所能容纳的主机数量的差异是巨大的。
IP地址是由两个部分组成的,网络标识 主机标识构成一个完整的IP地址。以A类IP地址为例,它的主机标识达到了24位之多,一个网段内能容纳的主机数量高达16777214台主机。(2^24 == 16777216)其中地址全为0表示对应的IP地址不可获知;其中地址全为1的表示广播地址。因此,容纳的主机数量最多可达16777214台。D类IP地址没有主机标识,只有网络标识。通常被用作广播地址。它只作为目的地址。
特殊的IP地址
广播可以分为两类:本地广播和直接广播。
本地广播是在同一个数据链路上。例如:192.168.0.255/24他会将广播到192.168.0.0/24。
直接广播是在不同网络之间的广播。但是这个缺点是路由器将会转发包,这样将不安全。因此,通常使用的是IP多播。
多播能将包发送给指定组内的所有主机,它使用IP协议,所以能够穿透路由器。因此IP多播成为了只给那些必要的组发送数据包的必选之路。多播使用D类IP地址。因此IP地址开头如果是“1110”,则可以认为是多播地址。剩下的28位成为多播组标号。即:从224.0.0.0到239.255.255.255都是多播地址。其中从224.0.0.0到224.0.0.255的范围是不需要路由控制的,也就是说能在同一个数据链路内实现多播。
动态IP划分
现在的IP地址不在局限于上述的类别,更多的则是通过一个叫做子网掩码的识别码来进行网络的识别。自从有了“子网掩码”,一个IP地址的网络标识和主机标识就是由“子网掩码”来确定的。子网掩码也是一个32位的数字。它用连续的1来表示网络标识的长度,即:有多少位网络标识,子网掩码就有多少个1,剩下的用0表示的部分就是主机标识。例如:
IP地址:192.168.0.231
子网掩码:255.255.255.0
这就标识IP地址的网络标识有24位,主机标识只有8位。此时该IP段的广播地址应该如下:
IP地址:192.168.0.255
子网掩码:255.255.255.0
子网掩码就是在A,B,C,D四类基础上改进而来的,需要多少就用多少。因此,子网掩码可以灵活的指定网络标识长度。
CIDR:无类别域间路由选择。这是将子网和子网掩码进行融合的一种做法。比如,我们将上面的C类IP地址和子网掩码合在一起写成CIDR形式:192.168.0.231/24。
IP地址的分类处理导致了早期在架构大型网络的时候一般会分配一个A类IP地址,但是这个A类IP地址最多只能分128个(0,10,127等开头的A类IP地址是保留的IP地址)。而C类IP地址最大只能容纳254台计算机。随着计算机网络的日益发展,能分到的A类IP地址几乎没有了,B类IP地址也严重缺乏。于是,人们摒弃了IP地址分类的做法,采用任意长度分割IP地址的网络标识和主机标识。这种方式叫做CIDR。另外还是用来VLSM技术(可变长子网掩码),他可以随机修改子网掩码的长度。有了CIDR和VLSM在一定程度上缓解了全局IP地址不够用的局面。
私有地址(私有IP)
随着互联网的迅速发展,IP地址不足的问题越来越明显。于是,出现了一种新的技术,他不在要求为每一台主机或者路由器分配一个IP地址,而是在必要的时候,才给相应数量的设备分配唯一的IP地址。对于一个局域网内的设备而言,只要IP地址是不冲突的即可。于是,私有IP地址便出现了。
10.0.0.0——10.255.255.255(10/8),这是A类私有IP地址
172.16.0.0——172.31.255.255(172.16/12),B类
192.168.0.0——192.168.255.255(192,168/16),C类
包含在上述IP内的所有地址都是私有地址。在此之外的IP地址都是公有IP地址。
最初配有私有IP地址的主机本来是不打算连接到互联网的,但是随着NAT技术的出现,它能够互换私有IP和全局IP。使得私有地址的主机也能够连接互联网。现在在学校和家里一般都是在每个终端设置私有IP,但是在路由器上设置一个全局IP。这相当于在IP地址中又进行了一次地址层次的划分。私有IP地址的主机则通过NAT与互联网相连接。
由此IPv4地址池枯竭的问题基本可以得到解决。私有IP地址和NAT技术已经成为现在解决全局IP地址枯竭的主流方案。但是在使用的时候就有一些限制。为此,IPv6出现了,它长达128位的地址,足足有3.4028236692093846346337460743177e 38这么多的IP地址。相信随着互联网的发展,IPv6的普及,人人都可以拥有一个公网IP。
在全世界范围内,全局IP地址是由ICANN进行管理。我国的全局IP地址是由CNNIC来进行管理的。对于一般用户而言,并不需要向CNNIC发出申请全局IP地址的请求,而是向本地ISP发出接入互联网的请求,同时本地ISP会给用户分配一个全局IP地址。现阶段普遍采用的方式是私有IP地址 NAT技术来给用户提供上网服务。
IPv4数据报格式
版本号:在IPv4数据报中,版本号就是4。不同的IP版本使用的数据报格式不同,IPv6的数据报不是这样的。
首部长度:首部长度的单位是4字节,即当首部长度填写为5的时候,IP首都长度实际是20个字节。大多数IP数据报都不包含可变部分。即一般的IP数据报首部大小就是20个字节。
服务类型:区分不同类型的IP数据报。只有当网络本身提供区分服务的时候,才有用。
总长度:它是IP数据报的总长度,单位是1字节。该字段有16位,即最大理论长度是65535字节。然而实际上由于数据链路的影响,一般很少有超过1500字节的数据报。
TTL:TTL是用来设置数据报不会在网络中一直循环。每当数据报经过一个路由器的时候,TTL就自动减1。若TTL=0,那么该数据报将被丢弃。
协议:该字段指示传输层所使用的协议类型。通过该字段指示了IP数据报应该交给哪个传输层协议。典型的有值为6的时候,表示应该交由TCP协议,值为17的时候,表示交由UDP协议。
首部校验和:实现对IP数据报首部的差错检验。由于每经过一次路由器,TTL都要减1,故,校验和也是每次经过一个路由器都要校验和重新计算的。
源IP地址:发送分组的路由器/主机的IP地址。
目的IP地址:接收分组的路由器/主机的IP地址。
选项字段和填充:它们一般在数据报中不存在。
事实上,所有的IP数据报的DF都是为0的。究竟分不分片是由路由器决定的,而不是发送主机。
IP分割和重组
数据链路层不同,MTU(最大传输单元)就不同。但是IP协议是网络层的协议,它需要将数据链路层进行抽象。使得所有的数据链路对于上层的表现是一致的。
任何一台主机必要对IP分片进行相应的处理。因为,较大的报文无法一下子发送出去,需要进行分片分次发送。是否有必要进行分片是由路由器决定的,只要路由器认为有必要分片,就会进行分片。路由器只管分片,不管重组。重组是需要在目标主机上完成的。分片以8字节的倍数进行。IP首部的“片偏移”字段表示之后每个分片在用户数据中的相对位置和该分片之后是否还有其它后续分片。
分片机制并不完美,随着互联网的快速发展。分片机制带给路由器的负担越来越重。并且分片带来了如果丢失其中一个分片,那么整个报文就会作废。但是如果让上层协议封装的数据流变得更小,会导致网路利用率下降。为了解决上述问题,我们引入路径MTU发现。
路径MTU发现是指从发送端主机到接收端主机所经过的所有数据链路中最小的MTU。按照路径MTU分片以后,就无需再中途的路由器上进行分片处理了。路径MTU的实现依赖于路由器所搭载的操作系统。
在上层协议是UDP协议的情形下,首先在发送端主机发送IP包的时候设置分片禁止标志。途中的路由器即使遇到了包的大小超过了数据链路的MTU,也不去分片,直接将包丢弃。随后,通过ICMP的不可达消息返回一个MTU的值给发送主机。下一次,根据这个ICMP所通知的MTU去进行分片处理,接着发送出去,如果分片仍旧在传输过程中大于某一数据链路的MTU,仍将分片丢弃,ICMP继续返回一个当前MTU,如此一直进行下去,直到找到一个合适的MTU。
在上层协议是TCP协议的情形下。由于TCP协议是面向有连接的(两台主机之间要维护这个连接)。TCP协议会根据路径MTU的大小来计算出最大段长度MSS。一旦TCP连接采用了路径MTU发现,那么在IP层就不会在进行分片处理。因为,MSS最大就是路径MTU。