IP协议(网际协议)

前言

位于网络层中的IP协议主要负责将数据包发送给最终的目标计算机.IP协议主要有三个作用分别是IP寻址,路由以及IP分包与组包。他的主要任务就是”实现终端节点之间的通信”.这种终端节点之间的通信也叫”点对点通信” 。以下会对IP协议进行一个较为详细的总结

为什么要有网络层

因为网络上的数据大多要进行跨网络传输,网络层保证了数据端到端的传输
网络层的下一层是数据链路层,数据链路层的主要作用是在互连同一种数据链路的两个节点之间进行包传递.而一旦跨越多种数据链路,就需要借助网络层.网络层可以跨越不同的数据链路.即使是在不同的数据链路上也能实现两端节点之间的数据包传输

网络层和数据链路层的关系

数据链路层提供直连两个设备之间的通信功能.与之相比,作为网络层的IP则负责在没有两个直连的两个网络之间进行通信传输.

举个例子:
假如有一个人想要去一个很远的地方旅行.由于目标地很远,可能要先乘坐飞机,再乘坐火车,最后还要坐一段路的汽车才能够到达他想要去的地方.于是,为了方便,他直接报了一个旅行社.

旅行社看到了他想去的地方之后,专门为他制定了一套行程表.并且预定好了所有的机票,火车票,车票,详细到某天某时在哪里乘坐哪个交通工具,最终,这个老哥拿着所有的票按照乘车的时间最终到达了他想要到达的地方

分析上述过程:
不论是飞机票,火车票还是汽车票都有一个特点,那就是他们都是从一个固定的地点行驶到另一个固定的地点,这个区间都是被计划好的. 这个区间就如同通信网络上的数据链路.而这个区间的出发地和目的地就如同某一个数据链路的源地址和目标地址等首部信息.而整个过程的行程表就相当于网络层.他规划了整个数据的传输线路,而链路层负责点到点的传输

如果只有行程表而没有车票,就无法搭乘交通工具到达目的地;如果只有车票而没有行程表,那压根就不知道要去哪里搭乘交通工具.与之类似,在计算机网络中只有网络层和数据链路相互配合,才能够实现向最终目标地址的通信

IP基础知识点

IP地址属于网络层

在数据链路层当中,MAC地址标识唯一的一台主机.
作为网络层中的IP,也有这种地址信息.一般叫做IP地址.IP地址用于在”连接到网络中的所有主机中识别出进行通信的目标地址”.因此,在TCP/IP通信中所有主机或路由器都必须设定自己的IP地址

路由控制

路由控制是指将分组数据发送到最终目标地址的功能。即使传输的数据从一端到达一端非常的远,中间的网络情况特别的复杂,也是可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能“迷失”,无法到达目标地址。因此,一个数据包能否成功的到达最终的目标地址,全靠路由控制

网络传输中的“跳”指什么?
跳的英文称为Hop,它是指网络中的一个区间。IP包正是在一个个跳间进行传送,最终到达目标主机的,在每一个区间内决定下一跳被转发的路径
那么一跳的区间到底是哪个区间?
一跳的范围是指利用数据链路层及以下分层的功能传输数据帧的一个区间。
简单点说,在数据链路层上两台主机点到点的一个传输区间就称为一跳。
以太网等数据链路中使用MAC地址传输数据帧。此时的一跳是指从源MAC地址到目标MAC地址之间传输帧的区间。也就是说他是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。在每一跳的同时会指定好吓一跳的目的地
多跳路由
在网络层的数据路由中,一般都采用多跳路由的方式。多跳路由是指路由器或主机再转发IP数据包的时候不会直接将到达最终目的地址所要经过的路由全部指定出来,而是每一个经过的路由只指定下一个路由器或者主机的地址,直至包到达最终目标地址。
拿路由举个栗子: 假如现在某人要坐车从A(源地址)去D(目标地址),但是他不知道路,于是他问了地铁乘务员他该怎么走。此时地铁乘务员告诉他先坐车去B然后在问人怎么走,于是他先坐车来到了B,然后他又问工作人员,工作人员说要想去D现在要从B坐车到C,于是他又来到了C,继续询问得知,从C可以直接坐车到D。 这个过程就是一个多跳路由的过程。即每一个主机或路由不会直接指出全部的路由路径,而是每一个路由器都会告诉下一跳的位置在哪
路由控制表
路由控制表中记录了IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输

数据链路的抽象化

IP是实现多个数据链路之间通信的协议。数据链路根据种类的不同各有特点。对这些不同数据链路的相异特性进行抽象化也是IP的重要作用之一。

数据链路的地址可以被抽象为IP地址。因此,对IP上一层来说,不论底层是以太网还是无线LAN或其他的,都被一视同仁。

不同数据链路有个最大的区别,就是他们各自要求的最大传输单位(MTU)不同。就好像在寄快递时包裹的大小有所限制一样。如:以太网中MTU=1500字节,在FDDI中是4352字节。而IP的上层所传输来到数据很有可能会大于MTU

因此IP要对数据包进行分片处理,在数据链路上传输比MTU小的数据包。所谓分片处理,是指将大的IP包分为多个较小的IP包。分片的包到了对端目标地址以后会在被组合起来传给上一层。所以从IP的上层来看,他完全可以忽略数据包在途中的各个数据链路上的MTU,而只需要按照源地址发送的长度就收数据包。IP就是以这种方式抽象数据链路使得上层不需要关心不同数据链路中的数据传输问题

广播地址

在同一个数据链路中,发送的消息可以被所有在此链路上的主机都接收到的主机称为广播,他的地址叫做广播地址

广播地址的主机号全部为1

广播地址分为两类: 本地广播直接广播
本地广播
在本网络内的广播叫做本地广播。例如网络地址为192.168.0.0/24的情况下,广播地址为192.168.0.255。这个广播地址的IP包会被路由器屏蔽,所以不会到达192.168.0.0/24以外的其他链路上
直接广播
在不同网络之间的广播叫做直接广播。例如网络地址为192.168.0.0/24的主机向192.168.1.255/24的目标地址发送IP包。收到这个包的路由器,将数据转发给192.168.1.0/24,从而使得所有192.168.1.1~192.168.1.254的主机都能收到这个

路由控制

发送数据包时所使用的地址是网络地址,也就是IP地址。然而,仅仅知道目标主机的IP地址还是远远不够的,因为上面说过了数据包的传输是经过多跳最终到达目标主机的。所以在数据的发送过程中还需要类似于指明“路由器或主机”的信息。即在经过每一跳的时候需要知道下一跳要去哪里。而用来保存这种信息的便是路由控制表。实现IP的所有主机和路由器都必须要有这样的一张表。也正是在这个表的基础上才能保证数据的正确传输
路由控制表的形成有两种方式: 一种称为静态路由控制,是由管理员手动设置的;另一种称为动态路由控制,是由路由器与其他路由器相互交换信息的时候自动刷新的 ,为了让动态路由及时刷新路由表,在互联网上互联的路由器之间必须设置好路由协议,保证正常读取路由控制信息

IP地址与路由控制

IP地址的网络地址部分用于进行路由控制
路由表图例:
image
如上图所示,路由表中记录着网络地址与下一步应该发送至路由器的地址。在发送IP包的时候,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该目标地址具有相同网络地址的记录,然后根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条与目标网络相同的网络地址的记录,就找出最吻合的一条进行匹配,所谓最吻合是指相同位数最多的意思
例子: 172.20.100.52的网络地址与172.20/16和172.20.100/24两项都匹配,此时应该选择匹配长度较多的172.20.100/24 。此外,如果下一个路由器的位置记录的是某个主机或路由器网卡的IP地址,那就意味着“发送的目标地址属于同一个链路”

IP分割处理与再重组

数据链路不同,MTU相异
前面说过,不同数据链路的MTU值各不相同,IP包在封装为数据帧传输的时候必须小于MTU。之所以不同链路的MTU值不同,是因为不同的数据链路使用的目各不相同。使用目的不同,承载的MTU也就不同。鉴于IP属于数据链路的上一层,他必须受限于不同的MTU,所以说,IP抽象了数据链路层。

IP报文的分片与重组
当网络层发送数据的时候,当所发的报文大于MTU,无法一次性发送的时候,就需要进行报文的分片。
以以太网为例: 以太网默认的MTU是1500字节,当需要发送一个4342字节的报文时,无法在一个帧中一次性全部发送,这时,路由器便把该报文划分为三个分片进行发送。而这种分片处理只要路由器觉得有必要就会一直进行。
经过分片之后的IP数据报在被重组的时候,只能由目标主机进行重组,路由器虽然做分片但是并不会进行重组
之所以这样规定路由器的分片功能是因为数据在传输的过程中路径是不确定的,因此被分片的报文可能走多条不同的路径,这样如果想要在某一个路由器进行重组,很有可能等不到所有的报文;另外,每一个路由器都有分片的功能和义务,所以如果在路由器上进行重组,便很有可能又要在下一个路由器上进行分片,这样就给路由器增加了不必要的压力 。所以规定,分片一般都在目标主机上进行重组

路径MTU发现
上述的分片机制,在现在大流量,高传输的网络中已经不再适用,这种分片机制会给路由器增加很大的负荷。而现在的路由器不光进行路由,还要对网络过滤等安全性时间进行处理,所以,只要允许,是不希望由路由器进行IP数据包的分片处理的
其次,在早期,TCP的设计初期还曾使用过更小的分片进行传输。其结果是网路的利用率大大下降
为了解决上述问题,产生了一种新的技术“路径MTU发现” 。所谓“路径MTU发现”是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小。即路径中存在的所有数据链路中最小的MTU。
这种路径MTU发现的方式会在主机端直接将报文按照路径中最小MTU值将数据报进行分片后进行发送,这样就可以避免在中途的路由器中再次进行分片处理,也可以在TCP中发送更大的包。现在很多操作系统都实现了这种功能
工作原理:
首先在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1。根据这个标志位,途中的路由器即使遇到需要分片才能处理的大片数据,他也不会进行分片,而是将包抛弃。随后,通过一个ICMP的不可达消息将数据链路上MTU的值给发送主机
下一次,在给同一个主机发送数据报时,可以从之前该主机路由线路上返回的ICMP值的大小来作为当前MTU的值。发送主机根据这个MTU的值将数据报进行分片处理。如此反复,直到在没有ICMP返回,就认为最后一次的ICMP值是最合适的MTU值。
前面是UDP的例子。在TCP的情况下,根据路径MTU的大小计算出最大段长度(MSS),然后再根据最大段长度进行数据包的发送。因此,在TCP中使用路径MTU发现,则在IP层不再进行分片

IPv4首部

image
4位版本号 : 指定IP协议的版本,对于IPv4来说就是4
4位首部长度 : 表示IP报头的大小。四位首部长度的单位是32bit,即四字节。也就是说四位首部长度能表示的最大报头大小是
16(1111)x 4字节=60字节
8位服务类型 : 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位
TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于
ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
16位总长度 : IP数据包整体占多少个字节(包括数据部分)
16位标识 :唯一的标识主机发送的报文。如果IP报文在被分片了。那么每一片中的这个标识都是相同的。该字段常常用来进行分片的重组
3位标志字段 :第一位保留(即现在不用,以后可能会在规定该字段的作用);第二位置为1时,表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文;第三位表示更多分片,如果分片了,最后一片置为1,其他置为0,类似于一个结束标记
13位片偏移 : 是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中的位置。实际偏移的字节数是这个值*8得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
8位生存时间: 数据报到达最终目的主机的总跳数,一般这个值的大小为64,没经过一个路由就-1,如果减到0还没有到达,那么就丢弃了。这个字段主要用来防止路由循环
8位协议: 表示上层协议的类型
16位首部检验和 : 使用CRC进行校验,来鉴别头部是否损坏
32位源地址和32位目标地址 : 用来表示发送端或接收端

IP协议其他相关技术补充

DNS域名解析协议 : 可以将域名解析为Ip地址的技术
ARP协议:将IP地址转换为MAC地址,用于数据链路层的传输。他是一种解决地址问题的协议,可以以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一数据链路上时,可以通过ARP查找下一跳路由器的MAC地址。不过ARP只适用于IPv4,不能用于IPv6。
ICMP:用于返回网络状态的,例如告知发送端MTU的大小
DHCP:用于给接入网络的主机分配IP
NAT:用于私有IP和共有IP之间的相互转换