目录

理解网络转发 

以太网 

以太网帧格式

局域网通信 

ARP协议

原因

ARP过程 

​编辑

格式

ARP欺骗

NAT技术 

NAT转化

内网穿透

内网打洞

代理服务器

正向代理

工作原理

特点

反向代理 

工作原理

功能特点

翻墙

NAT和代理服务器

DNS

背景

域名

域名解析过程

dig工具 

ICMP协议 

功能

格式

ping命令 

traceroute命令

手动部署并测试内网穿透 

frp下载

ssh远程登录

nginx远程访问


理解网络转发 

        主机A要想把报文发送给主机B:是需要经过不同的子网和子网间转发才能实现的,不是一口气就发送给对方

这样的话你就先得先解决同一个网段之间能够相互转发,那能不能做到呢?

        能!因为网络层以下有数据链路层,它来完成子网内节点之间报文的转发

以太网 

  • "以太网" 不是一种具体的网络,而是一种技术标准:既包含了数据链路层的内容, 也包含了一些物理层的内容
  • 例如以太网中的网线必须使用双绞线; 传输速率有 10M, 100M, 1000M 等
  • 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN 等

以太网帧格式

        源地址和目的地址是指 MAC 地址,长度是 48 位,是在网卡出厂时规定好的

如何解包?

        通过定长报头(10字节)和结束(4字节)读取,剩下的就是有效载荷

如何分用?

        通过报头的类型识别往上要交给网络层的哪个协议

局域网通信 

        在局域网同一时刻只允许一台主机发送数据不然所有的报文堆积在一起回发生碰撞,导致报文出现乱码的情况;如果主机间发送碰撞了,就会触发碰撞避免算法(让主机sleep 随机时间后再次发送报文),之后在进行碰撞的概率就变低了(主要是让主机间发送报文时间错开),这样就能保证在同一时刻只允许一台主机发送数据,我们也把局域网叫做碰撞域:一旦发送碰撞,主机之间会触发碰撞避免算法

只有传输层(TCP)能够重传吗?   

        主机在数据链路层发送报文到碰撞域中,如果在这一时刻有主机发送报文到碰撞域,二者就会进行碰撞避免算法,也就是在不同的时间段往碰撞域重传报文:所以不仅传输层TCP能重传,数据链路层也能,而且数据链路层本身就是底层的硬件,重传速度甚至比TCP还要快

在局域网中发送报文越长还是发送报文越短更容易发送碰撞?

        发送报文越长,意味着数据越大,在局域网停留的周期越长,越容易有其它报文的到来发送碰撞,所以发送报文时尽量不能太长,那最长不能超过多少呢?所以在数据链路层规定了MTU(Maximum Transmission Unit):1500字节(原来数据链路层也是有理有据的)

MTU我能理解了但有一个最小字节:46,如果我们在分片时报文数据小于46字节该怎么办?

        这个问题就好处理了:填充一些垃圾数据在里面凑成46字节后发送出去,但接收方要怎么识别哪部分是垃圾数据呢?   通过IP报头的总长度来提供有效数据,丢弃垃圾数据

那么在局域网中连接的主机是越少好还是越多好呢?

        连接的主机越多的话,主机间发生碰撞避免的概率就越高,这就会到导致发送数据时很难成功这就好像在家里如果连接网络的人多了,网络用起来就会很卡(如果想让一个局域网发生瘫痪,上不了网:我们可以往局域网发送大量数据,与其他人正常数据发生持续碰撞)

        为了缓解以上碰撞问题,我们引入一个新的设备——交换机(用来划分碰撞域)

        (工作在数据链路层)交换机的两端通过i0,i1接口来对两端的报文进行转发;每次转发之前会先记录一端主机的 mac 地址,此后左右各有什么主机交换机就都知道了,后面转发报文时就可以先进行判断:如果报文的目的 mac地址与源 mac地址在同一端就不进行转发,不在同一端才进行转发,这样就大大提高了效率;交换机将碰撞域分用左右两部分,不同端的主机就可以在同一个时刻进行通信啦,这样就大大减低了数据碰撞的可能性

        数据链路层有 MTU 来规定单个报文的最大值,而在传输层也有类似的 MSS(Maximum Segment Size)来表示 UDP/TCP 最大报文长度:双方建立三次握手连接时,除了通告对方的窗口大小,也会把对方的 MSS 给对方,双方通信就约定使用 min(MSS1,MSS2)进行通信

ARP协议

原因

        我们在网络层说过,IP有一种能力:将报文跨网络送到目标地址的能力;主机A发送报文给主机B时,传输过程src和des地址是一直不变的(没有NAT),但src和des的mac地址是一直在发生改变的;在传输中每经过一个路由器,路由器要进行:解包,查表,封包转发......到达路由器D时路由器知道主机B的IP地址(构建子网时路由器做的),但主机B的mac地址路由器是不清楚的!此时可以通过IP地址把报文交给主机B吗?      不能,因为主机B当前可能处于断网,新连接的主机C分配到的IP地址与主机B可能是一样的,所以无法将报文通过IP地址进行下一跳传给主机B

ARP过程 

        简单示意图

        具体的,当路由器从网络里收到报文时知道目标主机在子网中,但不知道目标主机的mac地址时,它就会构建arp请求,目标主机收到后(其它主机也能收到,只不过往上在arp处理时发现目标IP不是给我的,就会自动丢弃)进行处理生成arp应答(在arp中填充自己的mac地址),路由器收到arp应答(其它主机也能收到,也是与上面类似的道理)就能知道mac地址,在数据链路层添加上报头,发送到局域网中...

arp里已经有了源mac,目的mac,为什么构建mac帧时也要添加上源mac,目的mac,这不是重复吗?

        首先:arp与mac帧虽然是在都在数据链路层,但彼此是在不同级别,arp交给mac帧的数据,mac帧不关心(设计上是解耦的,谁也不知道对方的存在,重复只是巧合);其次:arp里的mac地址作为数据使用,而mac帧里的mac地址作为通信(添加报头)使用的,重复确实是重复了,但应用场景不同        

        arp中有一个关键字段:oper来表示arp是请求还是应答:收到报文的主机首先看的不是目的IP是不是我,而是先看oper,确定了是请求还是应答后再进行接下来是否要对数据进行处理;这个道理就好比中考后家长带孩子去机构咨询:人家上来的第一件是而是问你娃考了多少分,如果是600多分,接下来就询问有没有目标高中...如果考得太低人家可能就说要另外换学校看是否接纳你

        路由器收到arp应答时会将IP地址对应的mac地址数据暂时缓存起来,到了一定时间后进行定期处理(可能主机断开连接,有新主机替代了它,IP没变网卡变了,此时数据就不准确了)

格式

  • 硬件类型指链路层网络类型,1 为以太网
  • 协议类型指要转换的地址类型,0x0800 为 IP 地址
  • 硬件地址长度对于以太网地址为 6 字节
  • 协议地址长度对于和 IP 地址为 4 字节
  • op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答

ARP欺骗

        主机M(中间人)发送大量arp应答给主机A和路由器,那么双方就会更新arp缓存,主机A认为 ipR -> macM,路由器认为 ipA -> macM,那么下次主机A发送报文时就会被主机M收到,主机M在数据链路层解析后重新封包,把目的mac地址与源mac地址填写成macR与macM后发送,路由器收到后转发,回来时解包成IP报文找到目的IP地址ipA,通过arp缓存找到目的mac地址为macM,重新封包进行发送,此时主机M就收到了应答报文

NAT技术 

        之前在网络基础中,我们讨论了, IP 地址数量不充足的问题:NAT 技术的出现就是来解决 IP 地址不够用的主要手段,NAT 技术能够将私有 IP 对外通信时转为公有 IP,回来时再将公有 IP转为私有 IP,在不同的子网中运行允许 IP 的重复,因为不会影响正常通信

NAT转化

        客户端A发报文给服务器时过一遍NAT转化:NAT路由器将源地址从 10.0.0.10 替换成全局的 IP 202.244.174.37 ,重新封包后发出去,如果目的 IP 的网络号不与路由器在同一个网段,则又会向上转给该子网的路由器进行转发...最终到达与服务器同(公)网段下的(运营商)路由器,此时就可以直接将报文发送给服务器,完成从内网到公网的转化

但服务器要怎么把响应报文重新发给客户端A?也就是怎么从公网到子网(怎么回来)?

        在从内网到公网时,每经过一个路由器,都要为我们维护一张 NAPT 表,里面记录着替换前源IP和目的IP与替换后的源IP(路由器WAN 口IP)和目的IP,客户端A虽然使用的是私有IP但在该子网内唯一,而替换后的路由器WAN 口IP如果使用的是私有IP也是一样(也可能使用的是公有IP这就不用说了),所以二者一定是唯一的且会为键值

如果子网的客户端端口号一样,替换成WAN 口IP的源地址(加上端口号)不就是一样的吗?

        那么这时路由器映射 NAPT 时就就会把其中映射的一个 WAN 口IP的端口号进行更换,使得即使客户端源地址端口号相同,在响应报文回来时查 NAPT 表也能找到对应的客户端

        不同子网内的主机要想通信(以qq为例):主机A要通过子网到公网的转化发送请求给qq服务器(此时NAPT表中就记录了对应键值) ,对应主机B也一样(先进行登录也是要发送请求给qq服务器),此时qq服务器就会构建应答从公网到子网(此时路由器的NAPT表是记录的)给主机B:主机B就收到了主机A发来的消息从而来给对方回消息啦:这就说明不同子网的主机要想通信:唯一的方法就只有从子网到外网,再转化回来

内网穿透

        不同网段下的主机是无法做到自由通信的,因为私有IP无法跨网段访问;还有就是路由器没有建立起 NAPT 数据,所以需要通过公网的云服务器来帮助不同内网的主机进行通信

        流程:部署在公司的Linux机器首次发起与云服务器建立tcp连接,ssh 服务;之后云服务器与家里面的主机先进行ftp配置(云服务器配置 ftps,家主机配置 ftpc),主机向云服务器发起请求要与公司Linux机器进行连接(期间要进行身份认证),之后云服务器就会把连接结果给我们返回,连接成功就意味着:通过云服务器这个媒介,可以实现不同网段下的主机之间的通信

内网穿透有什么好处?

        在大公司中,他们内部会组建出一个大内网:相关机器都在内网中进行;如果离家太远的人,出现问题不能立马到公司解决问题(实现员工在家办公)就可以利用内网穿透:在公网部署云服务器以及相关配置,让员工在家通过访问云服务器间接访问到公司机器,实现内网访问内网

内网打洞

怎么做才能让双方之间真正地不借助云服务器的数据处理,实现双方之间的通信?

        首先要先让双方访问云服务器,云服务器获取到双方的IP地址,这个实际上是运营商服务器的WAN口IP,云服务器交换双方的 WAN口IP给对方返回(此时路由器NAPT有缓存双方可以收到),此时双方主机就能拿着对方WAN口IP直接进行通信,这样的好处是:既不需要服务器进行数据转发,缓解服务器压力,又提高用户体验(比如对方在几公里外跳转到路由器不是很多)

代理服务器

正向代理

        正向代理(Forward Proxy) 是一种常见的网络代理方式, 它位于客户端和目标服务器之间, 代表客户端向目标服务器发送请求

工作原理

  • 客户端将请求发送给正向代理服务器
  • 正向代理服务器接收请求, 并根据自身配置进行处理客户端请求
  • 正向代理服务器将处理后的请求转发给目标服务器
  • 目标服务器处理请求, 并将响应返回给正向代理服务器
  • 正向代理服务器也根据自身配置处理响应,最后返回给客户端

特点

  • 缓存功能:正向代理服务器可以缓存经常访问的资源, 当客户端再次请求这些资源时, 可以直接从缓存中获取,提高访问速度
  • 内容过滤: 正向代理可以根据设定规则对请求或响应进行过滤, 如屏蔽广告、阻止恶意网站攻击客户端
  • 访问控制: 通过正向代理, 实现客户端对特定网站的访问控制,如限制学生访问风险网站
  • 隐藏客户端身份: 正向代理可以隐藏客户端的真实 IP 地址,发送请求的源IP配的是它自己的

怎么做到让所有上网都要经过代理服务器?

        学校(公司)在建设子网时就已经做好的相关建设代理服务器的工作:当你上网时,会弹出登录页面来进行认证才能上网(代理服务器告诉你要来访问你了)

反向代理 

        反向代理服务器是一种网络架构模式,其作为 Web 服务器的前置服务器,接收来自客户端的请求, 并将这些请求转发给后端服务器

工作原理

  • 当客户端发起请求时, 它首先会到达反向代理服务器
  • 反向代理服务器会根据配置的规则将请求转发给后端的 Web服务器
  • Web 服务器的响应给反向代理,方向代理再依次推送给客户端

功能特点

  • 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡;这有助于提升网站的整体性能和响应速度,特别在高并发场景下
  • 安全保护:反向代理服务器可以隐藏后端 Web 服务器的真实 IP 地址, 降低其被直接攻击的风险
  • 缓存加速:反向代理服务器可以缓存后端 Web 服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求
  • 动静分离: 在大型网站中, 通常需要将静态资源和动态资源分开处理;通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,无需再次向后端服务器发起请求:这可以大大提升静态资源的访问速度。(前端开发的一种实用技巧)

        例如:CDN(Content Delivery Network) 就是采用了反向代理的原理:将服务器资源存放在网站(有CDN服务)中,客户端来访问时就通过该网站来获取资源

fq

        fq就是广域网使用代理服务器的一个例子

  • 先部署一台代理服务器在可以访问国外网站的地方
  • 客户端与服务器各自按照相关代理软件
  • 客户端发起HTTPS请求,到了运营商这里发现你发的这个请求的IP地址合法,就帮你进行转发,到了代理服务器这里就继续解密拿到客户端的数据帮你进行请求,把结果再继续加密返回给客户端
  • 这个过程运营商是不知道你在干什么,因为拿到的都是加密后的数据无法进行判断

运营商真的像上面那样怎么傻吗?

        其实不是的,它可以对该IP地址进行重点关注,进行流量监控,检测到一天又怎么多不同地方的人来访问,并且是直接使用的是裸的IP地址,这时就可以把该IP地址封掉,让所有人访问不了;所以客户端使用代理软件时,它会先劫持你的流量使用情况,并且提供若干个IP地址,万一平常使用的IP地址使用不了,就换个IP

NAT和代理服务器

  • 从应用上:NAT 设备是网络基础设备之一,解决的是 IP 不足的问题;代理服务器则是更贴近具体应用,在应用层提供各种服务
  • 从底层实现上:NAT 是工作在网络层,直接对 IP 地址进行替换;代理服务器工作在应用层
  • 从使用范围上:NAT 一般在局域网的出口部署;代理服务器可以在局域网做,也可以在广域网做,也可以跨网
  • 从部署位置上:NAT 一般集成在防火墙, 路由器等硬件设备上;代理服务器则是一个软件程序, 需要部署在服务器上

DNS

        DNS(Domain Name System)是一整套从域名映射到 IP 的系统

背景

        TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序:但是 IP 地址不方便记忆;于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用 hosts 文件来描述主机名和 IP 地址的关系

        最初,通过互连网信息中心(SRI-NIC)来管理这个 hosts 文件的

  • 一个新计算机要接入网络,或者某个计算机 IP 变更,都需要到信息中心申请变更 hosts 文件
  • 其他计算机也需要定期下载更新新版本的 hosts 文件才能正确上网
  • 互联网的发展产生更多的hosts文件

        太多hosts文件需要管理,于是产生了 DNS 系统

  • 一个组织的系统管理机构, 维护系统内的每个主机的 IP 和主机名的对应关系
  • 如果新计算机接入网络, 将这个信息注册到数据库中
  • 用户输入域名的时候,会自动查询 DNS 服务器,由DNS服务器检索数据库,得到对应IP地址

域名

        用来识别主机名称和主机所属的组织机构的一种分层结构的名称.

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

域名解析过程

        域名分布呈现出层状结构 

dig工具 

         安装dig工具

sudo yum install bind-utils

         使用 dig 指令查看域名解析过程

  • 开头位置是 dig 指令的版本号
  • 第二部分是服务器返回的详情, 重要的是 status 参数, NOERROR 表示查询成功
  • QUESTION SECTION 表示要查询的域名是什么
  • ANSWER SECTION 表示查询结果是什么. 这个结果先将 www.baidu.com 查询成了www.a.shifen.com, 再将 www.a.shifen.com 查询成了两个 ip 地址
  • 最下面是一些结果统计, 包含查询时间和 DNS 服务器的地址等

        面试题:当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

ICMP协议 

        ICMP(Internet Control Message Protocol)是TCP/IP协议族中的一个重要组成部分,它主要用于在网络设备和路由器之间传递控制消息。这些控制消息包括网络是否通畅、主机是否可达、路由是否可用等信息;虽然ICMP消息不传输用户数据,但它对用户数据的传输起着至关重要的作用ICMP工作在网络层,是一个无连接的协议,用于传输出错报告和控制信息

功能

        ICMP协议就是来提供各种功能来保证IP协议的可靠传输,主要功能包括

  • 确认 IP 包是否成功到达目标地址
  • 通知在发送过程中 IP 包被丢弃的原因
  • ICMP 只能搭配 IPv4 使用. 如果是 IPv6 的情况下, 需要使用 ICMPv6

        例如:主机A发送给主机B正常的报文,B不工作了,主机A什么也收不到!这时离主机B最近的主机设备(路由器)返回应答

        ICMP允许距离故障地最近的主机设备返回应答给发送方(告诉发送方出了什么事) 

格式

        ICMP 一共分为两类报文: 通知出错原因诊断查询

ping命令 

  • 注意, 此处 ping 的是域名, 而不是 url,一个域名可以通过 DNS 解析成多个 IP 地址
  • ping 命令不光能验证网络的连通性, 同时也会统计响应时间和 TTL(IP 包中的Time To Live, 生存周期)
  • ping 命令会先发送一个 ICMP Echo Request 给对方
  • 对方接收到之后, 会返回一个 ICMP Echo Reply

telnet 是 23 端口, ssh 是 22 端口, 那么 ping 是什么端口?

        ping 命令基于 ICMP:工作在网络层;而端口号是传输层的内容,在 ICMP 中就没有端口号这样的概念

traceroute命令

        也是基于 ICMP 协议实现, 能够打印出可执行程序主机,一直到目标主机之前经历多少路由器

手动部署并测试内网穿透 

        在上面我们已经讲了内网穿透的原理,现在来进行简单实现并测试(需要云服务器和虚拟机)

frp下载

        先下加速器:瓦特工具箱(Steam++官网)

        再访问 github 继续下载:frp选择Linux amd版本 不是arm! 

        我们要做以下两个测试:

  • ssh 远程登录
  • nginx 远程访问

ssh远程登录

        前提要保证两台机器都是联网状态,不然可能会出现不同情况;先在虚拟机中修改配置文件 frpc.toml

        再在云服务器上修改 frps.toml,这个端口号是二者进行 tcp 连接时所用的端口号

        再各自启动程序(带选项 -c 指定运行的编译文件)

        虚拟机设置 remotePort 后,启动 frpc 时就会云服务器:云服务器啊,你要给我重新起一个frps进程来绑定 8081 端口,同时建立 8081 端口到22端口的映射,这样用户访问 8081时你给我请求的是22端口

        启动一个xshell进行登录

        登录成功

nginx远程访问

        虚拟机安装

sudo yum install nginx # centos 安装
sudo apt install nginx # ubuntu 安装
#启动
 nginx
#暂停
# nginx -s stop

        在原来的配置文件中再添加一个服务(再让云服务器起8082端口号) 

 

        两台机器一起启动frp程序,登录浏览器进行访问(输入的是8082端口号)

        服务器和客户端这样在后台启动(守护进程)

nohup ./frpc -c ./frpc.toml &> /dev/null &
nohup ./frps -c ./frps.toml &> /dev/null &

        &> /dev/null: 这是重定向操作,用于将命令的标准输出(stdout) 和标准错误(stderr) 都重定向到/dev/null。/dev/null 是一个特殊的设备文件, 向它写入的内容都会被丢弃, 读取它则会立即返回文件结束:忽略命令的所有输出信息 

以上便是全部内容,有问题欢迎在评论区指正,感谢观看!

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐