1. 注意事项的解释(背)
OSI: 开放系统互联 参考模型 Open System Interconnection
- 上三层是为用户提供服务的, 下四层是实际传输数据的
不管是本地访问还是网络访问,都要经历上三层, 比如我搜百度, 我输入百度俩个字, 是上三层, 回车搜索走的就是下四层, 会话层会对这个操作进行判断,是本地访问还是网络访问
再如: word, 我敲字进去, 走的是上三层, 点击保存, 直接保存在磁盘里面, 不需要走网络访问(会话层能够判断出来走的就是本地)

如果给B发送超过65535字节的数据包, 电脑B会死机
ping xxxx -l 65536 , 但是会限制A发送这么大的数据包

- 下四层传输的单位:
传输层: 数据段(报文) 上面层给的数据如果很大, 会把数据进行拆分,拆成数据包
网络层: 数据包(报文分组)(大小不能超过2^16=65535Byte)
数据链路层: 数据帧
物理层: 比特位 - 越上层的设备越智能, 能识别当层以下的所有协议, 越贴近用户,越下层的设备越傻瓜,越贴近于硬件
数据链路层只认识MAC, 网络层认识MAC和IP, 传输层认识MAC,IP,端口号 - 数据发送时,数据从上层向下层进行传输; 接受数据时,数据从下层向上层进行传输
- 数据不能跨层传输, 每层之间通过逻辑的接口传递
- 物理层负责实际数据传输,其他层只是逻辑对应
比如数据链路层, 打上去的包头, 只有数据链路层可以看 - OSI模型只是理论模型, 不能对应实际协议或硬件(假模型,实际使用的时TCP/IP协议)
2. 基本数据传输过程
1> A主机发数据
- 应用层输入搜索的网页
- 表示层把数据转换为机器看得懂的二进制
- 会话层判断是本地访问还是网络访问
- 传输层把数据进行分组, 并且加上一个报头,报头里面包含源端口号和目标端口号
- 网络层把数据加上一个包头, 包头里面包含源IP和目标IP(目标IP通过DNS/局域网查询得到)
- 数据链路层把数据加上一个帧头和帧尾, 帧尾是用来给不同数据帧做区分用的, 帧头里面包含源MAC和目标MAC( ① 查A的MAC表(ip-mac) ②) ARP广播找到
- 物理层把数据进行传输
2> 中间交换机接受数据 - 直接进入数据链路层, 然后交换机拆开帧头, 解析目标MAC,先查询交换机自己的MAC表(MAC-接口), 没找到就进行泛洪找到目标以及目标所对应的接口, 写入自己的MAC表里面
- 进入物理层继续进行传输
3> B主机接受数据 - 物理层把数据接受后, 传给数据链路层
- 数据链路层识别帧头, 确认目标MAC地址, 拆掉帧头和帧尾
- 网络层识别包头,确认目标IP, 拆掉包头
- 传输层识别报头, 确认是哪个服务端口, 拆掉报头,并且把报文进行组装
- 会话层向上进行传输
- 表示层把数据从二进制转换为用户看得懂的文字/图片
- 应用层接收到数据, 分配给具体的服务进行处理
- 处理完毕原路返回, 源地址和目标地址反过来

问题: 为什么已经确认了目标MAC地址是访问目标, 还需要确认目标IP地址是访问目标?
因为传输过程中IP地址可能会变
3. 通信
电脑,交换机,路由器是怎么通信的?

3.1 交换机通信原理
- 协议和设备分层
协议
网络层: 设备: 路由器 协议: IP地址
数据链路层: 设备: 交换机 协议: MAC地址
交换机不认识IP, 因为下层识别不了上层,上层能够识别下层
设备分层
- 路由器: Router : 用于不同逻辑网段通信的. 会分割广播域
- 交换机: Switch : 用于相同逻辑网段通信的. 不会分割广播域

- 电脑A->交换机->电脑B
- 电脑A封装数据(研究对象为A)
① 电脑A封装数据
传输层:
Sport: 10001 (1W+随机端口) 源端口
Dport: 80 (用户双击电脑A上指定客户端,客户端中也包含目标端口)目标端口
网络层:
SIP: 源IP A(电脑A如何获取A的IP?人手工分配,电脑识别网卡获得)
DIP: 目的IP B(电脑A如何获得B的IP?① 局域网: 拿到本机, 询问或查询 ② 公网: DNS获取B的IP)
IP的获取可以通过用户, 因为用户直接搜索,通过DNS就能解析出IP了
MAC地址不能通过用户, 因为比较难,不能通过用户间接获取
数据链路层
SMAC: 源MAC A(电脑A如何获得A的MAC? 厂商写在A的网卡里面了)(网卡既有IP地址,也有MAC地址)
DMAC: 目标MAC B(电脑A如何获得B的MAC?①查询A的MAC地址表.②使用ARP广播 IP->MAC)
② 电脑A查询未知MAC地址的方式:(顺序执行)
1> 查询的电脑A的MAC地址表(临时建立,断电会消失)(IP–MAC的表,IP可能会变,所以是临时存储)
电脑A和其他电脑通信过(ping过), 才会建立这个表,windows查询这个表的方式: arp -a

发qq没有建立MAC–IP表的原因: 走的是公网, 我们需要内网进行通信
只有通过信, 才能记录在这个表里面, 然后此时我们已知B的IP,直接通过主机A的MAC表得到B的MAC, 但是如果没有通信, 只能采取方法2了
2> 重启后, 数据清空了,查表没有查到, 此时使用ARP广播(ARP:地址解析协议 Address Resolution Protocol )(IP->MAC 已知对方IP,通过发广播的方式然后知道对方的MAC)

A知道B的IP, 但是不知道B的MAC, 发送ARP广播, B收到了, B知道找到的是它, 因此返回一个数据包, 包含所有地址, 此时A收到了, A知道了B的MAC, 并且把B的MAC地址和IP地址写入MAC地址表.
知道对方的MAC,不知道对方的IP->使用RAP广播
2) 交换机处理MAC地址(研究对象是交换机)(顺序执行)
1> 查询交换机MAC地址表(临时建立)(接口号–MAC)
交换机是没有MAC地址的, 里面的MAC地址表:接口-连接设备的MAC组成的表, 这个MAC是连接设备的MAC; 如果电脑B和交换机通过信, 就会记录到交换机的地址表里面, 交换机就会在表里面查, 哪个口对应B的MAC, 如图是2口, 那么直接通过2口找到B

2> 重启后, 数据清空了查表发现是空的,那么,此时采用的是泛洪查询
泛洪是指, 会给所有的口(除去发送数据的口,也就是交换机和A的口),都发消息,此时我们知道B的MAC地址, B收到消息后, 进行回复(包含三个地址), 交换机收到回复之后,确认了2口对应的就是主机B的MAC, 然后把2-主机B的MAC写入交换机的MAC地址表里面, 后续如果A/C再给B发消息, 交换机直接就可以查表找到对应B的接口, 把数据从接口发送给B,而不是再次泛洪
总之: 交换机关注的, 就是从哪个口把消息准确发给目标主机

补充:
广播和泛洪的区别
- 广播: 广播是网络层的广播, 广播的是IP地址(是拿IP查MAC)
- 泛洪: 泛洪是数据链路层的泛洪, 泛洪的地址是拿MAC查接口
广播地址和泛洪地址
广播地址 - 单网段广播地址: 192.168.166.255 知道源地址,不知道目标地址(ARP)
- 全网段广播地址: 255.255.255.255 源地址不知道,目标地址也不知道(DHCP的Discover广播)
广播域: 两种广播到达的范围是一样的, 都是以路由器为截断
泛洪地址 - 电脑B处理方式: 从下往上进行拆包
- 交换机的MAC地址
- 二层交换机(从下往上数,第二层就是数据链路层): 整个交换机只拥有一个MAC地址(交换机48个口根本分不过来,所以不是给接口用的,它只是给交换机用的), 此MAC不能用于网络通信, 仅用于交换机之间特殊运算使用.(不用管这个运算), 总之: 交换机上面的接口,既没有IP也没有MAC
电脑和路由是同一种设备的原因, 因为电脑和路由的网卡是真实网卡(上面有IP,也有MAC是绑死的) - 三层交换机(从下往上数,第三层就是网络层): 此交换机每个网卡既有独立的IP地址,也有独立的MAC地址, 就可以看成48口的路由器
补充:
常见单词
Source: 源头
Destination: 目的地
- 基本原则
交换机既不识别一个接口对应多个MAC地址, 也不识别一个MAC对应多个接口
路由器既识别一个网卡对应多个IP地址, 也能识别一个IP对应多个网卡
网卡口VS网关口VS交换机上的接口
只有电脑连着路由器的那个口是网关口, 其他的都是网卡口, 交换机的口只是单纯的接口

积分问题
- 电脑A和电脑C怎么通信, 电脑A和电脑D怎么通信
电脑A和电脑C通信
A拿着C的IP在自己的MAC表里面查询C, 找到了数据包就进入交换机,如果没有找到, 就进行ARP广播,最后找到了C的MAC,写入A的MAC表里面, 然后进入交换机,交换机S1进行查表, 表里面没有C的MAC, 因此进行泛洪, 通过S2发送泛洪请求, 此时C进行返回, 并且记录到S1和S2的MAC表里面
A查询B的时候是查询请求, 会先查表再泛洪. A查询C的时候, S1发送给S2的是泛洪请求, 不会引发S2的查表过程, 直接泛洪找C(此时S1的MAC记录表里面记录的是3-C的MAC, S2的MAC记录表里面记录的是5-C的MAC)

电脑A和电脑D
情况1: S1的3口记录的是最后一个和它进行通信的主机的MAC, 假设之前S1和D进行通信过信, 那么3口指向的就是D, 直接就可以查表然后找到D,然后进行通信

情况2: S1的3口没有记录D, 记录的是其他的主机, 那么此时就和查C的情况一样
3.2 路由器通信原理
拓扑图
Fa 0/0
Fa: faster 以太网
0/0: 第一个0是, 模块0(路由器里面可以新加接口的东西), 第二个0是模块上的0网卡

通信原理
- 电脑A封装数据(研究对象)
SIP: A
DIP: B - 数据包到达R1(研究对象是R1)
路由器处理未知IP的方式: 路由器绝不是通过广播查询未知IP地址的
只有一个方式: 查询路由表: (路由器是靠网段来建立路由表的,而不是单个ip):
查询指令: route print
直连网段: 直连网段,不需要特殊配置,当给直连网卡设置IP地址的同时,直连网段就自动写入了路由表中
非直连网段:
① 静态路由: 由管理员手工命令配置路由器路径(管理员通过手工配置的方式, 告诉路由按照指定的路由器路径发送数据包)
1> 优点: 转发效率高, 消耗路由器资源少
2> 缺点: 消耗管理员的运算资源(不适合大型网络,不适合频繁变换的网络)
静态路由的手工配置:
A要给B发消息, R1直连的是 1.0 2.0 网段, 因此要找到配置3.0和4.0的网段, 因为路由只能识别相邻的俩个网段,我们需要配置 4.0->2.2(路由器只能识别相邻的网段, 其他的网段的配置为,相邻路由器最近的网段的接口),3.0->2.2, 然后R2继续设置, R2直连的是2.0 3.0 网段, 我们需要4.0->3.2, 1.0->2.1, 然后R3直连的网段是3.0 4.0, 此时A可以和B单向通信, 我们需要 2.0->3.1, 1.0->3.1, 这样电脑A和电脑B才可以双向通信

手工配置的缺点:
一旦新增一个路由器, 那么就要新增很多的配置
适合大型网络,不适合频繁变换的网络

② 动态路由: 由运算器运算生成路由路径
1> 优点: 适合大型网络, 适合复杂网络
2> 缺点: 动态路由协议众多, 学习和管理技术要求高
人为配置一部分: 直接设置路由直连的是哪些网段就可以了

缺点: 对应不同的复杂网络, 需要选择不同的协议(rip:按跳数来)

补充: loopback:0, 也就是给一块网卡配置了多个逻辑网段(交换机的一块网卡,可以配置多个逻辑网段),逻辑网段内部也有交换机进行相连…

计分问题2: 电脑B访问电脑A是否会出问题? 路由器只能识别相邻的逻辑网段, 并且相邻逻辑网段不能一致, 如果人为绕过相邻逻辑网段, 非相邻的逻辑网段一致,会发生什么状况(动态路由的情况)?
现象: 路由器R2一会给A发数据,一会给C发数据,形成了一个环
原因:
- 路由器是按照网段来区分而不是IP
- 路由器支持1个IP对应多个网卡, 1.0网段对应2.1和3.2的网卡口, 并且记录在路由表里面, 循环进行执行(负载均衡,一会给A发,一会给C发)

路由表的详细解释: - 网络目标: 192.168.23.0, 表示一个网段, 接口: 192.168.23.1表示能够找到这个这个网段里面电脑的路由器接口

目标网络记录的是整个网段的IP, 假设我们ping 166.24主机, 我们需要通过路由器的直连网卡接口达到交换机, 然后查询交换机的MAC表找 35主机, 找不到就泛洪
路由器和电脑在网络层是一种设备,因此是
电脑不能当路由器的原因 - 个人电脑的网卡只有1个
- 非直连网段需要手动配置, 技术不达标
问题1:
交换机不认识IP地址, 但是交换机怎么能够通过IP来进行逻辑网段的通信?
交换机和电脑进行配合, 电脑判断出目标IP是不是同一个逻辑网段, 是就交给交换机,不是一个逻辑网段,就交给路由器
3.3 对等网络通信原理(私有-私有,公有-公有)
私有-私有,公有-公有,中间不能间隔着公网, MAC地址(数据链路层->交换机)是用于同网段通信,IP地址(网络层->路由器)是用于不同网段通信的
补充:
IPv4 地址耗尽问题怎么解决?
方法一: 私有IP (不要钱)(可重复): 变相增加IP总数
不同使用下面三组私有IP的局域网, 只要隔着公网, 里面的逻辑网段可以一致
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
小米的路由器: 31.0 , 所有的用户设置的都是31.0, 但是并没有发生IP冲突, 因为隔着公网

方法二: 子网掩码: 节约IP地址, 减少浪费
网关
- 网关是一个路由器(路由器上的接口): 用于让当前网段下所有的网络设备, 跨网段通信用的
电脑判断目标MAC是否是同网段,是就发给交换机,让交换机查表/泛洪去找, 电脑判断是非同网段, 就发给交换机->路由器,让路由器去查路由表找
IP是用来跨网段通信的(路由器), MAC是用来同网段通信的(交换机)
当存在多个内网线的时候给哪块网卡设置网关,就用的那根内网线

- 网关还是个默认路由(路由是协议,路由器是物理设备): 静态路由的一个分支(兜底路由路径)
假设访问百度
从上往下查, 上面的直连网段不行, 只能到默认路由, 然后由默认路由继续查
查局域网里面的ip,直接走直连网段的路由就可以找到, 直连网段能走,就走, 非直连网段才需要走默认路由(需要确认一下, 图中IPV4的地址和IPV4默认网关是否写对了)

通信原理
- 电脑 A 封装数据
Sport: 10000+以上的端口
Dport: 80(点击客户端程序)
SIP: 手工配置
DIP: B(局域网,直接查/问)(公网:DNS)
SMAC: A
DMAC: R1-1 (人为设置网关)
电脑A怎么知道目标MAC是R1-1?
电脑A自己默认网关配置的就是R1-1口的IP, 然后电脑A拿着IP找R1-1的MAC, 先找A自己的MAC表, MAC表里面没有,就使用ARP寻找R1-1的MAC,找到后记录在A自己的MAC表里面, 目标MAC不能是B的原因, 根本发不了广播, 因为中间隔着路由器, 我们需要一个路由一个路由的走

- 交换机 S1
六个地址都不变的原因:交换机是数据链路层的, 是要拆的,但是会原封不动的还原,拆的时候看MAC
过程: 交换机S1拿着R1-1的MAC地址, 查MAC地址表, 如果没有找到就进行泛洪,找到了交换机的2口对应R1-1的MAC, 然后记录在表里面

- 路由器 R1
- R1-1口接收数据包
数据链路层拆包(因为目标MAC确实是R1-1口), 拿着目标IP(B主机的IP)去路由表里面找, 没找到路由器就报错, 找到了就顺着R1-2口发出去

- R1-2口发出数据包
源IP和目标IP没有变
源MAC: R1-2, 目标MAC: R2-1, 源和目标的MAC变的原因: 因为跨了一个网段, MAC地址只能在同一个网段里面生效, 所以要重新封装(从1.0网段->2.0网段), 重新封装: R1识别出2.0是它的直连网段,通过查路由表,查B的IP对应的网卡口就是R2-1的口
由此可见: 目标IP和目标MAC不一定一致, 每次经过一个路由(跨一个网段), MAC都会更改一次(之前是A-R1,是1.0网段,后面是R1-2 -> R2-1 是2.0网段)
IP是跨网段通信的, MAC是同网段通信的

- 路由器-R2
同样的过程, R2-1口接收数据, 在数据链路层把包头拆了,R2封装新的源MAC和目标MAC地址,IP不会变:
SMAC: R2-2
DMAC: B的MAC(查R2的路由表,找到了B的MAC)

- 交换机 S2
交换机拿着目标B的MAC,查自己的MAC表,如果没找到就泛洪, 找到了2口对应B的MAC, 然后把数据发出去

- 主机B
俩次拆包确认地址(MAC,IP), 确认目标端口是80,然后给应用层找到www服务
再反转地址, 原路返回

- A -> 交换机S1, S1拿R1-1的MAC地址去查自己的MAC表, 没找到就泛洪, 找到了 S1 的2口是R1-1的MAC地址对应的口
- S1->R1, R1在数据链路层检查, 发现目标MAC和自己R1-1的MAC一样,因此拆包,传给网络层, R1拿着目标IP(B), 去找自己的路由表, 没有找到对应的网卡口就报错, 找到了就传输给数据链路层, 因为跨网段通信了(1.0->2.0网段),所以要变更源MAC(R1-2)和目标MAC(R2-1)
- R1->R2, 同样在数据链路层拆包头, 然后通过目标IP查自己的路由表,确认了是从那个网卡口能找到B, 同样更改源MAC(R2-2), 目标MAC(B的MAC)
- R2->S2, 已知目标MAC是B, S2直接查自己的MAC表, 找不到就泛洪,确认B的MAC对应的接口
- S2->B, B在数据链路层, 检查目标MAC就是自己,拆, 在网络层检查目标IP就是自己,拆,在传输层确认目标端口是自己服务器上的哪个服务, 拆, 然后传给应用层,应用层传给对应服务
- B把六个地址进行反转, 然后原路返回
3.4 非对等网络通信原理(私有IP–>公有IP)
不能用对等网络通信原理的原因: 私有IP是有可能一样的, 因此网络返回的时候, 不知道返回的是哪个IP的主机(网络是双向的)

原理:
- 电脑B封装
SIP: 192.168.1.2 (私有IP)
DIP: 百度 - 网关路由的处理
网关是一个路由器(用于让当前网段下所有网络设备, 跨网段通信的)
网关还是一个默认路由(兜底路由路径)
NAT网络转换(NAT表: 静态NAT转换,动态NAT转换,PAT转换 Port Address Translation 端口地址转换)
- 静态NAT
内网如果有100个电脑, 就必须有100个公网IP
篡改后的原IP,使用路由拿公网IP来进行篡改

- 动态NAT(之前使用的动态IP)
篡改后的IP使用临时IP来进行篡改(因为网络计费方式过了,因此不现实)

PAT转换
篡改后的IP都是用的一个公网IP, 但是新增一个原端口号的列, 来区分是哪台源IP

问: 为什么路由器认识端口(路由器是网络层)? 给当前技术打的补丁,路由器只能在NAT表下识别端口号
3.4.1 原则: NAT网络是单向的
- 原因: B作为源, 主动去访问百度,会建立NAT表(临时),并且能够从百度返回数据,百度作为源,不能找到电脑B, 因为私有IP是无法定位的(私有IP有可能一致)

- 问题: NAT网络一定是单向的吗?
不一定, 特定开发一个技术,从外网进入内网
为什么要开发这个技术?
普通用户, 从内网进入外网是常规操作, 外网向内网是我们技术人员远程办公的常用操作

怎么实现外网向内网进行访问?
- 网络穿透技术: ① SSH Secure Shell 安全外壳隧道(Windows)/端口映射(Linux) ② VPN
条件:
① 需要被穿透网络的路由器支持网络穿透技术
② 需要被穿透网络的路由器的对外IP地址为公网IP(IP全球唯一,要钱)
优点: 数据相对安全, 没有经过相关服务器
缺点: 对使用者技术要求高

- 利用第三方中转服务器(向日葵,todesk)
优点: 简单
缺点: 所有数据会经过中转服务器, 不安全

积分问题:
虚拟机的NAT模式,到底能不能访问局域网内其他电脑? 为什么可以访问公网?

虚拟机的NAT模式,到底能不能访问局域网内其他电脑?
现象: NAT模式下, 虚拟机可以ping通真实机, 但是真实机不能ping通虚拟机(里面可以ping通外面, 外面ping不通里面)
虚拟机可以ping通真实机: - 虚拟机把真实机当成了NAT网络路由器, 被NAT网络路由器包裹(篡改)后, 可以访问外网,外网返回数据,查NAT表可以进行返回

真实机不能ping通虚拟机:
2) 247.41和166.35不是一个逻辑网段, 166.35里面的网关写的是公网的路由器,所以发给了路由器(公网路由器), 路由器查路由表也没找到,目标IP地址(虚拟机IP地址)是不存在的, 因此报错

NAT是单向的
修改166.35的默认网关, 修改成真实机:166.240, 对于真实机而言(此时相当于路由器), 相当于直连了俩个网段, 然后166.35继续ping虚拟机,ping不通. 这样才证明了NAT是单向的这句话, 虚拟机可以ping通真实机(使用NAT表), 但是真实机ping不通虚拟机(相当于公网访问私网, 需要网络穿透技术)

为什么虚拟机在NAT模式能够访问公网?
- 虚拟机把真实机当成的NAT路由器
- NAT网关允许二次包裹(第一次在真实机把IP篡改成166.240, 第二次在连接外网的路由器上再次把IP篡改成公网IP)

908

被折叠的 条评论
为什么被折叠?



