Linux:带你理解网络层IP协议

IP协议

    • 网络层
        • IP协议头格式
    • 地址管理
        • 网段的划分:
        • 特殊的IP地址
    • 路由选择
    • 公网与私网(外网与内网)
      • 知识点习题


网络层

负责地址管理与路由选择:路由器(IP协议)

IP地址:无符号32位的一个整数,在网络中唯一标识一台主机(IP地址给主机的分配一定要保证唯一性)

IP协议头格式

  • 4位协议版本:IPV4 / IPV6
  • 4位头部长度:IP报头也是不定长的,最长60字节,最小20字节,有40字节的选项数据(以4字节为单位)
  • 8位TOS字段:3位优先权弃用,4位服务类型(最小延时,最大吞吐量,最高可靠性,最小成本),1位保留位必须置0
  • 16位数据报大小:包含IP报头在内的一个IP报文的大小,最大大小65535(意味着一个IP报文的最大长度不能超过64K)

tcp在传输层会自己选择合适大小MSS数据发送,udp报文数据最大大小应该小于64K-20-8

  • 16位标示:udp数据在网络层有可能会进行数据分片,标识当前分片属于哪个完整报文

  • 3位分片标志:1位保留,1位禁止分片标志 — 是否禁止分片,1位更多分片标志 - 类似于结尾标志

  • 13位分片偏移:以8个字节为单位,标识当前分片在完整报文中的位置(相对起始位置偏移量)

  • 8位TTL:报文最大生存周期 — 一个数据能够经过多少路由器,经过路由器就会-1,为0的时候则将数据丢弃(防止路由环路)

  • 8位传输层协议:在数据分用时,网络层取出数据,需要通过这个协议类型,决定传输层使用哪个协议对数据进行分用解析

  • 16位校验和:校验数据一致性

  • 32位源IP地址 / 32位目的IP地址:负责描述数据从哪个主机来到哪个主机去

  • 40字节选项数据:例如保留经过的路由器地址信息

注意:

  1. 网络层的数据分片

若传输层交付下来的数据大小过大,会在网络层将这个大数据截断为多个小的数据分片,然后每个分片封装IP报头进行发送,到达对端之后进行分片重组,组合成为完整的一个报文交付给上层。

  1. 传输层交付下来的数据大小过大,到底是多大就会分片?

这个大小取决于链路层最大数据帧的限制 — MTU(最大传输单元)

传输层tcp协议协商的MSS就是根据MTU计算得到的,因此tcp传输的数据到了网络层通常是不会进行分片的
但是udp协议传输数据,只限制数据小于64k-28就可以传输,但是若大于MTU大小就会在网络层进行数据分片 — 网络层数据分片主要针对udp

  1. 13位分片偏移,为什么要以8字节为单位?

13位能够表示的最大大小事 8192 = 2^10 * 2^3;但是一个完整的udp报文有可能是接近64K的大小,最后一个分片有可能偏移量都6万多了,13位的偏移大小是没法表示;
因此这个字段中的大小是以8字节为单位 8 = 2^3;这时候8192就表示具体的偏移量为 8192 * 8 = 64K;这样就可以完整表示偏移量了(因此每个分片除了最后一个,大小都是8的整数倍)

地址管理

网络非常大,人为分配是搞定不了的;只能机器分配 — DHCP — 动态地址分配

整个网络是由很多的小型网络组成的,按照网络进行地址分配,每个网络中的主机IP地址带有这个网络的标识符,只要每个网络的标识符不同,就可以保证分配的IP地址不同

IP地址的组成:网络号(网段) + 主机号

  • 网络号:用于标识当前的网络

一个路由器组建局域网的时候,所对应的网络表示(每个路由器对于接收到的数据进行源地址判断,这个网络是否属于自己的网络,属于才会转发,不属于则直接丢弃)

  • 主机号:主机号就是在局域网中大家拥有相同网络号的情况下,标识唯一的一个主机

网段的划分:

主机号的唯一路由器很容易就可以实现;主要保证的是网络号如何划分?

  • 早期

将所有的IP地址划分为五类地址,组建什么样的网络,就使用什么样的网络号,分配什么样的地址。

  • A类:用于组建超大型网络,IP地址中:高一位固定为0,高七位是网络号,低24位是主机号 0.0.0.0 ~ 127.255.255.255
    比如我要组建超大网络,使用10.这个网络号,则这个网络的IP地址分配范围:10.0.0.0 ~ 10.255.255.255
  • B类:用于组建中型网络,IP地址中:高2位固定为10,高14位是网络号,低16位为主机号:128.0.0.0~ 191.255.255.255
  • C类:用于组建小型网络,IP地址中:高3位固定为110,高21位是网络号,低8位是主机号 192.0.0.0 ~ 223.255.255.255
  • D类:特殊网络,地址中:高4位固定为1110,28位多播组号
  • E类:特殊网络,地址中:高5位固定11110,27位保留

你要组建什么网络,然后去权威机构进行申请,分配一个网络号,接下来组建网络,主机号的分配由自己完成

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就 分配完了, 而A类却浪费了大量地址;

  • 例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.
  • 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.

  • 当前划分方式 — CIDR方案

引入了一个新的字段 — 子网掩码

子网掩码:无符号32位的整数,不过数据由连续的二进制1组成(由一串“0”来结尾)

  • 子网掩码取反可以得到局域网中的最大主机号
    从0到最大主机号就是局域网中主机号的分配范围 255.255.255.0 — 255(0~255)
  • 子网掩码与IP地址相与,可以得到网络号
    路由器收到一个数据,拿数据的源地址与自己的网络号相与,看看与自己的网络号是否匹配

特殊的IP地址

  1. 主机号全为0的IP地址:网络号 — 用于标识网络(这个主机号不能分配给主机)
  2. 主机号全为1的IP地址:udp局域网广播地址(这个主机号不能分配给主机)
    udp支持局域网广播,将数据发送的广播地址,可以认为是发送给局域网中的所有主机(局域网所有主机都能识别)
  3. 127.0.0.1:这个地址是每个主机上都有的一个本地虚拟回环网卡地址(主要用于本机的网络测试)
  4. 0.0.0.0:这个地址适配本机上任意网卡地址,常用于服务端监听地址(监听本机所有网卡IP)
  5. 255.255.255.255:全网广播地址 — 任意一个主机拿到发往这个地址的数据都会认为和自己匹配(常用于DHCP广播)

路由选择

根据数据中的目的地址,来为数据选择一条合适的路径

每一个主机连接上路由器之后,都会全网广播dhcp请求,路由器收到后会进行回复:

  • dhcp响应:
  • 给主机分配的IP地址
  • 当前所在网络的子网掩码
  • 当前所在网络的网关地址

Linux:带你理解网络层IP协议_第1张图片

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

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

如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;

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

Linux:带你理解网络层IP协议_第2张图片

  • 这台主机有两个网络接口,一个网络接口连到192.168.2.0网络,另一个网络接口连到 192.168.1.0网络;
  • 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口
  • 拿到数据之后,根据数据的目的地址,与路由表中的每条信息进行比对(目的IP地址与对应网络的子网掩码相与,得到网络号,判断与对应网络的网络号是否相同)
  • 判断这个数据的目的主机是否属于这个网络,若属于这个网络,则使用加入这个网络的对应网卡将数据发送出去。若都没有对应,则发送到自己的网关设备上。

公网与私网(外网与内网)

  • 私网:仅限于网络内部通信的网络,无法连接外部
  • 外网:互联网

IPv4的IP地址不够用,除了DHCP动态地址分配技术(谁上网给谁分配地址)之外还有一种NAT技术 — 网络地址转换技术

一个路由器可以组建一个私网,仅限于私网内部通信,若要进行外部通信,则大家使用同一个对外IP地址进行上网,这样的话,只要保证相邻的两个私网网络号不同,分配的地址不同,其他的私网之间,IP地址是否冲突就不重要了。

  • 只要保证不与外部的IP地址冲突就行,但是相邻的两个网络不能使用相同的网络号
  • 网络是否相邻,主要取决于路由器的连线,与路由器相连线的网络都属于相邻网络

在RFC1918中规定,能够用于组建私网的地址有以下几种

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

  • 一个路由器可以配置两个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,网络地址转换).

  • 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.

知识点习题

Linux:带你理解网络层IP协议_第3张图片

  1. 下列关于TCP,UDP,IP协议的定义及主要有什么作用描述正确的有?(多选)

A.UDP,TCP 在传输层,IP在网络层

B.IP协议负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机

C.TCP在传输层负责传送数据,并且确定数据已被送达并接收。

D.UDP提供的是一种可靠的数据流服务,TCP相反

正确答案:AC

Ip协议是不可靠的,不能保证每一数据块均能到达目的主机。

  1. 关于IP地址下列说法错误的是?

A. IP地址采用分层结构,它由网络号与主机号两部分组成
B. 根据不同的取值范围IP地址可以分为五类
C. 202.112.139.140属于B类地址
D. 每个C类网络最多包含254台主机
E. IPv6采用128位地址长度
F. A类,B类和C类地址为内部私有地址

正确答案: CF

答案解析:

  • A类地址: 1.0.0.1—126.155.255.254
    ① 10.X.X.X 是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。
    ② 127.X.X.X 是保留地址,用做循环测试用的。

  • B类地址: 128.0.0.1—191.255.255.254 。
    ① 172.16.0.0—172.31.255.255 是私有地址
    ② 169.254.X.X 是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IP。

  • C类地址 : 192.0.0.1—223.255.255.254 。
    192.168.X.X 是私有地址。

  • D类地址 : 224.0.0.1—239.255.255.254

  • E类地址 : 240.0.0.1—255.255.255.254

  1. 关于IP报文头的TTL字段,以下说法正确的有( )(多选)

A. TTL的最大可能值是65535
B. 在正常情况下,路由器不应该从接口收到TTL=0的报文
C. TTL主要是为了防止IP报文在网络中的循环转发,浪费网络带宽
D. IP报文每经过一个网络设备,包括Hub、LAN SWITCH和路由器,TTL值都会被减去一定的数值

正确答案: B,C

答案解析:

TTL(time to live)生存时间字段设置了IP数据报能够经过的最大的路由器数,TTL字段是由发送端主机初始设置的,以防止数据包不断在IP互联网络上永不终止地循环。每个处理该数据报的路由器都需要将其TTL值减1,当路由器收到一个TTL值为0的数据报时,路由器会将其丢弃,TTL的最大值是255。


如果本篇博文有帮助到您,请动动您的小手,点赞激励博主呐~~

你可能感兴趣的:(Linux,网络)