Linux网络——网络层协议

IP协议

协议格式

在这里插入图片描述

  • 4 位版本号(version):指定 IP 协议的版本,对于 IPv4 来说就是 4;
  • 4 位头部长度(header length):以 4 字节为单位,所以 IP 头部的长度是多少个 32bit,也就是 length * 4 的字节数,因为 4bit 表示最大的数字是 15,所以 length = 15,因此 IP 头部最大长度是 60 字节;
  • 8 位服务类型:3 位优先权字段(已经弃用),4 位 TOS 字段,和 1 位保留字段(必须置为0),4 位 TOS 分别表示:最小延时、最大吞吐量、最高可靠性、最小成本,这四者相互冲突,只能选择一个;
  • 16 位数据报长度(total length):IP 数据报整体占多少个字节,IP 报文最大大小为 64k,udp 报文中数据最大大小 < 64k - 28k,28k = udp 头部长度(8k) + ip 头部长度(20k);
  • 16 位分片标识(id):唯一的标识主机发送的报文,如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的;
  • 3 位分片标志:第一位保留,第二位置为 0 表示允许分片,置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文,第三位表示更多分片,如果 IP 报文分片了的话,那么除最后一个的其他小片的第三位标志都置为 1,最后一个小片的第三位标志置为 0,置 0 的就相当于一个结束标记;
  • 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移,其实就是表示当前分片在原报文中处在哪个位置,因为 13 位比特位最大表示数字为 8192,无法在 64k 报文中表示偏移量,因此分片偏移是以 8 字节为单位的,实际偏移的字节数 = 偏移量 * 8,因此,除了最后一个报文之外,其他报文的长度必须是 8 的整数倍(否则报文就不连续了);
  • 8 位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数,一般是 64,每次经过一个路由转发,TTL -= 1,一直减到 0 还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环;
  • 8 位协议:表示上层协议的类型,用于数据分用时选择解析协议;
  • 16 位头部校验和:使用 CRC 进行校验,来鉴别头部是否损坏;
  • 32 位源地址和 32 位目标地址:表示发送端和接收端;
  • 0 ~ 40 字节选项字段:保存一些路由信息;
数据分片
  • MTU:最大传输单元,链路层所限制的一个最大数据帧大小,所传输的数据大小(进行头部封装后的大小)不能超过 MTU 的大小;
  • mss:tcp 通信时,在进行连接前会协商 mss 的大小,mss 是 tcp 通信中数据的最大传输大小,而 MSS 是小于 MTU 的;
  • udp 报文大小是有可能大于 MTU 的,如果报文大于 MTU 大小,那么该报文数据则会在网络层进行数据分片,将一个完整的大的报文分割成多个小的数据分片,并封装 ip 报头进行传输;
  • tcp 报文大小是不可能大于 MTU 的,因为 tcp 报文是受 mss 所限制的,而 mss 是小于 MTU 的,所以 tcp 不会在网络层进行数据分片;
地址管理
IP地址
  • IP 地址的管理是按照网络进行管理的,大的网络是由很多小网络组成;
  • IP 地址组成:
    • 网络号:又称网段号,是一个网络标识,同一个网络中分配的地址都拥有相同的标识,主要是保证不同网络的网络号(标识)不同,使得每个网络中分配的 IP 地址不会发生冲突;
    • 主机号:同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号来进行区分;
  • 网段的划分:
    • A 类网络:高 1 位固定为 0,7 位网络号,24 位主机号,网络号范围 0 ~ 127,每个网络拥有 2563 个主机号,从 0.0.0.0 到 127.255.255.255;
    • B 类网络:高 2 位固定为 10,14 位网络号,16 位主机号,网络号范围 128.0 ~ 191.255,每个网络拥有 2562 个主机号,从 128.0.0.0 到 191.255.255.255;
    • C 类网络:高 3 位固定为 110,21 位网络号,8 位主机号,网络号范围 192.0.0 ~ 223.255.255,每个网络拥有 256 个主机号, 从 192.0.0.0 到 223.255.255.255;
    • D类网络:高 4 位固定为 1110,224.0.0.0 ~ 239.255.255.255;
    • E类网络:高 5 位固定为 11110,240.0.0.0 ~ 247.255.255.255;
  • 问题:随着 Internet 的飞速发展,上面这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址,导致 B 类地址很快就分配完了,而 A 类却浪费了大量地址;
  • 针对以上这种情况提出了新的划分方案,称为 CIDR:
    • 子网掩码:引入一个额外的子网掩码(subnet mask)来区分网络号和主机号,子网掩码也是一个 32 位的无符号整数,必须由连续的二进制 1 组成;
    • 网络号:将 IP 地址和子网掩码进行 “按位与” 操作,得到的结果就是网络号,网络号 + 主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关;
    • 主机最大数:子网掩码取反可以得到一个网络的最大主机号,最大主机号 + 1 就是该子网中的主机号个数;
  • 特殊 IP 地址:
    • 0.0.0.0:可被识别为本机任意网卡 IP 地址,常用于服务器绑定监听地址,客户端不能向改地址请求连接,因为会被识别为连接本机;
    • 255.255.255.255:全网广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
    • 127.0.0.1:每个主机上的虚拟回环网卡地址,进行本机网络回环测试(同一台主机上的Windows 与 Linux 也算作两个不同的);
    • 主机号全为 0 的 IP 地址就是网络号,主机号全为 1 的 IP 地址是 UDP 局域网广播地址,这两个地址不能分配给某个主机,所以一个网络内所能分配的主机号个数是总主机号减二;
  • 表示方式:IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为 140.252.20.68,子网掩码的高 24 位是 1,也就是 255.255.255.0;
私网
  • 私网(内网):一个组织所建立的内部私有网络,无法与外部直接通信,组建私网的路由器至少有两个网卡,其中至少一个对外连接的网卡 IP(这个网卡并不一定是公网,也可能会是另一个私网中的私网 IP),一个对内的网关 IP;

  • 私网 IP:私网中的 IP 地址不能和公网中的 IP 地址相同,否则会导致不知道向谁发送信息,所以私网的 IP 地址有自己的一套,如下所示,相同私网中的 IP 地址不可以重复,不同私网之间的 IP 地址是可以重复的;
    Class A:10.0.0.0 - 10.255.255.255
    Class B:172.16.0.0 - 172.31.255.255
    Class C:192.168.0.0 - 192.168.255.255

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

  • NAT/NAPT:

    • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,它的 WAN 口 IP 就是一个公网 IP 了,子网内的主机需要和外网进行通信时,路由器将 IP 首部中的 IP 地址进行替换(替换成当前路由器的 WAN 口 IP), 这样逐级替换,最终数据包中的 IP 地址就会成为一个公网 IP;
    • 我们进行逐级替换后,就可以使用一个公网 IP 进行数据通信,但是我们需要保留逐层的转换信息,否则在消息回复时,无法找到源主机在私网层级中的哪一层,以及是某一层的哪个主机,NAT 与 NAPT 所维护的映射关系表不同:
      1. NAT:要求对每一个当前连接都要对应一个公网 IP 地址,仅支持地址转换,不支持端口映射,因此要维护一个公网的地址池;
      2. NAPT:支持端口转换的 NAT 又可以分为两类:源地址转换和目的地址转换。这种方式支持端口的映射,并允许多台主机共享一个公网 IP 地址;
        在这里插入图片描述
        在这里插入图片描述
  • 网关:也就是上面所说的 LAN 口 IP,私网中的网关一般是私网网络号 + 主机号全为 1,网关的作用就是,因为私网无法直接和外部通信,所以私网中的主机要发送数据就会先发送到网关上,然后网关再根据这条信息做出判断,进行进一步的处理;

  • 内网穿透技术:假设 qq1 与 qq2 都处在私网中,而私网中的主机是无法直接通信的,所以qq1 向 qq2 发送信息的过程为,首先 qq1 将消息发送给腾讯服务器,腾讯服务器再将消息发送给 qq2,这样子的通讯过程会有大量的不必要操作,例如 qq1——>腾讯服务器(第一次除外)这就是不必要的,所以为了提高效率,在第一次 qq1——>腾讯服务器——>qq2 之后,qq1 就保留了qq2 所在私网的公网 IP 地址,后续通信就直接发送到该公网地址即可;
    在这里插入图片描述

路由选择
概念
  • 概念:在复杂的网络环境中为每一条数据选择合适的路径进行转发;
  • 路由表:每个路由器上都会拥有的重要信息,记录与自己相连的网络,主要由以下部分组成;
    • Destination:目标网络号
    • Gateway:网关地址
    • Genmask:子网掩码
    • Iface:连接这个网络的网卡
  • route:使用该命令可以查看当前主机上路由表;
过程
  • 当私网中的主机进行通信时,首先获取到对端 IP 地址,然后拿着这个 IP 地址与路由表上每一行中的子网掩码进行相与,用相与的结果和当前行的网络号进行比较,如果相等,则将数据发送到与之对应的网卡上,然后由这个网卡来实现数据转发,如果比较完了也没有相等的,则将数据发送到网络号为 default 所对应的网卡上,然后由该网卡将数据发送到该行中的 Gateway(网关地址)上,该操作就意味着本层网络中没有找到对端,要到更上一层的网络中去寻找;
  • 假设某主机上的网络接口配置和路由表如下:
    在这里插入图片描述
  1. 转发过程例 1:如果要发送的数据包的目的地址是 192.168.56.3;
    跟第一行的子网掩码做与运算得到 192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去,由于 192.168.56.0/24 正是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
  2. 转发过程例 2:如果要发送的数据包的目的地址是 202.10.1.2;
    依次和路由表前几项进行对比,发现都不匹配,则按缺省路由条目,从 eth0 接口发出去,发往 192.168.10.1 路由器,然后由 192.168.10.1 路由器根据它的路由表决定下一跳地址;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值