IP协议

基本概念

  • IP协议提供了一种从A主机跨网络将数据传给B主机的能力;
  • 主机:配有IP地址,但是不进行路由控制的设备;
  • 路由器:既配有IP地址,又可以进行路由控制;
  • 节点:主机和路由器的统称

IP协议头格式

IP协议段格式

4位版本号:指定IP协议的版本,对于IPV4来说就是4,IPV6为6

4位首部长度:IP头部的长度是多少个32bit,也就是Lenth*4的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节

8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0).4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要

16位总长度:IP数据报整体占多少个字节

16位标识:唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id是相同的

3位标志字段:占3位,但目前只有两位有意义

  • 标志字段中的最低位记为MF。MF=1即表示后面“还有分片”的数据报。MF=0表示这已经若干数据报片中的最后一个
  • 标志字段中间的一位记为DF,置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文,只有DF=0时才允许分片

13位分片偏移:是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数*8得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整倍数(否则报文就不连续了)

  • 片偏移计算为什么以8字节为单位?

    因为在报头中,IP总长度是16位来表示的,也就是总共可能有2^16个字节数据,但是只有13位片偏移,相差2^3,也就是8位。

8位生存时间:数据报到达目的地的最大报文跳数。一般是64.每次经过一个路由,TTL-=1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环

8位协议:表示上层协议的类型

16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏

32位源地址和32位目标地址:表示发送端和接收端

选项字段(不定长,最多40字节)

网段划分

​ 在根据TCP/IP协议进行通信时,要用IP地址来标识主机或路由器。在IPv4中,IP地址是一个32位的整数。所以最多可以表示的数字IP地址是:2^32(大约是43亿)。

​ IP地址由网络号和主机号两部分来标识。处于不同网段内的主机必须有不同的网络标识。而处于同一网段内的主机的网络号表示相同,但主机号标识必须不同。所以,在某网段内新增一台主机后,该主机的网络号与该网段的网络号相同,但是主机号不能与该网段里的其他主机的主机号相同,即通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的IP地址都是唯一的。

  • 1
    2
    3
    那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情。
    有一种技术叫做DHCP,能够自动的给子网内新增的主机节点分配IP地址,避免了手动管理IP的不便
    一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器
    通过将IP地址划分为网络号和主机号来标识,可以有如下特点:
    

(1)IP地址管理机构在分配IP地址时只分配网络号。剩下的主机号由得到该网络号的单位自行分配,这样就方便了管理就够的管理;

(2)路由器在寻找目的主机的IP地址时,只需找到目的主机所在的局域网,再在该局域网内寻找目的主机。

(3)具有不同网络号的局域网必须有路由器进行连接,所以路由器总是有两个或两个以上网络号不同的IP地址

IP地址分类

IP协议段格式

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

​ A类地址的网络号占1个字节,只有7位可以使用。可以指派的A类网络号为126(2^7-2)个。A类IP地址中网络字段全0表示的是“本网络(A类网络)”的意思,不用于分配给具体的主机。IP地址中网络号全1表示的是本地环回地址,用于测试本主机的进程之间的通信,即网络号为127的IP地址。A类地址的主机号占3个字节,所以一个A类网络中可以连接的最大主机数为:2^24-2。主机号全0表示该主机连接的单个网络地址(某个A类网络),主机号全1表示该网络中的所有主机。

B类地址的网络号占2个字节,只有14位可以使用。可以指派的B类网络号为2^14-1(128.0.0.0)不用,最小的网络号为:128.1.0.0。每一个B类网路可以连接的最大主机数为:2^16-2=65534。(扣除主机号全0和全1的IP地址)。

​ C类地址的网络号占3个字节,只有21位可以使用。可以指派的C类网络号为2^21(192.0.0.0不用),最小的网络号为:192.0.1.0。每一个C类主机可以连接的最大主机数为:2^8-2=254(扣除主机号为全0和全1的IP地址)。

子网划分

为什么要划分子网?

第一,节约IP地址。

​ 这个很容易懂,比如一个C类的地址块,192.168.1.0/24,可以有254个主机,可是你的网络只有20台机器,也就是说你浪费了234个IP地址,实际上拿出来5位作主机地址就够用了,也就是说把你的子网掩码写成255.255.255.224就行了,那么余下的3位就是子网号,可以划分为8个子网,你用一个其余的就可以给别人的网络用

第二,路由表太大,影响网络性能

​ 路由器需要能够从路由表中找出怎样到达其他网络的下一跳地址,而一个物理网络对应一个网络号,如果网络越多,则路由表越大,路由器的存储空间就需要越大,查找也更耗时,但使用构造子网,则能减少网络数,提升性能

第三,增加了广播域,减少了广播风暴

​ 明确一点,一个子网一个广播域。

​ 所谓广播传输,就是向本网段中的所有节点都发送同样的数据包,这就势必要占用相当多的网络资源(因为每个广播数据包硬件设备都要对它进行分析)。然而最令人讨厌的就是在这些广播传输中对终端真正有用的只是所有广播接收用户中的一个,因为广播的目的就是查询目标用户的MAC地址,这样也就是在所有广播传输中,绝大多数都是没有取到任何作用的,纯粹是资源的浪费。而且网络规模越大,广播数据包发送所占用的资源就越多(因为广播中要传输的次数越多),很可能就形成广播风暴,正常的网络通信可能被中断,致使网络瘫痪

​ 而又因为广播数据包只能在同一网段中传输,网络规模小了,网络中用户数少了,当然所占用的资源也就少了

子网掩码

​ 随着Internet的飞速发展,这种划分方案的局限性就显现出来:IP地址空间的利用率降低——一个B类网络中最多可以表示的IP地址为65534个,而某些种类网络由于链路的特点能够连接的结点个数有限,所以就会造成大量的IP地址浪费;由于C类网络能连接的结点个数有限。所以,单位会申请B类网络,但一般又用不了这么多的IP地址,所以会造成IP地址的浪费。同理,A类网络的IP地址也会造成大量的浪费。

​ 针对这种情况提出了新的划分方案,称为CIDR:

  1. 引入一个额外的子网掩码来区分网络号和主机号
  2. 子网掩码也是一个32位的正整数,通常用一串“0”来结尾
  3. 将IP地址和子网掩码进行“按位与”操作,得到的结果就是网络号
  4. 网络号和主机号的划分与这个IP地址是A类,B类还是C类无关

划分子网的例子:

IP协议段格式

可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围

1
IP地址和子网掩码还有一种更简洁的表示方式,例如140.252.20.68/24.表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0

特殊的IP地址

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

IP地址的数量限制

​ 我们知道,IP地址(IPv4)是一个4字节32位的正整数,那么一共只有2的32次方个IP地址,大概是43亿左右,而TCP/IP协议规定,每个主机都需要一个IP地址。

​ 这意味着,只有43亿台主机能接入网络么?实际上,由于一些特殊的IP地址的存在,数量远远不足43亿;另外,IP地址并非是按照主机台数来配置的,而是每一个网卡就需要配置一个或多个IP地址。

​ CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费),但是IP地址的绝对上限并没有增加,仍然是不够用的,这时候有三种方式来解决:

  • 动态分配IP地址:只给接入网络的设备分配IP地址。因此同一个MAC地址的设备,每次接入互联网中得到的IP地址是不同的
  • IPv6:IPv6并不是IPv4的简单升级版。这是互不相干的两个协议,彼此互不兼容;IPv6用16字节128位来表示一个IP地址(但是IPv6还没有普及)
  • NAT技术

私有IP地址和公网IP地址

​ 如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65,536个地址包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP)

注意:

1.一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP)
2.路由器LAN口连接的主机,都从属于当前这个路由器的子网中
3.不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP就可以重复了

4.每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了

5.子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)

6.如果希望我们自己实现的服务器程序能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上

路由

​ 路由的过程,就是”一跳一跳“问路的过程,”一跳“就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

IP数据包的传输过程也和问路一样:

  • 当IP数据包,到达路由器时,路由器会先查看目的IP
  • 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器
  • 依次反复,一直到达目标IP地址

那么怎么判断当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护的一个路由表。

  • 路由表可以使用route命令查看
  • 如果目的IP命中了路由表,就直接转发即可
  • 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其他行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址
0%