IP协议详解

IP协议详解

IP协议简述

IP(Internet Protocol)网际协议,是TCP/IP协议的核心部分,虽然IPV4终将会被IPV6替代,但是目前IPV4仍然是IP协议的主流版本,所以我们重点介绍一下IPV4版本。在学习TCP协议和socket套接字编程的时候我们知道,如果想要在互联网这个共享网络中精确定位到一台主机,那么就一定需要该主机的IP地址。主机是拥有IP地址,但是不能进行路由控制(Routing,意思是中转、分组数据包),路由器(Router)这种设备既有IP地址,又可以进行路由控制;我们可以将接入互联网中的主机和路由器都叫做节点。

举个例子,我们普通人只有自己的地址,如果想要发送快递给朋友或者从别人那接受快递,只能向邮递员提供对方的地址或我们自己的地址,即我们只有地址标识,但是我们不能发送快递;而快递员就像是路由器,他自己也有自己的地址,也可以收到他的私人快递,但是他还可以将用户的快递,根据目的地不同,选择不同的快递线路进行运输。下图可以清楚表达IP协议在网络环境中的作用。

IP协议详解_第1张图片

IP协议首部格式(IPV4)

和之前学习TCP、UDP协议一样,先来介绍一下IP协议的首部格式

IP协议详解_第2张图片

我们可以发现IP协议首部与TCP协议首部非常相似,如果没有特殊情况,都是20个字节,因此我们也经常会把两者放在一起称为TCP/IP协议。下面将IP协议首部每个字段都详细介绍一下:

  • 4位版本号(Version):用来指定IP协议的版本,IPV4的版本号就是4,如果这个IP报文是IPV4版本,那么这个字段的值就是4,用4位来标识就是0100。IPV6的版本号则是6。
  • 4位首部长度(Internet Header Length):表明IP首部的大小,单位是4个字节,length * 4的字节数,因为这一字段共4个比特位,所以这一字段最大值为2 ^ 4 - 1即15,所以IP首部最大长度为15 * 4即60字节;在默认情况下,该字段被设置为5,所以默认IP首部20字节。
  • 8位服务类型(Type Of Service):前三位表示优先度(已经弃用),第4位表示最低延迟、第5位表示最大吞吐、第6位表示最大可靠性、第7位表示最小代价,这四位互相冲突,只能选择一个。需要根据不同情况进行选择,如果是SSH/TELNET这类远端登录,那么就应该选择最小延时,如果是FTP类型的程序,则应该选择最大吞吐量;第8位是保留位,目前没有使用,必须填0。
  • 16位总长度(Total Length):表示IP首部和后面携带的数据部分一共有多少个字节。该字段有16个比特位,因此IP数据报整体最大长度为65535个字节。
  • 16位标识(ID):唯一地标识主机发送的报文,如果一份IP报文在数据链路层被分片,那么每一片的该字段应该都是相同值。帮助对端主机在接收后进行分片重组。
  • 3位标志(Flag):第一位保留(保留的意思是现在不使用,未来如果需要的话再使用),必须填0;第二位用来指明是否可以分片,如果为0则可以分片,如果为1则不能分片,假如一个IP报文禁止分片且长度还大于了MTU(Maximum Transmission Unit最大传输单元,后面详细介绍),则该本文只能被丢弃;如果报文被分片,第三位为1表示它是分片中段的报文,即后续还有分片报文,如果第三位为0则表示这是最后一片。
  • 13位片偏移(Fragment Offset):该字段表示分片相对于原始IP报文开始处的偏移量,其实就是表示当前分片在原报文中所处的位置,第一个分片对应值为0。由于该字段总共13个比特位,因此最多可以表示2 ^ 13即8192个相对位置。单位为8字节,所以最大可以表示8192 * 8 = 65536个字节的位置。
  • 8位生存时间(Time To Live):数据报到达目的地的最大报文跳数(Hop,指网络中一个区间,IP数据包正是在网络中一个跳间被转发),一般为64,每次经过一个路由,TTL–,如果TTL == 0时还没到达目的地,那么这个报文就会被丢弃。这个字段主要是为了防止出现路由循环,数据包在一个循环中一直转发,浪费网络资源。
  • 8位协议(Protocol):表示IP的上层是什么协议,我们熟知的TCP、UDP、ICMP等都是在IP上层的。
  • 16位首部校验和(Header Checksum):使用CRC进行校验,鉴别IP首部是否收到损坏,如果损坏直接丢弃,它只校验IP头部,不校验下面的内容,因为内容部分的校验是上层传输层(TCP)需要考虑的,IP协议只要发现首部有问题就直接丢弃该报文。
  • 32位源IP地址(Source Address):表示发送端的IP。
  • 32位目的IP地址(Destination Address):表示接收端的IP。
  • 选项字段(Options):不定长,最大可以到40个字节。
补充:分片与组装

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。

IP协议详解_第3张图片

分片和组装对于上层TCP/UDP和下层的MAC都是透明的,即上层和下层都不知道IP层将数据包进行了分片操作,因此分片和组装操作会由发送方IP层和接收方IP层自动完成。但是分片意味着需要把一份数据变为多组数据传输,并且在对端还需要进行组装,这样会大大降低网络传输效率以及提升错误风险,因此在传输过程中应当尽量避免分片,即尽量不要发送超过MTU长度的IP数据报。

IP地址

IP地址的定义:

IPV4中我们由32位正整数来表示IP地址,计算机内部会直接以二进制来保存IP地址,不过人并不善于记忆二进制整数,所以我们采用点分十进制来记录IP地址:即将32位IP地址每8位一组,分成4组,组间用’ . '进行分隔,再将每组转换为十进制。

因此我们可以直接算出,在IPV4标准下最多有2 ^ 32 = 4292967296个IP地址,但是能被人们使用的远远不足这个数字。(比如某些IP地址是有特殊作用被预留的,某些设备如路由器会占有多个IP地址)

IP地址的组成:

IP地址由网络标识(网络地址)和主机标识(主机地址)两部分组成

我们查找到一个IP地址的过程就像是去某个地方旅游一样,例如我们想要去天安门玩,不可能直接坐高铁到达天安门,我们一定是先抵达北京市(目的网络),再通过北京市内的交通抵达天安门(目的主机)。因此我们在路由选择时,应该先找到目标主机所在的局域网,再在该局域网中找到目标主机。这种方式可以快速帮我们定位到目标局域网,在局域网内搜索目标主机就比在茫茫的网络中找一台主机要快速多了。

网络号:保证互相连接的两个网段具有不同的标识。

主机号:保证在同一个网段中,两台主机具有不同的标识。

IP地址的划分:

IP地址划分为五个级别,分别为A类、B类、C类、D类和E类(一直没有使用过),所以目前我们所能见到的IP地址只有A、B、C、D四类。划分的依据就是IP地址从第1位到第4位的比特位。

IP协议详解_第4张图片

  • A类地址:0.0.0.0 ~ 127.255.255.255
  • B类地址:128.0.0.0 ~ 191.255.255.255
  • C类地址:192.0.0.0 ~ 223.255.255.255
  • D类地址:224.0.0.0 ~ 239.255.255.255
  • E类地址:240.0.0.0 ~ 247.255.255.255

在不考虑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无类型域间选路)

  • 引入子网掩码来区分网络号和主机号
  • 子网掩码也是一个32位的正整数,但结尾通常是一串0
  • 将IP地址与子网掩码进行&操作,所得结果就是网络号
  • 网络号和主机号的划分就与这个IP地址是A类、B类还是C类无关了

举两个例子帮助理解通过子网掩码来划分网络号和主机号

例一:
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

一些特殊的IP地址

  • 将IP地址中的主机地址全设置为0,即该局域网的网络号,这个IP地址代表这个局域网。
  • 将IP地址中的主机地址全设置为1,可以变成广播地址,这个广播地址可以给同一个链路中互相连接的所有主机发送数据包
  • 127.*的IP地址用于本地环回测试,通常是127.0.0.1

私有IP地址和公网IP地址

假如某个大学要在校园内部组建一个局域网,只实现校园内部的网络通信而不与外界任何一台机器进行通信,那么理论上2 ^ 32个IP地址都可以使用,因为只在这个局域网中,不会出现相同的IP地址。不过RFC1918规定了组建局域网的私有IP地址的规范:

  • 10.* 前8位是网络号,共有16,777,216个地址
  • 172.16.*~172.31.* 前12位是网络号,共有1,048,576个地址
  • 192.168.* 前16位是网络号,共有65,536个地址

上述范围内的IP地址都是私有IP,不在上述范围内的IP则为全局IP地址(公网IP地址)。

你可能感兴趣的:(计算机网络笔记,tcp/ip)