08 网络层---IP协议


一、IP的基本概念

HTTP解决传送什么数据的问题:构建与解析请求和响应(对应的操作是recv和send)。

TCP解决如何传送数据的问题:数据的可靠性,效率,什么时候发送,每次发送多少(具体办事还是得看下两层)。

IP负责真正的网络传输:端到端(主机A到主机B),点到点(主机A到下一跳路由器),将数据经过路径选择,发送到对方主机的过程由IP层负责(可能经过多个IP)。IP提供了将数据由A主机跨网络送到B主机的能力。 (如果丢包,由TCP超时重传,所以IP报文不怕丢包)

数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
在这里插入图片描述

主机:配有IP地址,但是不进行路由控制的设备。

路由器:即配有IP地址,又能进行路由控制。

节点:主机和路由器的统称。


二、IP协议头部格式

IP协议的格式和TCP很像。因此协议栈也叫TCP/IP。
在这里插入图片描述

  • 4位版本号: 指定IP协议的版本,对于IPV4来说,就是4(通常是4,ipv4和ipv6不兼容)。

  • 4位首部长度: 表示IP协议的头部长度是多少个32bit(4字节),4位能表示的最大数为15,即首部长度最大为60字节(和TCP类似)。

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

  • 16位总长度: 标识IP数据包的整体长度。将首部长度读上来,总长度 - 首部长度就是有效载荷长度(分离报头与有效载荷)。

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

  • 3位标志:由3比特构成,表示包被分片的相关信息。每一位的具体含义请参考下表。
    在这里插入图片描述

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

  • 8位生存时间(Time To Live,TTL): 数据在传输过程中,允许经过的路由器的个数(TTL也叫跳数)。TCP只会存在于发送端和接收端,网络之中只能看到IP报文。每经过一个路由器,TTL就减去1。因为硬件或软件可能会产生BUG,从而导致循环路由,这样网络中就会存在大量的废弃的游离报文(服务器和客户端都关闭了,报文还在传送的路上)。TTL解决了这些游离报文问题(TTL为0,数据包被丢弃)。TTL必须被设置,否则就会出现游离报文。

  • 8位协议: 标识传输层使用什么协议,在数据分用的时候,通过该字段决定将有效载荷交给谁(将数据交给响应的协议)。

  • 16位首部校验和: 使用CRC进行检验,来鉴别头部是否损坏(数据的可靠性是由TCP保证的,所以IP只进行头部的鉴定,不会对数据进行鉴定)。

  • 32位源/目的IP地址: 表示发送端和接收端,一般在网络之中是不会改变的。路由查找的基本过程,是先找到目标网络,然后进行报文转发,再找到目标主机,应该根据目的IP进行路由(比如去故宫玩,首先先去北京)。子网掩码的本质是提取目标网络。


三、IP报文分片与重组

在这里插入图片描述

  • MTU:
    中文名是:最大传输单元。它限制了网络层交付给数据链路层数据包的大小不能超过MTU,单位为字节。以网卡0为例,网络层在提交数据的时候不能超过1500字节。
  • UDP协议:
  1. 数据是整条交付的,在提交给网络层的时候,有可能超过了MTU的限制。
  2. 当网络层的数据超过MTU的限制的时候,需要在网络层进行分片处理;将超过MTU限制的数据,分成不同的数据,通过网络发送到对方去
  3. UDP协议是不可靠的,IP协议也是不可靠的,因此如果分片传输,丢失了一个分片,则整个数据包会被丢弃。

结论:如果UDP数据包长度超过了MTU,则在网络层需要进行分片传输。

  • TCP协议:
  1. MSS:TCP最大报文长度;是系统默认的,就是系统TCP/IP栈所允许的最大的包(有效载荷,不包括TCP头部)。在建立链接的时候,这个值就已经确定了,这个值并不是客观的值,而是由TCP/IP的实现确定的。
  2. MTU=MSS + IP头部+TCP头部
    TCP协议在传输数据的时候,严格按照MSS来给网络层传输数据;所以在网络层拿到TCP提交的数据之后一定是小于等于MTU的-IP头部的。

结论:由于TCP在传输数据的时候,严格按照MSS来提交数据,所以网络层拿到TCP协议提交的数据,不需要进行分片处理。

如何判断报文是否分片?如何组装?

只要分片了,除了第一个报文,所有的报文片偏移都不为0;除了最后一个报文,所有的报文更多标志位(3位标志的第三位)都是1。因此,分片报文的开头分片,中间分片,结尾分片都能够找到了,根据16位标识就能找到同组的分片,然后根据片偏移进行排序,排序后就能识别到哪一块报文丢失了(因为每一个报文都有长度,当前报文的片偏移+长度==下一个报文的片偏移,如果不相等,则表示丢包发生了,一旦丢失一个分片,则整个数据包都被丢弃),最后进行组装。

在这里插入图片描述

分片对于TCP和UDP来说是透明的,报文的分片与组装是由下层的IP来完成的,然后交给下层的数据链路层或上层的传输层。

IP报文为3000字节,需要分几片?

IP报文为3000字节,它的有效载荷为2980字节,而MTU为1500字节(IP报头20+有效载荷1480),因此,需要分3片,长度分别为1500字节(20+1480),1500字节(20+1480),40字节(20+20)。


四、IP地址基础知识

4.1. IP地址的构成

IP地址由“网络标识(网络号、网段)” 和"主机标识(主机号、主机地址)"两部分组成

  • 网络号: 保证相互连接的两个网段具有不同的标识;
  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

以192.168.128.10/24为例:“/24”表示子网掩码是24位,代表从高位到低位连续的‘1’的个数为24个,二进制表示即11111111 11111111 11111111 00000000,也就是255.255.255.0。192.168.128表示该IP的网络地址,10表示主机号。

网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现。

在这里插入图片描述

  • 不同的子网其实就是把网络号相同的主机放到一起。如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。

  • DHCP技术能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便。一般的路由器都带有DHCP功能。因此路由器也可以看做一个DHCP服务器。

IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机。

在这里插入图片描述

4.2. IP地址的分类

早期分类

早期IP地址分为四个级别,分别为A类、B类、C类、D类(还有一个一直未使用的E类。) 。它根据IP地址中从第1位到第4位的比特位对其网络标识(标识一个子网络,代表了一堆的ip地址)和主机标识进行区分。

  • A类 0.0.0.0到127.255.255.255 网络号为0.0.0.0~127.0.0.0
  • B类 128.0.0.0到191.255.255.255 网络号为128.0.0.0~191.255.0.0
  • C类 192.0.0.0到223.255.255.255 网络号为192.0.0.0~223.255.255.0
  • D类 224.0.0.0到239.255.255.255 网络号为224.0.0.0~239.255.255.255
  • E类 240.0.0.0到247.255.255.255

在这里插入图片描述

随着网络的发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了, 而A类却浪费了大量地址。比如申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机,A类地址的子网内的主机数更多。然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了。

子网掩码和CIDR

针对上面的情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)。

网络标识相同的计算机必须同属于同一个链路。例如,架构B类IP网络时,理论上一个链路内允许6万5千多台计算机连接。然而,在实际网络架构当中,一般不会有在同一个链路上连接6万5千多台计算机的情况。并且由于主机数量太多,从而导致网络号不够用了。所以CIDR本质上是向主机号“借位”,让若干个主机号充当网络号,从而增加网络号,减少主机号,让ABCDE类网络划分出更小的子网,借n位,就可以划分出2n个子网。

在这里插入图片描述

子网掩码是什么:
CIDR采用任意长度分割IP地址的网络标识和主机标识,因此引入子网掩码来进行分割。

现在,一个IP地址的网络标识和主机标识已不再受限于该地址的类别,而是由一个叫做“子网掩码”的识别码细分出比A类、B类、C类更小粒度的网络。这种方式实际上就是将原来A类、B类、C类等分类中的主机地址,部分用作子网地址,可以将原网络分为多个物理网络的一种机制,由固定的网络标识长度,变成了根据新规则进行划分子网(一批网络标识相同的IP地址,就叫做子网)。

用子网掩码按位与IP地址即可求出网络号,子网掩码取反再按位与IP地址可以求出主机号。

以C类网络地址192.168.10.0(11000000 10101000 00001010 00000000),子网掩码255.255.255.192/26(11111111 11111111 11111111 11000000)为例,其主机数和网络数。

我们知道C类网络前24位标识网络号,而其子网掩码为1的位数却有26位,这里相当于向主机号借了两位充当网络号,所以可以划分出22个子网。按位与可以得到11000000 10101000 00001010 00000000,其属于C类网络下的一个子网,剩下三个子网分别为:11000000 10101000 00001010 10000000、11000000 10101000 00001010 01000000、11000000 10101000 00001010 11000000。

该子网地址数 26=64个。该子网的 主机数为192.168.10.1~192.168.10.63,一共26-2个(要去掉网络地址(主机位全0),广播地址(主机位全1))

给定一个C类地址 192.168.5.0,要求划分20个子网,每个子网5 个主机,求符合要求的子网掩码。

从子网数推:

20个子网->2m=20->m=5,所以要向主机位借五位。则其子网掩码为255.255.255.248/29(11111111 11111111 11111111 11111000)

从主机数推:

每个子网5个主机->2n-2=5(减去主机地址全为 “0” 和全为 “1” 两种情况)->n=3,主机位有三位。则其子网掩码为255.255.255.248/29(11111111 11111111 11111111 11111000)

一个网络之中,当前的网络号为 127.16.99.0,子网掩码为255.255.255.0,现在需要将网络平均划分为4个子网,求每一个子网当中ip地址的范围,以及子网掩码。

划分成4个子网,只需要向主机位借两位即可,子网掩码为:11111111 11111111 11111111 11000000(255.255.255.192)。
在这里插入图片描述

要注意实际的主机数是子网地址数-2,去掉网络地址和广播地址。

超网划分(把一些小网络组合成一个大网络—超网)。
由2048个C类网络组成一个超网,从192.24.0.0到192.31.255.0,掩码应该是多少?

192.24.0.0–11000000.00011000.00000000.00000000

192.31.0.0–11000000.00011111.00000000.00000000

从左到右取相同的位数为子网掩码位数,共13位,其掩码为255.248.0.0。

4.3. 特殊的IP地址

  • 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
  • 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
  • 0.0.0.0:代表本地所有的网卡地址
  • 255.255.255.255:UDP的广播地址,全网广播,DHCP

4.4. 私有IP地址和公网IP地址

即是有了上述的CIDR技术,也只是提高了IP地址的利用率,无法改变IP地址缺少的现实,于是需要使用其他的办法。

这时候有三种方式来解决:

  • 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
  • NAT技术:通过将私有IP地址转换为公有IP地址,实现私有网络访问公共网络的功能。
  • IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

由于IP地址是有限的,因此我们就不能为每一台计算机分配一个公网IP。但是我们可以把整个互联网分成若干个局域网(每个局域网都有一个公网IP)。在每个局域网内,每台主机可以使用私有IP。
私有IP地址是一段保留的IP地址。只是使用在局域网中,在公网上是不使用的。
**加粗样式**

私有IP如何使用:

  1. 这三个网段当中的IP地址可以不经过申请,直接被个人或者企业,国家使用。
  2. 这些IP可以被不同的设备进行复用,这些IP组建的网络称之为私网。对应的互联网,我们称之为公网。
  3. 私网当中的IP地址可以与私网当中的机器进行通信,但是不能与互联网进行通信。
  4. 如果私网IP地址需要访问互联网,需要进行网络地址转化,将私网IP地址转化为公网IP地址。
  5. 私有IP在不同的局域网中可能会出现重复。从而增加了可接入网络中计算机的数量。

4.5. 路由选择

在这里插入图片描述

发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表(Routing Table)。实现IP通信的主机和路由器都必须持有一张这样的表。它们也正是在这个表格的基础上才得以进行数据包发送的。

在这里插入图片描述

  • U:该路由项是有效的。
  • G:表示该路由项是网关,G标志表示此条目的下一跳地址是某个路由器的地址。 没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
  • 默认网关:拿到一个数据之后,取出其中的目的IP地址,然后与每个本机网卡的子网掩码按位与操作,将网络标识取出来,如果属于同一网段,就从该网卡发送出去,如果所有的网段都不匹配,则从默认网关(default)发送出去。

一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP)。

路由器LAN口连接的主机, 都从属于当前这个路由器的子网中。

不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1)。子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了。

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

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也要写bug、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值