Linux学习之IP协议

server/2024/9/23 0:30:07/

前言:

学习IP协议i前,我们其实知道网络协议栈是一层层的,上层封装好之后就传给下层,对于我们正要学习到的TCP协议,在对数据进行封装之后,并不是直接就将数据进行传输,而是交给下一层网络层进行传输,将数据通过网络形式从一台主机传输到另一台主机。我们的TCP只是给我们网络层,提供了许多可靠性策略,但是数据的传输并不是直接靠TCP。

实际上IP协议已经可以帮我们跨网络传输数据,但是并不能保证每次数据都是可靠的,安全的传输,通过TCP协议提供的策略,基本上数据传输时完全可靠的,安全的。

目录

前言:

IP协议

IP协议的报头

网段划分

公网IP与私网IP

理解运营商和全球网络

ip路由

数据链路层

认识MAC地址

认识ARP

ARP欺骗

网络整体结构

域名

NAT技术

NAPT

NAT和代理服务器


IP协议

 首先从一台主机到另一台主机,进行数据传输的过程中首先要进行源地址与目的地址的确定,即从源ip到目的ip,其次就是进行路段的选择,即路由选择。

而ip地址就是由两部分组成:目标网络+目标主机。先到达目标的网络区域,在确定是哪一台主机。ip地址通过这种方式,在进行网络通信的过程中,就能有较高的效率去排除,知道知道对应的目标主机。

IP协议的报头

关于ip的报头还是主要有两个问题:

1.报头与载荷的有效分离 

靠固定长度加自描述字段进行分离,如这里的报头总共20字节,剩下的为数据,其次还有4位首部长度(一个字节4位)。子描述字段报头首部+总长。

 2.将有效载荷交付给上层。

有8位协议字段表示要交付的上层协议。

网段划分

我们知道ip地址有网络好于主机号构成:

网络号:保证相互连接的两个网段具有不同的标识。

主机号:同一网段中,主机间有相同的网络号,因此靠主机号唯一识别。

主机之间通过路由器在网络层上跨网段传输数据,实际上路由器可以是一个个子网的主机,需要对齐进行配置ip地址。一个路由器相当于在两个子网中。

根据主机与网络号不同的位数,我们就可以对ip地址进行划分。IPv4下总共用32位标识:

随着 Internet 的飞速发展 , 这种划分方案的局限性很快显现出来 , 大多数组织都申请 B 类网络地址 , 导致 B 类地址很快就 分配完了, A 类却浪费了大量地址 ;
例如 , 申请了一个 B 类地址 , 理论上一个子网内能允许 6 5 千多个主机 . A 类地址的子网内的主机数更多 .
然而实际网络架设中 , 不会存在一个子网内有这么多的情况 . 因此大量的 IP 地址都被浪费掉了 .
针对这种情况提出了新的划分方案 , 称为 CIDR(Classless Interdomain Routing):
引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号 ;
子网掩码也是一个 32 位的正整数 . 通常用一串 "0" 来结尾 ;
IP 地址和子网掩码进行 " 按位与 " 操作 , 得到的结果就是网络号 ;
网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关 ;

除此之外也有一些特定格式的特定ip地址。

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

我们知道ip地址的数量是有限的,并且数量是越来越少,为了较少ip地址的浪费,提高利用率,用了三种方式来解决:

动态分配 IP 地址 : 只给接入网络的设备分配 IP 地址 . 因此同一个 MAC 地址的设备 , 每次接入互联网中 , 得到 的IP 地址不一定是相同的 ;
NAT 技术 ( 后面会重点介绍 );
IPv6: IPv6 并不是 IPv4 的简单升级版 . 这是互不相干的两个协议 , 彼此并不兼容 ; IPv6 16 字节 128 位来表 示一个IP 地址 ; 但是目前 IPv6 还没有普及 ;

公网IP与私网IP

其次ip地址也被被硬性划分为公网ip和私网ip。(规定组建局域网的必须是私有ip)

我们在日常生活过中使用的一般都是直接的私网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);

理解运营商和全球网络

我们先来理解运营商:

运营商其实就是建设了网络基础设施的大型企业,负责让我们中国的每一个人用到互联网,为我们配备网络的。所以在网络通信时,首先要经过运营商。

全球网络

 ip地址就相当于是一个巨大的资源,因此就需要对资源进行划分,我们简单地以国家为个体进行划分(公网ip):

内网路由器就是由家庭管理,先来自运营商内部的子网,子网的路由器网络从广域网来,而广域网就是一些大公司组建的机房。

ip路由

IP 数据包的传输过程也和问路一样:
1.当 IP 数据包 , 到达路由器时 , 路由器会先查看目的 IP;
2.路由器决定这个数据包是能直接发送给目标主机 , 还是需要发送给下一个路由器 ;
3.依次反复 , 一直到达目标 IP 地址 ;
那么如何判定当前这个数据包该发送到哪里呢 ? 这个就依靠每个节点内部维护一个路由表 ;

路由器在进行数据传输中,如何选择其他网段呢,首先会将自己的ip地址与其他路由器的子网掩码按位与,如果结果是ip地址,就说明是传输的网段,就交给目标主机,如果不匹配,他回去再路由表按位与,找到你需要那个路由器的接口,从该接口转发给下一个路由器。

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

再往下,我们知道数据并不会直接就发送到网络层了,而是发送给数据链路层了,数据链路层是有要求的,要求一次不能发送太多的数据报,而此时的封装后的ip数据包已经很大了,所赐此时需要对ip数据包进行分片,并且在处理之后进行组装。

如何进行分片与组装呢:这里就看的是ip协议包头中的3位标志字段,其中只有第二位与第三位有含义,第二位为0,表示允许分片,第三位表示结束标记(是否是最后一个小包)。

数据链路层

用于两个设备(同一种数据链路节点)之间进行传递.

数据链路层实现了一个区间内的通信(一跳),而IP实现的是直至到最终目的通信(点对点)。

数据链路层处理的是:直接相连的主机之间进行数据交付的问题。

而MAC地址区分了一个局域网中特定的主机。

源地址和目的地址是指网卡的硬件地址 ( 也叫 MAC 地址 ), 长度是 48 , 是在网卡出厂时固化的 ;
帧协议类型字段有三种值 , 分别对应 IP ARP RARP;
帧末尾是 CRC 校验码

报头域有效载荷如何分离,怎么判断分用呢?

 还是一样,采用定长的报文格式,可以看到14字节的报头,剩下的就是有效载荷。

报头的前6个字节目的主机MAC地址,之后的6字节为u源主机MAC地址,之后的两个字节标识上一层协议的类型。

认识MAC地址

MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可 能会冲突; 也有些网卡支持用户配置mac地址)。
MAC地址用于一个局域网内的网络设备寻址和传输数据,MAC地址是硬件地址,是不可被修改的,(其实是网卡的地址),也是用来唯一标识一个局域网中的网络设备。
IP地址可以进行不同网段之间的划分,用于不同网段之间数据的传输和路由,是一种标识主机的逻辑地址。
MAC帧只在局域网中有效,在数据传输过程中,每经过一个网段,向上层决策之后解包,之后在封装(重新添加MAC帧),到下一网段在解包,在封装 -----整个过程类似于唐僧取经,每到一个地方,都会被问“你从哪里来,要到哪里去?”先拆掉之前的包,在换上新的包。直到到达终点。

随着局域网增多,数据在传输过程中就有大概率会发生碰撞,为了应对这一问题,于是又出现了交换机,交换机管理者与它相连的路由器的通信。

认识ARP

虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。

数据链路层获取到了上层封装后的ip数据帧,可以进行网络传输,但是网络通信不仅仅看ip地址,这只是表示主机的,那么主机上的网络设备呢?是靠MAC地址标识的,找不到目的网络设备的地址先进行处理,就算找到了该主机,还是会丢弃数据包的。

ARP 协议的作用
ARP 协议建立了主机 IP 地址 和 MAC 地址 的映射关系 .
在网络通讯时 , 源主机的应用程序知道目的主机的 IP 地址和端口号 , 却不知道目的主机的硬件地址 ;
数据包首先是被网卡接收到再去处理上层协议的 , 如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
因此在通讯前必须获得目的主机的硬件地址 ;
原理(先广播确定,在传输):
源主机发出 ARP 请求 , 询问 “IP 地址是 192.168.0.1 的主机的硬件地址是多少 ”, 并将这个请求广播到本地网 段( 以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播 ); 
目的主机接收到广播的 ARP 请求 , 发现其中的 IP 地址与本机相符 , 则发送一个 ARP 应答数据包给源主机 , 将自 己的硬件地址填写在应答包中;
每台主机都维护一个 ARP 缓存表 , 可以用 arp -a 命令查看。缓存表中的表项有过期时间 ( 一般为 20 分钟 ), 如果20 分钟内没有再次使用某个表项 , 则该表项失效 , 下次还要发 ARP 请求来获得目的主机的硬件地址。

 ARP报头:

 

  

注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次 , 对于链路层为以太网的情况是多余的, 但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型 ,1 为以太网 ;
协议类型指要转换的地址类型 ,0x0800 IP 地址 ;
硬件地址长度对于以太网地址为 6 字节 ;
协议地址长度对于和 IP 地址为 4 字节 ;
op字段为1表示ARP请求,op字段为2表示ARP应答。

源主机通过广播获取目的主机的MAC地址,在网络通信时根据MAC地址传输给特定网络设备在进行上层协议的解包。因为每一个路由器要构建路由器表的时候也要认识周围的路由器,此时也适用arp协议进行记录。所以ARP不经可以在节点到主机之间,还可以是节点到节点之间。(路由器之间)。

ARP欺骗

举例:

  • 1.主机A要和主机C通信,主机A发出ARP包询问谁是192.168.1.3?请回复192.168.1.1。
  • 2.这时主机B在疯狂的向主机A回复,我是192.168.1.3,我的地址是0A-11-22-33-44-02。
  • 3.由于ARP协议不会验证回复者的身份,造成主机A错误的将192.168.1.3的MAC映射为0A-11-22-33-44-02。

其次在发送ARP请求后,如果获取到目的主机的ARP应答,此时还会将目的主的MAC地址缓存在主机中。但若收到很多的ARP应答(存在伪装的ARP应答,用虚假的ip地址和MAC地址构建的ARP应答),(更新ARP缓存)ip地址会去使用虚假的映射ip地址,MAC地址使用我的MAC地址,造成的后果会让网络阻塞,主机网络断开。

网络整体结构

域名

由于ip地址与端口号不方便我们我们日常使用,因此可以使用域名来代替ip地址与端口号:

域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称 .
域名使用 . 连接
com: 一级域名 . 表示这是一个企业域名 . 同级的还有 "net"( 网络提供商 ), "org"( 非盈利组织 ) .
baidu: 二级域名 , 公司名 .
www: 只是一种习惯用法 . 之前人们在使用域名时 , 往往命名成类似于 ftp.xxx.xxx/ www.xxx.xxx 这样的格 式, 来表示主机支持的协议 .

NAT技术

NAT 技术背景
之前我们讨论了 , IPv4 协议中 , IP 地址数量不充足的问题
NAT 技术当前解决 IP 地址不够用的主要手段 , 是路由器的一个重要功能 ;
NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法 :
很多学校 , 家庭 , 公司内部采用每个终端设置私有 IP, 而在路由器或必要的服务器上设置全局 IP;
全局 IP 要求唯一 , 但是私有 IP 不需要 ; 在不同的局域网中出现相同的私有 IP 是完全不影响的 ;

NAPT

那么问题来了 , 如果局域网内 , 有多个主机都访问同一个外网服务器 , 那么对于服务器返回的数据中 , 目的 IP 都是相同 的. 那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机 ?
这时候 NAPT 来解决这个问题了 . 使用 IP+port 来建立这个关联关系

NAT和代理服务器

路由器往往都具备 NAT 设备的功能 , 通过 NAT 设备进行中转 , 完成子网设备和其他子网设备的通信过程 .代理服务器看起来和NAT 设备有一点像 . 客户端向代理服务器发送请求 , 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后 , 代理服务器又把结果回传给客户端 .
那么 NAT 和代理服务器的区别有哪些呢 ?
从应用上讲 , NAT 设备是网络基础设备之一 , 解决的是 IP 不足的问题 . 代理服务器则是更贴近具体应用 , 比 如通过代理服务器进行翻墙, 另外像迅游这样的加速器 , 也是使用代理服务器 .
从底层实现上讲 , NAT 是工作在网络层 , 直接对 IP 地址进行替换 . 代理服务器往往工作在应用层 .
从使用范围上讲 , NAT 一般在局域网的出口部署 , 代理服务器可以在局域网做 , 也可以在广域网做 , 也可以 跨网.
代理服务器又分为正向代理和反向代理. 正向代理用于请求的转发 ( 例如借助代理绕过反爬虫 ). 反向代理往往作为一个缓存.

http://www.ppmy.cn/server/39556.html

相关文章

设计模式——装饰者模式(Decorator)

装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更为灵活。在装饰者模式中,一个装饰类会包装一个对象&#xff08…

图像处理之PCA(C++)

图像处理之PCA(C) 文章目录 图像处理之PCA(C)前言一、PCA原理1.原理思想2.实现步骤 二、代码实现总结 前言 在科研、工程应用中,我们往往所获取的数据都包含着很多冗余的信息,这些冗余的信息会对我们分析数…

本安防爆手机在电力行业中的应用

在电力行业这一充满挑战与风险的领域中,安全始终是最为首要的考量。电力巡检、维修等作业往往涉及易燃、易爆环境,这就要求工作人员配备能够在极端条件下保障通讯和作业安全的专业设备。防爆手机应运而生,以其独特的设计和卓越的性能&#xf…

vue3 antd-vue 超简单方式实现a-table跨页勾选

一、效果如下: 第一页勾选了2, 3, 4 翻到第三页勾选24, 25 回显,如比返回第一页的时候触发分页改变, 在映射中的第一页的数据给到a-table绑定的state.selectedRowKeys即可,如下方法 二、勾选思路…

开源高性能的分布式时序数据库:Lindb

Lindb:为大数据时代量身打造的高性能时序数据库,让海量数据存储与实时分析触手可及。- 精选真开源,释放新价值。 概览 Lindb 是一款开源的分布式时序数据库,它以其高性能和可伸缩性在海量数据存储及快速查询计算方面展现出独特的…

Jupyter配置远程访问的密码

安装 下载Anaconda的.sh文件后,上传到服务器,然后进行安装: chmod x anaconda.sh ./anaconda.sh创建虚拟环境 可以指定Python版本创建虚拟环境: conda create --name langchain python3.11.7 conda activate langchain conda …

Rust - 终端输入、文件读写

文章目录 查看参数接收终端输入读取文件写入文件 查看参数 fn main() { let args std::env::args();println!("{:?}", args); // Args { inner: ["target/debug/rt"] }for arg in args {println!("{}", arg);} }接收终端输入 use std::io:…

数据库基础语法二

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo mysql -uroot -p #登陆数据库 create database zoo; #创建数据库zoo alter database zoo character set gbk collate gbk_…