TCP/IP笔记(四)IP协议
前言
IP相当于OSI参考模型的第3层--网络层:主要作用是"实现终端节点之间的通信"又称"点对点通信"。
IP作为整个TCP/IP中至关重要的协议,主要负责将数据包发送给最终的目标计算机。因此,IP能够让世界上任何两台计算机之间进行通信。
数据链路层的作用在于实现同一种数据链路下的包传递,而网络层则可以实现跨越不同数据链路的包传递。
主机:配置有IP地址,但是不进行路由控制的设备。
既配有IP地址又有路由控制能力的设备叫做"路由器"。
节点:主机和路由器的统称。
网络层和数据链路层的关系
- 数据链路层提供两个直连设备之间的通信功能。
- 网络层负责没有直连的两个网络之间进行通信传输。
举个旅行的例子:
如果要去一个地方,计划先飞机后火车再公交到达目的地。我们买好票,又制定一个行程表,几点几分去哪里坐车都一目了然。
机票和火车票只在特定区间有效,当你换乘不同公司的飞机或不同区间的火车时,还要重新购票。
每张票,只能在特定的区间内移动,就如同通信网络上的数据链路。
而这个区间内的出发地点和目的地点就图同一个数据链路的原地址和目标地址等首部信息。
整个过程的行程表的作用就相当于网络层。
如果只有行程表,没有车票,就无法达成交通工具到达目的地。反之,如果只有车票,而不知道坐什么车,在哪换乘,恐怕也很难到达目的地。
与之类似,计算机网络中也需要数据链路层和网络层才能实现向最终目标地址的通信。
IP基础知识
IP大致分为三大作用模块,它们是IP寻址、路由(最终节点为止的转发)以及IP分包与组包。
IP属于面向无连接
- 为了简化
- 为了提速
IP地址
为了识别通信终端,数据链路有MAC地址,网络层有IP地址。
IP地址用于在"连接到网络中的所有主机中识别出进行通信的目标地址"。
IP地址(IPv4地址)由32位正整数来表示。
IP地址有"网络标识(网络地址)"和"主机标识(主机地址)"两部分组成。
相互连接的不同段,以不同的网络标识来区别,在同一个段内,以不同的主机地址来区别。
由此,可以保证相互连接的整个网络中的每台主机的IP地址都不会重叠。
IP地址分类
IP地址分为四个级别,分别为A类、B类、C类和D类。分类的依据是IP地址的前四位:
A类IP地址是第一位为“0”的地址。A类IP地址的前8位是网络标识,用十进制标识的话0.0.0.0-127.0.0.0是A类IP地址的理论范围。另外我们还可以得知,A类IP地址最多只有128个(实际上是126个,下文不赘述),每个网段内主机上限为2的24次方,也就是16,777,214个。
B类IP地址是前两位为“10“的地址。B类IP地址的前16位是网络标识,用十进制标识的话128.0.0.0-191.255.0.0是B类IP地址的范围。B类IP地址的主机标记长度为16位,因此一个网段内可容纳主机地址上限为65534个。
C类IP地址是前三位为“110”的地址。C类IP地址的前24位是网络标识,用十进制标识的话192.0.0.0-223.255.255.0是C类IP地址的范围。C类地址的后8位是主机标识,共容纳254个主机地址。
D类IP地址是前四位为“1110”的地址。D类IP地址的网络标识长32位,没有主机标识,因此常用于多播。
子网掩码
IP地址总长度32位,它能表示的主机数量有限,大约在43亿左右。而IP地址分类更是造成了极大的浪费,A、B类地址一共也就一万多个,而世界上包含主机数量超过254的网段显然不止这么点。
我们知道IP地址分类的本质是区分网络标识和主机标识,另一种更加灵活、细粒度的区分方法是使用子网掩码。使用原A,B,C,D类等分类中的主机地址部分用作子网地址,可以将原网络分为多个物理网络的一种机制。
子网是指一个ip地址上生成的逻辑网络,它可以让一个网络地址跨越多个物理网络,即一个网络地址代表多个网络(很明显这样做可以节省ip地址)。呵呵,听起来是不是很蹊跷?一个网络就这样被莫名其妙的划分成了许多子网?那么这样做有什么用呢?
我举个例子来跟你说吧:比如你是某个学校的网管,你的学校有四个处于不同物理位置的网络教室,每个网络教室25台机器,你的任务是给这些机器配置ip地址和子网掩码。你可能会觉得这再简单不过了,申请4个C类地址,每个教室一个,然后在一一配置不就搞定了。嗯,这样做理论上没错,但你有没有想到这样做很浪费,你一共浪费了(254-25)*4=916个ip地址,如果所有的网管都像你这样做,那么internet上的ip地址将会在极短的时间内枯竭,显然,你是不能这样做,你应该做子网划分。
子网划分说白了是这样一个事情:因为在划分了子网后,ip地址的网络号是不变的,因此在局域网外部看来,这里仍然只存在一个网络,即网络号所代表的那个网络;但在网络内部却是另外一个景象,因为我们每个子网的子网号是不同的,当用化分子网后的ip地址与子网掩码(注意,这里指的子网掩码已经不是缺省子网掩码了,而是自定义子网掩码,是管理员在经过计算后得出的)做'与'运算时,每个子网将得到不同的子网地址,从而实现了对网络的划分(得到了不同的地址,当然就能区别出各个子网了,有趣吧)。
子网编址技术,即子网划分将会有助于以下问题的解决:
1)巨大的网络地址管理耗费:如果你是一个A类网络的管理员,你一定会为管理数量庞大的主机而头痛的;
2)路由器中的选路表的急剧膨胀:当路由器与其他路由器交换选路表时,互联网的负载是很高的,所需的计算量也很高;
3)IP地址空间有限并终将枯竭:这是一个至关重要的问题,高速发展的internet,使原来的编址方法不能适应,而一些ip地址却不能被充分的利用,造成了浪费。
因此,在配置局域网或其他网络时,根据需要划分子网是很重要的,有时也是必要的。现在,子网编址技术已经被绝大多数局域网所使用。
子网掩码长度也是32位,由一段连续的1和一段连续的0组成。1的长度就表示网络标识的长度。以IP地址172.20.100.52为例,它本来是一个B类IP地址(前16位是网络标识),但通过子网掩码,它可以是前26为为网络标识的IP地址:
路由控制
互联网是由路由器连接的网络组合而成的。为了能让数据包正确的到达目标主机,路由器必须在途中进行正确的转发。
这种"正确的方向"转发数据所进行的处理就叫做路由控制或路由。
路由控制是指将分组数据发送到最终目标地址的功能。
"跳"指网络的一个区间。IP包正是在网络中一个跳间被转发。因此IP路由也叫做多跳路由。在每一个区间内决定着包在下一条被转发的路径。
路由器是根据由控制表转发数据包。它根据所收到的数据包中目标主机的IP地址与路由控制表的比较得出下一个应该接收的路由器。
为了将数据包发给目标主机,所有主机都维护者一张路由控制表。 该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。
路由控制分为静态和动态两种类型。
静态:通常是由使用者手工操作完成的,是指事先设置好路由器和主机中并将路由信息固定的一种方法。
动态:让管理者设置好的路由协议在运行过程中自动的设置路由控制信息的一种方法。
IP分割处理
IP是实现多个数据链路之间通信的协议。
但是不同的数据链路,它们各自的最大传输单位不同。
为了解决这个问题,IP进行分片处理。将较大的IP包分成多个较小的IP包。分片的包到达了对端目标地址以后会再备注合起来传给上一层。经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片,但不会进行重组。
路径MTU发现
分片会加重路由器的负担,因此只要条件允许,我们都不希望路由器对IP数据包进行分片处理。另外,如果一个分片丢失,整个IP数据报都会作废。
解决以上问题的技术是“路径MTU发现”。主机会首先获取整个路径中所有数据链路的最小MTU,并按照整个大小将数据分片。因此传输过程中的任何一个路由器都不用进行分片工作。
为了找到路径MTU,主机首先发送整个数据包,并将IP首部的禁止分片标志设为1.这样路由器在遇到需要分片才能处理的包时不会分片,而是直接丢弃数据并通过ICMP协议将整个不可达的消息发回给主机。
主机将ICMP通知中的MTU设置为当前MTU,根据整个MTU对数据进行分片处理。如此反复下去,直到不再收到ICMP通知,此时的MTU就是路径MTU。
以UDP协议发送数据为例:
IPv4首部
通过IP进行通信是,需要在数据的前面加入IP首部信息。IP首部中包含着用于IP协议进行发包控制时所有的必要信息。所以,为了对IP所提供的功能有一个详细的把握,还是有必要了解下IP首部的结构的。
其中几个重要的部分介绍如下:
总长度(Total Length):表示IP首部与数据部分总的字节数,该段长16比特,所以IP包的最大长度为65535字节(2^16)。虽然不同数据链路的MTU不同,但是IP协议屏蔽了这些区别,通过自己实现的数据分片功能,从上层的角度来看,IP协议总是能够以65535为最大包长进行传输。
标识(ID:Identification):用于分片重组。属于同一个分片的帧的ID相同。但即使ID相同,如果目标地址、源地址、上层协议中有任何一个不同,都被认为不属于同一个分片。
标志(Flags):由于分片重组,由三个比特构成。
第一个比特未使用,目前必须是0。
第二个比特表示是否进行分片,0表示可以分片,1表示不能分片。在路径MTU发现技术中就用到了这个位。
第三个比特表示在分片时,是否表示最后一个包。1表示不是最后一个包,0表示分配中最后一个包。
片偏移(FO: Fragment Offset):由13比特组成,表示被分片的段相对于原始数据的位置。它可以表示8192(2^13)个位置,单位为8字节,所以最大可以表示8 x 8192 = 65536字节的偏移量。
生存时间(TTL: Time To Live):表示包可以经过多少个路由器的中转。每经过一个路由器,TTL减1。这样可以避免前文提到的无限传递包的问题。
协议: 表示IP首部的下一个首部属于哪个协议。比如TCP协议的编号为6,UDP编号为17.
首部校验和:用于检查IP首部是否损坏
源地址:由32比特构成(4个字节),表示发送端IP地址。
目标地址:由32比特构成(4个字节),表示接收端IP地址。
可选项:仅在试验或诊断时用,可以没有。如果有,需要配合填充(Padding)占满32比特。
IPv6
IPv6是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。IPv4地址长度32比特,而IPv6地址长度128比特,一般写成8个16位字节。
IPv6特点
- IP地址的扩大与路由控制表的聚合
- 性能提升
- 支持即插即用功能
- 采用认证与加密功能
- 多播、Mobile IP成为拓展功能
IPv6中IP地址的标记方法
一般人们将128比特IP地址以每16比特为一组,每组用冒号(":")隔开进行标记。而且如果出现连续的0时还可以将这些0省略掉,并用冷儿冒号("::")隔开。但是一个IP地址中只允许出现一次两个连续的冒号。
在互联网通信中,使用一种全局的单播地址。他是互联万中唯一的一个地址,不需要正式分配IP地址。