IP(Internet Protocol)网际协议,是TCP/IP协议的核心部分,虽然IPV4终将会被IPV6替代,但是目前IPV4仍然是IP协议的主流版本,所以我们重点介绍一下IPV4版本。在学习TCP协议和socket套接字编程的时候我们知道,如果想要在互联网这个共享网络中精确定位到一台主机,那么就一定需要该主机的IP地址。主机是拥有IP地址,但是不能进行路由控制(Routing,意思是中转、分组数据包),路由器(Router)这种设备既有IP地址,又可以进行路由控制;我们可以将接入互联网中的主机和路由器都叫做节点。
举个例子,我们普通人只有自己的地址,如果想要发送快递给朋友或者从别人那接受快递,只能向邮递员提供对方的地址或我们自己的地址,即我们只有地址标识,但是我们不能发送快递;而快递员就像是路由器,他自己也有自己的地址,也可以收到他的私人快递,但是他还可以将用户的快递,根据目的地不同,选择不同的快递线路进行运输。下图可以清楚表达IP协议在网络环境中的作用。
和之前学习TCP、UDP协议一样,先来介绍一下IP协议的首部格式
我们可以发现IP协议首部与TCP协议首部非常相似,如果没有特殊情况,都是20个字节,因此我们也经常会把两者放在一起称为TCP/IP协议。下面将IP协议首部每个字段都详细介绍一下:
MTU(Maximum Transmission Unit最大传输单元)是在IP层下面的MAC协议中的概念,MAC协议我们可以理解为是物理层的一些协议,它位于IP协议的下层,那么在发送数据时相当于是用户数据 + 应用层协议报头(如HTTP请求报头)
作为有效载荷交给传输层(如TCP协议),TCP协议再将TCP报头 + 应用层传来的数据
下交给IP层,IP层再将IP协议首部 + TCP层传来的TCP报文
交付给MAC帧。因此每个MAC帧其实是IP协议首部 + IP层的有效载荷
。而MAC帧是有长度限制的,所以就要求IP数据报向下交付时并不是随心所欲想发多长就发多长,如果MAC帧要求MTU为1500字节,而IP数据包总长度有2000字节,那么就需要分片,将原有的IP数据包分成两片,依次发送,对端的主机在接收后,由对端的IP层再完成组装。我们在Linux环境下可以使用ifconfig
命令查看到MTU。
分片和组装对于上层TCP/UDP和下层的MAC都是透明的,即上层和下层都不知道IP层将数据包进行了分片操作,因此分片和组装操作会由发送方IP层和接收方IP层自动完成。但是分片意味着需要把一份数据变为多组数据传输,并且在对端还需要进行组装,这样会大大降低网络传输效率以及提升错误风险,因此在传输过程中应当尽量避免分片,即尽量不要发送超过MTU长度的IP数据报。
IPV4中我们由32位正整数来表示IP地址,计算机内部会直接以二进制来保存IP地址,不过人并不善于记忆二进制整数,所以我们采用点分十进制来记录IP地址:即将32位IP地址每8位一组,分成4组,组间用’ . '进行分隔,再将每组转换为十进制。
因此我们可以直接算出,在IPV4标准下最多有2 ^ 32 = 4292967296个IP地址,但是能被人们使用的远远不足这个数字。(比如某些IP地址是有特殊作用被预留的,某些设备如路由器会占有多个IP地址)
IP地址由网络标识(网络地址)和主机标识(主机地址)两部分组成。
我们查找到一个IP地址的过程就像是去某个地方旅游一样,例如我们想要去天安门玩,不可能直接坐高铁到达天安门,我们一定是先抵达北京市(目的网络),再通过北京市内的交通抵达天安门(目的主机)。因此我们在路由选择时,应该先找到目标主机所在的局域网,再在该局域网中找到目标主机。这种方式可以快速帮我们定位到目标局域网,在局域网内搜索目标主机就比在茫茫的网络中找一台主机要快速多了。
网络号:保证互相连接的两个网段具有不同的标识。
主机号:保证在同一个网段中,两台主机具有不同的标识。
IP地址划分为五个级别,分别为A类、B类、C类、D类和E类(一直没有使用过),所以目前我们所能见到的IP地址只有A、B、C、D四类。划分的依据就是IP地址从第1位到第4位的比特位。
在不考虑E类IP地址的时候,我们可以发现,A、B、C、D类地址的网络号所占比特位逐渐增加,而主机号所占的比特位在逐渐减少。这就意味着上述四类地址中,一类地址中的子网数量越来越多,但是子网中可以连接的主机变得越来越少。以国内一所普通高校为例,全校师生大约3万人,如果每个人都有一台笔记本电脑需要连接到校园局域网中,有些同学还会有一些平板电脑等其他需要连接网络的终端设备,那么在申请网络时就应该以5~6万个IP地址去申请,如果使用A类地址,那么主机号24位会产生2 ^ 24 = 16777216个IP地址,远远超过实际所需要的,如果使用C类地址,则只有2 ^ 8 = 256个IP地址,远少于所需IP地址,所以最合适的是B类地址,有2 ^ 16 = 65536个IP地址。这个例子也告诉我们,IP地址不能太多,会造成大量浪费;也不能太少,否则很多设备会无法连接网络。
随着Internet的发展,使用前四位是否为1来分类的方案弊端开始显现:那就是很多子网的申请者都会去申请B类网络地址,因为A类根本用不完,而C类不够用。导致B类的网络地址很快就被分配完了。而申请了A类的网络又会浪费大量的IP地址,在这种情况下,人们提出了新的划分方案:CIDR(Classless Interdomain Routing无类型域间选路)
&
操作,所得结果就是网络号举两个例子帮助理解通过子网掩码来划分网络号和主机号
IP地址 | 二进制表达 |
---|---|
140.252.20.68 | 1000 1100 1111 1100 0001 0100 0100 0100 |
子网掩码 | 二进制表达 |
---|---|
255.255.255.0 | 1111 1111 1111 1111 1111 1111 0000 0000 |
将IP地址与子网掩码进行按位与操作后得到1000 1100 1111 1100 0001 0100 0000 0000
,再转化为方便人们使用的点分十进制为140.252.20.0
,这就是该子网的网络号了。并且它的子网掩码末尾的8个比特位为0,这个子网可以表示2 ^ 8 = 256台主机,因此这个子网的地址范围是140.252.20.0 ~ 140.252.20.255
IP地址 | 二进制表达 |
---|---|
140. 252. 20. 68 | 1000 1100 1111 1100 0001 0100 0100 0100 |
子网掩码 | 二进制表达 |
---|---|
255.255.255.240 | 1111 1111 1111 1111 1111 1111 1111 0000 |
将IP地址与子网掩码进行按位与操作后得到1000 1100 1111 1100 0001 0110 0100 0000
,即该子网的网络号,同样转换成常用的点分十进制为140.252.20.64
,它的子网掩码末尾的4个比特位为0,这个子网可以表示2 ^ 4 = 16台主机,因此这个子网的地址范围就是140.252.20.64 ~ 140.252.20.79
假如某个大学要在校园内部组建一个局域网,只实现校园内部的网络通信而不与外界任何一台机器进行通信,那么理论上2 ^ 32个IP地址都可以使用,因为只在这个局域网中,不会出现相同的IP地址。不过RFC1918规定了组建局域网的私有IP地址的规范:
上述范围内的IP地址都是私有IP,不在上述范围内的IP则为全局IP地址(公网IP地址)。