【TCP/IP网络协议】(三)IP网络协议

IP网际协议

IP协议位于网络层,它是TCP/IP协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP协议提供的是不可靠、无连接的数据报传送服务。

  • 不可靠:IP协议不能保证数据报能成功地到达目的地,它仅提供传输服务。当发生某种错误时,IP协议会丢弃该数据报。传输的可靠性由上层协议来提供。
  • 无连接:IP协议对每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果发送方向接收方发送了两个连续的数据报(先是A,然后是B),每个数据报可以选择不同的路线,因此B可能在A到达之前先达到。

一、IP数据报

首先看一下IP数据报的格式,其中没有一个字段是多余的。
【TCP/IP网络协议】(三)IP网络协议
如上图所示,普通的IP数据报的报头长度20字节(除非有选项字段),各部分的作用:

  • 版本号:4位,用于标明IP版本号,0100表示IPv4,0110表示IPv6。目前常见的是IPv4;
  • 首部长度:4位,表示IP报头长度,包括选项字段;
  • 服务类型(TOS): 分别由:最小时延、最大吞吐量、最大可靠性、最小花费4种服务,4个标识位只能有一个被置为1;
  • 总长度: 16位,报头长度加上数据部分长度,便是数据报的总长度。IP数据报最长可达65535字节;
  • 标识:16位,接收方根据分片中的标识字段相不相同来判断这些分片是不是同一个数据报的分片,从而进行分片的重组,通常每发送一份报文它的值就会加1;
  • 标志:3位,用于标识数据报是否分片。其中的第2位是不分段(DF)位。当DF位被设置为1时,则不对数据报进行分段处理;第3位是分段(MF)位,除了最后一个分段的MF位被设置为0外,其他的分段的MF位均设置为1;
  • 偏移:13位,在接收方进行数据报重组时用来标识分片的顺序;
  • 生存时间(TTL):8位,用于设置数据报可以经过的最多的路由器个数。TTL的初始值由源主机设置(通常为32或64),每经过一个处理它的路由器,TTL值减1.如果一个数据报的TTL值被减至0,它将被丢弃。
  • 协议:8位,用来标识是哪个协议向IP传送数据。ICMP--1; IGMP--2; TCP--6; UDP--17; GRE--47; ESP--50
  • 首部校验和:根据IP首部计算的校验和码;
  • 源IP和目的IP:数据报头还会包含该数据报的发送方IP和接收方IP;
  • 选项:是数据报中的一个可变长、可选的信息,不常用,多用于安全、军事等领域。

例:用tcpdump抓包工具实际看一下
sudo tcpdump -ntx -c 1

-n :显示 IP 地址而非域名地址
-t :不显示时间戳
-x :以十六进制显示包内内容
-c :tcpdump 将在接受到几个数据包后退出

【TCP/IP网络协议】(三)IP网络协议
首先看到开头的 192.168.42.5.5901 > 192.168.42.2.39512代表的是源 ip 为 192.168.42.5,端口 5901,目的 ip 为 192.168.42.2,端口 39512

然后看到0x0000 那行:

  • 协议版本: 0x4表示的是协议版本为 IPv4
  • 首部长度: 0x5 ,5*4=20,表示 IP 报头长度为 20 字节。一个字节通常等于 8 位,所以这里可以知道 IP 报头为 4500 到 2a02。
  • TOS 服务类型:0x00,意味着是一般服务。
  • 总长度:0x331c,换算下来为 13084 字节。
  • 标识:0xb6ac
  • 3bit 标志 + 13bit 片偏移:0x4000
  • 生存时间:0x40,值为 64
  • 协议:0x06,代表 TCP 协议
  • 首部校验和:0x7bd7
    其他信息可依次类推。

二、IP地址分类

为了便于寻址以及层次化构造网络,每个IP地址可被看做是分为两部分,即网络号主机号。同一个区域的所有主机有相同的网络号(即IP地址的前半部分相同),区域内的每个主机(包括路由器)都有一个主机号与其对应。

IP地址被分为A、B、C、D、E五类:

  • A类给大型网络或*机构等;
  • B类分配给中型网络、跨国企业等;
  • C类分配给小型网络;
  • D类用于多播;
  • E类用于实验。

各类可容纳的地址数目不同,其中我们最常见的为A、B、C三类。
IP地址用32位二进制数字表示的时候,A、B、C类IP的网络号长度分别为8位、16位、24位:
【TCP/IP网络协议】(三)IP网络协议

A 类地址

  • A 类地址网络号范围:1.0.0.0—127.0.0.0
  • A 类 IP 地址范围:1.0.0.0—127.255.255.255
  • A 类 IP 的私有地址范围:10.0.0.0—10.255.255.255 (所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)
  • 127.X.X.X 是保留地址,用做循环测试用的
  • 因为主机号有 24 位,所以一个 A 类网络号可以容纳 2^24-2=16777214 个主机号

B 类地址

  • B 类地址网络号范围:128.0.0.0—191.255.0.0
  • B 类 IP 地址范围:128.0.0.0—191.255.255.255
  • B 类 IP 的私有地址范围:172.16.0.0—172.31.255.255
  • 169.254.X.X 是保留地址;191.255.255.255 是广播地址
  • 因为主机号有 16 位,所以一个 B 类网络号可以容纳 2^16-2=65534 个主机号

C 类地址

  • C 类地址网络号范围:192.0.0.0—223.255.255.0
  • C 类 IP 地址范围:192.0.0.0—223.255.255.255
  • C 类 IP 的私有地址范围:192.168.0.0—192.168.255.255
  • 因为主机号有 8 位,所以一个 C 类网络号可以容纳 2^8-2=254 个主机号

三、子网划分

IP地址如果只使用ABCDE类划分,会造成大量的浪费:一个有500台主机的网络,无法使用C类地址。但如果使用一个B类地址,6万多个主机地址只有500个被使用,造成IP地址的大量浪费。
因此,可以在ABC类网络的基础上,进一步划分子网:占用主机号的前几个位,用于表示子网号
这样IP地址就可以看做IP = 网络号 + 子网号 + 主机号
子网号的位数没有硬性规定,于是我们用子网掩码来确定一个IP地址中哪几位是主机号,具体使用方法如图:
【TCP/IP网络协议】(三)IP网络协议
子网掩码中的1标识了IP地址中相应的网络号和子网号,0标识了主机号,将IP地址和子网掩码进行逻辑与运算,结果就能区分网络号和子网号。

四、IP路由选择

如果发送方与接收方直接相连(点对点)或都在一个共享网路上(以太网),那么IP数据报就能直接送达。而大多数情况则是发送方与接收方通过若干个路由器连接,那么数据报就需要经过若干个路由器的转发才能送达,它是怎样选择一个合适的路径呢?

IP层在内存中有一个路由表(输入命令route -n),当收到一份数据报并进行发送时,都要对该表进行搜索:

  • 1、搜索路由表,如果能找到和目的IP地址完全一致的主机,则将IP数据发向该主机;
  • 2、搜索路由表,如果匹配主机失败,则匹配同子网的路由器(这需要子网掩码的协助)。如果找到路由器,则将该IP数据报发向该路由器;
  • 3、搜索路由表,如果匹配同子网路由器失败,则匹配同网络号路由器,如果找到路由器,则将该IP数据报发向该路由器;
  • 4、如果以上都失败了,就搜索默认路由,如果默认路由存在,则发报;
  • 5、如果都失败,就丢掉这个包;
  • 6、接收到数据报的路由器再按照它自己的路由表继续转发,直到数据报被转发到目的主机;
  • 7、如果在转发过程中,IP数据报的TTL(生命周期)已经被减为0,则该IP数据报就被抛弃。

五、NAT技术

当你用ifconfig查看IP地址时,有时你会发现自己的IP地址是192.168.X.X172.16.X.X,这是C类网和B类网的私有地址就是俗称的内网IP。这是因为你的路由器采用了NAT技术。

NAT(网络地址转换)是1994年提出的,当在专用网内部的一些主机本来已经分配到了内网IP地址,但现在又想和因特网上的主机通信时,NAT技术将其内网IP转换成全球IP地址,然后与因特网连接,也就是说,内网的数台主机使用了同一个全球IP地址在上网。

NAT技术实现了宽带共享,而且有助于缓解IP地址空间枯竭的问题。

六、IP的未来

IPv4地址已经在2011年2月3日分配完毕,IPv6的地址长度是128位,通常将这128位的地址按每16位划分为一个段,将每个段转换为十六进制数字,并用冒号隔开。
随着IPv4不足,支持IPv6的网络迅速增长,目前全球已经有5%的网络使用Ipv6.