【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

局域网的通信原理

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

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

相关推荐
Tlzns3 分钟前
Linux网络——UDP的运用
linux·网络·udp
码农土豆9 分钟前
PaddlePaddle飞桨Linux系统Docker版安装
linux·docker·paddlepaddle
Hacker_xingchen13 分钟前
天融信Linux系统安全问题
linux·运维·系统安全
丘狸尾15 分钟前
[cisco 模拟器] ftp服务器配置
android·运维·服务器
黑客老陈23 分钟前
新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)
运维·服务器·前端·网络·安全·web3·xss
张暮笛24 分钟前
抓取手机HCI日志
linux
大猫和小黄26 分钟前
Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit
linux·服务器·windows·git
Joyner201830 分钟前
【Linux】ubuntu通过远程命令行启动桌面应用
linux·服务器·ubuntu
ghostwritten33 分钟前
Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon
linux·运维·服务器
我是唐青枫35 分钟前
Linux xargs 命令使用教程
linux·运维·服务器