[面试∙网络] TCP/IP(二):IP协议

IP协议处于OSI参考模型的第三层——网络层,网络层的主要做用是实现终端节点间的通讯。IP协议是网络层的一个重要协议,网络层中还有ARP(获取MAC地址)和ICMP协议(数据发送异常通知)数组

数据链路层的做用在于实现同一种数据链路下的包传递,而网络层则能够实现跨越不一样数据链路的包传递。好比主机A经过Wi-Fi链接到路由器B,路由器B经过以太网链接到路由器C,而路由器C又经过Wi-Fi与主机D保持链接。这时主机A向D发送的数据包就依赖于网络层进行传输。网络

这篇文章主要介绍IP协议的基本知识和IP首部,IP协议能够分为三大做用模块:IP寻址、路由和IP分包。工具

IP地址

IP地址是一种在网络层用于识别通讯对端信息的地址。它有别于数据链路层中的MAC地址,后者用于标识同一链路下不一样的计算机。3d

举一个形象的例子,我要从镇江的家里去沈阳的东北大学,通讯两端的地址分别是家和学校,他们至关于IP地址。然而没有交通工具可让我从家直接去学校,因此我先要打车去火车站,而后坐高铁到沈阳站,再转公交去学校。这三次中转分别属于三种交通方式(数据链路),每一次中转都有起点和终点,他们就至关于MAC地址。每次中转能够称为一跳(Hop)code

IP地址由32位正整数表示,为了直观的表示,咱们把它分红4个部分,每一个部分由8位整数组成,对应十进制的范围就是0-255。cdn

好比172.20.1.1能够表示为:10101100 00010100 00000001 00000001。转换规则很简单,就是分别把四个部分的十进制(0-255)与8位二进制数字进行转换。blog

从功能上看,IP地址由两部分组成:网络标识和主机标识。接口

网络标识用于区分不一样的网段,相同段内的主机必须拥有相同的网络表示,不一样段内的主机不能拥有相同的网络标识。路由

主机标识用于区分同一网段下不一样的主机,它不能在同一网段内重复出现。it

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地址分类的本质是区分网络标识和主机标识,另外一种更加灵活、细粒度的区分方法是使用子网掩码。

子网掩码长度也是32位,由一段连续的1和一段连续的0组成。1的长度就表示网络标识的长度。以IP地址172.20.100.52为例,它原本是一个B类IP地址(前16位是网络标识),但经过子网掩码,它能够是前26为为网络标识的IP地址:

子网掩码

路由控制

路由控制(Routing)是指将分组数据发送到目标地址的功能,这个功能通常由路由器完成。(不要与家里用的小型无线路由器混为一谈)

路由器中保存着路由控制表,它在路由控制表中查找目标IP地址对应的下一个路由器地址。下图描述了这一过程:

路由控制

主机A的地址是10.1.1.30,要把数据发往地址为10.1.2.10的主机。在主机A的路由表中,保存了两个字段,因为目标地址10.1.2.1010.1.1.0/24段不匹配,因此它被发往默认路由10.1.1.1也就是图中路由器1的左侧网卡的IP地址。

路由器1继续在它本身的路由控制表中查找目标地址10.1.2.10,它发现目标地址属于10.1.2.0/24这一段,所以将数据转发至下一个路由器10.1.0.2,也就是路由器2的左侧网卡的地址。

路由器2在本身的路由控制表中查找目标地址10.1.2.10,根据表中记录将数据发往10.1.2.1接口,也就是本身的右侧网卡的IP地址。主机B检查目标IP地址和本身相同,因而接收数据。

路由控制表

路由控制的关键在于路由控制表,路由控制表能够由管理员手动设置,称为静态路由控制,可是估计大部分人没这么干过。这是由于路由器能够喝其余路由器互换信息比即便自动刷新路由表,这个信息交换的协议并无在IP协议中定义,而是由一个叫作“路由协议”的协议管理。

环路

上图中,假设主机A向一个不存在的IP地址发送数据,而且路由器一、二、3设置的默认路由造成了一个循环,那么数据将在网络中不断转发最终致使网络拥堵。这个问题将在下文分析IP首部时获得解决。

IP报文分割重组

在数据链路层中,咱们已经提到过不一样的数据链路有不一样的最大传输单元(MTU)。所以IP协议的一个任务是对数据进行分片和重组。分片由发送端主机和路由器负责,重组由接收端主机负责。

路径MTU发现

分片会加剧路由器的负担,所以只要条件容许,咱们都不但愿路由器对IP数据包进行分片处理。另外,若是一个分片丢失,整个IP数据报都会做废。

解决以上问题的技术是“路径MTU发现”。主机会首先获取整个路径中全部数据链路的最小MTU,并按照整个大小将数据分片。所以传输过程当中的任何一个路由器都不用进行分片工做。

为了找到路径MTU,主机首先发送整个数据包,并将IP首部的禁止分片标志设为1.这样路由器在遇到须要分片才能处理的包时不会分片,而是直接丢弃数据并经过ICMP协议将整个不可达的消息发回给主机。

主机将ICMP通知中的MTU设置为当前MTU,根据整个MTU对数据进行分片处理。如此反复下去,直到再也不收到ICMP通知,此时的MTU就是路径MTU。

以UDP协议发送数据为例:

路径MTU发现

重组

接收端根据IP首部中的标志(Flag)和片偏移(Fragment Offset)进行数据重组。具体内容将在分析IP首部时详细解释。

IP首部(IPv4)

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首部是否损坏

  • 可选项:仅在试验或诊断时用,能够没有。若是有,须要配合填充(Padding)占满32比特。

相关文章
相关标签/搜索