【Linux】IP协议

目录

IP报头格式

网段划分

特殊的IP地址

IP地址的数量限制

私有IP地址和公网IP地址

路由

IP报文分片

1.粗粒度谈谈分片

[a. 确保将所有的分片全部聚到一起(相同的标识)](#a. 确保将所有的分片全部聚到一起(相同的标识))

[b. 片偏移排序(完成组转)](#b. 片偏移排序(完成组转))

2.分片细节

数据链路层

MAC地址

mac帧

局域网的通信原理


IP报头格式


4位版本号(version): 指定 IP 协议的版本 , 对于 IPv4 来说 , 就是 4.
4位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 length * 4 的字节数 . 4bit 表示最大 的数字是15, 因此 IP 头部最大长度是 60 字节 .
8位服务类型(Type Of Service): 3 位优先权字段 ( 已经弃用 ), 4 位 TOS 字段 , 和 1 位保留字段 ( 必须置为 0). 4位TOS分别表示 : 最小延时 , 最大吞吐量 , 最高可靠性 , 最小成本 . 这四者相互冲突 , 只能选择一个 . 对于 ssh/telnet这样的应用程序 , 最小延时比较重要 ; 对于 ftp 这样的程序 , 最大吞吐量比较重要 .
16位总长度(total length): IP 数据报整体占多少个字节 .
16位标识(id): 唯一的标识主机发送的报文 . 如果 IP 报文在数据链路层被分片了 , 那么每一个片里面的这个id都是相同的 .
3位标志字段: 第一位保留 ( 保留的意思是现在不用 , 但是还没想好说不定以后要用到 ). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文 . 第三位表示 " 更多分片 ", 如果分片了的话 , 最后一个分片置为1, 其他是 0. 类似于一个结束标记 .
13位分片偏移(framegament offset) : 是分片相对于原始 IP 报文开始处的偏移 . 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的 . 因此 , 除了最后一个报文之外 , 其他报文的长度必须是8 的整数倍 ( 否则报文就不连续了 ).
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数 . 一般是 64. 每次经过一个路由 , TTL -= 1, 一直减到 0 还没到达 , 那么就丢弃了 . 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型
16位头部校验和: 使用 CRC 进行校验 , 来鉴别头部是否损坏 .
32位源地址和32位目标地址: 表示发送端和接收端 .
选项字段 ( 不定长 , 最多 40 字节 ): 略

IP协议的本质工作:提供一种能力,将数据跨网络从A主机发送到B主机!

用户需要的是:提供一种能力,将数据可靠的跨网络从A主机送到B主机

IP=目标网络+目标主机

1.报头和有效载荷如何分离?固定长度+自描述字段(首部+总),报头20个字节

2.如何将有效载荷交付给上层?报头中的8位协议

网段划分

  1. 分类划分法:A、B、C、D、E
  2. 子网掩码

IP地址分为两部分,网络号和主机号

  • 网络号:保证相互连接的两个网段具有不同的标识。
  • 主机号:同一网段内,主机之间具有相同的网络号,但是必须要有不同的主机号
  • 不同的子网其实就是把网络号相同的主机放到一起。
  • 如果在子网中新增一台之际,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。
  1. 路由器的本质也是一个子网的主机,也要配置IP地址。
  2. 为了实现跨网段传输,路由器一定至少要连接两个子网 ,也就相当于同时在两个子网,因此路由器可以配置多个IP。
  3. 路由器一般是一个子网中的第一台设备,一般他的IP地址都是:网络号.1。
  4. 路由器的功能,ip报文的转发,不仅仅如此,还构建了子网(局域网)。

手动管理子网内的IP,是一个相当麻烦的事情。

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

过去曾经提出一种划分网络号和主机号的方案,把所有的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

随着Internet的迅速发展,这种划分方案的局限性很快就显现出来了,大多数组织都申请B类网络地址,因为B类网络号和主机号都比较多,好申请,导致B类地址很快就分配完了,而A类却浪费了大量地址。

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

针对这种情况 提出了心得划分方案,成为CIDR

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

例如

理论上上述划分一个子网可容纳256台主机,但是 .0 和 .255两个IP地址分别被用来当网络号, 广播地址,因此实际可容纳的254台主机。

那么一个IP地址对应的网络号要怎么计算出来呢?

IP地址:140.252.20.68 == 140.252.20. 0100 0100

子网掩码:255.255.255.240 == 255.255.255.1111 0000

两者进行&运算即可

特殊的IP地址

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

IP地址的数量限制

CIDR(Classless Interdomain Routing):

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
  • 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
    CIDR 在一定程度上缓解了 IP 地址不够用的问题 ( 提高了利用率 , 减少了浪费 , 但是 IP 地址的绝对上限并没有增加 ), 仍然 不是很够用. 这时候有三种方式来解决:
  • 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到 的IP地址不一定是相同的;
  • NAT技术(后面会重点介绍):私有地址不断被替换的过程;
  • IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

私有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)

从内网到公网的过程中,不断用路由器的WAN口IP替换src ip地址 ,这个技术就做NAT技术

那么为什么要使用NAT技术呢?IP地址不足,不同子网可以用相同的内网IP.

路由

目标网络 下一跳的路由器 子网掩码 U正在使用G表示路由器

查路由表的方法

拿着目标主机的IP & Genmask == Destination 进行比对


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

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

实际上,在一台主机中,报文并没有通过网络层直接发出去,而是交给了自己的下一层协议(数据链路层),而数据链路层,不能一次发送过大的报文!要求上层不能给其交付过大的报文,上限要求即下图所示mtu的值

IP报文分片

1.粗粒度谈谈分片

前置问题:怎么知道一个IP报文是被分片了呢?片偏移!=0 || 更多分片==1

a. 确保将所有的分片全部聚到一起(相同的标识)

组装过程如何识别是否有丢失分片

  • 丢第一个:如果不存在偏移量为0的,便是丢失了第一个
  • 丢中间:如果偏移量+分片长度不等于下一个分片的偏移量,便是丢失了中间分片
  • 丢最后:如果不存在3位标志,第三位为0的话,就代表最后一个分片丢失了

b. 片偏移排序(完成组转)

但是实际上,并不建议分片,会增加丢包概率,组装失败,报文需要进行重发

2.分片细节

假设一个3000字节的IP报文,进行分片,需分成3个,大小分别为1500,1500,40

因为每个分片,都需要添加报头(20字节),后续才能根据标识进行组装.

数据链路层

直接相连的主机之间,进行数据交付的问题

MAC地址

在同一个局域网中,区分特定的主机

mac帧

  1. mac帧如何做到解包和封装?

定长报文

2.如何做到分用

mac帧只在局域网中有效,转发是由IP报头进行决策。

mtu是mac帧有效载荷的大小

传输层--MSS

数据链路层--MTU

局域网的通信原理

可能会发生数据碰撞 ---》碰撞避免算法

局域网中,主机越多,发生数据碰撞的概率就越高;因此,我们可以划分碰撞域,减少局域网碰撞,这便是交换机的作用。

相关推荐
眠修5 分钟前
Kuberrnetes 服务发布
linux·运维·服务器
BAOYUCompany1 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
鳄鱼皮坡3 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛3 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin3 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
小Mie不吃饭3 小时前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
爱奥尼欧4 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
戒不掉的伤怀5 小时前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql
超喜欢下雨天5 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
搬码临时工5 小时前
小企业如何搭建本地私有云服务器,并设置内部网络地址提供互联网访问
运维·服务器