【Linux网络】数据链路层【下】{MAC/MTU/ARP/ICMP/NAT/PING/代理服务器原理}

news2024/12/28 9:35:34

文章目录

  • 1.逐步深入数据链路层
    • 1.1MAC帧
    • 1.2由集线器到交换机
    • 1.3认识MTU
  • 2.ARP 地址解析协议/RARP逆地址解析协议
  • 3.DNS(Domain Name System)
    • 域名
    • 从输入url后到能看到网页 发生了什么【典中典】
  • 4.ICMP协议:一个网络层协议
    • 有了TCP,为什么还要用ICMP
    • ICMP协议字段
    • ping命令
    • traceroute命令
  • 5.NAT技术
  • 6.总结
  • 网络原理总结

1.逐步深入数据链路层

1.1MAC帧

在这里插入图片描述

主机A中的网络层做决策要将数据转发到路由器A,主机A和路由器A直接相连,符合局域网通信原理。
主机A封装Mac帧时,源 Mac 地址 是主机A的 Mac 地址,目的 Mac 地址 是路由器A的 Mac 地址。当路由器A收到了该报文,根据类型向上层交付(路由器中也是计算机设备,也要分层【网络层+数据链路层】),路由器的数据链路层将 Mac 帧 的报头和有效载荷进行分离交付给网络层。
在这里插入图片描述

有效载荷的开头是 IP 报头。 IP 报头涵盖源 IP 地址和目的 IP 地址,路由器A中有自己的路由表,它根据 IP 报头中的目的 IP 地址查自己的路由表,查的过程本质又是一次决策的过程。当它查路由表的时候发现要发送报文给下一个路由器B,决策完后要修改源 IP 地址为当前所处结点(路由器A)的WAN口IP,重新封装 Mac 帧 交付数据链路层,源 Mac 地址 改为路由器A的 Mac 地址,目的 Mac 地址 改为路由器B的Mac 地址,重复上面的工作,直到数据抵达目的 IP。

结论: Mac 帧 只在局域网中有效。xy两设备相连,x的数据链路层封装MAC帧,发给y,y拆MAC帧交给自己的上层即网络层,分析下一跳后重新封装 Mac 帧 交付数据链路层。==》Mac 帧 在发送之后,下一跳主机会去掉 Mac 帧 报头并重新封装 Mac 帧。

1.2由集线器到交换机

当一个局域网中主机越来越多,发生数据碰撞的概率越来越大,诞生了一种新的网络设备:交换机。

交换机:将一个局域网分成若干部分,没有交换机时,任何主机发数据都有可能会发生碰撞。有了交换机,如果该交换机的左侧部分局域网发生了数据碰撞,交换机能识别到,它就不会把左侧的碰撞报文转发到右侧,这样只会影响左侧。如果是正常报文,交换机会正常转发到右侧部分的局域网中。交换机有一个概念叫做划分碰撞域即减少局域网碰撞,不能彻底解决数据碰撞。

1.3认识MTU

MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层产生的限制,以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
不同的数据链路层标准的MTU是不同的

概念

MTU(Maximum Transmission Unit,最大传输单元)是网络中一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。例如,以太网的MTU是1500字节。

MTU的大小对于网络性能有一定的影响。如果MTU设置得过大,可能会导致数据包在网络中传输时出现分片的情况,增加网络负担和传输延迟。如果MTU设置得过小,可能会导致数据包无法承载足够的数据,需要分多次传输,同样会影响网络性能。

在实际应用中,MTU的大小需要根据具体的网络环境和应用场景来设置。一般来说,可以通过测试和调整MTU的大小来优化网络性能。例如,在一些需要传输大量数据的应用场景中,可以适当增加MTU的大小来提高数据传输效率。而在一些网络状况较差的环境中,可能需要减小MTU的大小来避免数据包分片的情况。

  1. MTU 对 IP 协议的影响

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
将较大的IP包分成多个小包, 并给每个小包打上标签;
每个小包IP协议头的16位标识(id)都是相同的;
每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为0, 否则置为1);
到达对端时再将这些小包,按顺序重组, 拼装到一起返回给传输层;
一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. IP层不会负责重新传输数据;

如果发送报文太长(数据量大),就要在局域网中发送更多的数据–》 和网络通信时间变长,在发送期间和其它报文发生碰撞的概率变高 ==》尽量发送小的数据包—Mac 帧 中的有效载荷即数据部分要求不能太大,范围是 46 ~ 1500 ----- 在 IP 协议中讲一次不能发送太大的报文,如果报文过大要分片。------------> 下层的需要使得上层要按照这种需要/限制制定方案!

  1. MTU 对 TCP 协议的影响

回顾TCP

TCP的一个数据报不能无限大, 受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max
Segment Size);
TCP在建立连接的过程中, 通信双方会进行MSS协商.
最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
MSS的值就是在TCP首部的40字节变长选项中(kind=2)

MSS && MTU

使用ifconfig命令,即可査看ip地址,mac地址,和MTU;
在这里插入图片描述

Mac 帧有效载荷最大是 1500 字节,倒逼网络层传的数据不能超过1500,如果数据大使得网络层进行分片,分片不好,要减少分片。网络层不能决定报文的大小,数据是从传输层交付到网络层的,减少分片的根源在于传输层。

如果数据链路层要求网络层一次发送的数据不能超过 1500 字节,网络层中减去 IP 协议的报头,假设是 20 字节,剩下 1480 字节。网络层可以要求传输层一次尽量发送不超过 1480 个字节的TCP报文。在传输层假设是 TCP 协议,减去 TCP 的报头,假设是 20 字节,剩下 1460 字节,那么这时候 TCP 知道每次发送数据不能超过 1460 个字节----减少网络层的分片。

学 TCP 滑动窗口时,在滑动窗口内要把数据分为一段一段再发送,不能把滑动窗口的数据一次性发送的原因之一!==》MSS 在约束!双方发送 SYN 建立三次握手时在 TCP 头部写入自己能支持的 MSS 值。

  1. MTU 对 UDP 协议的影响
    一旦 UDP 携带的数据超过 1472(1500 - 20(IP首部) - 8(UDP首部)),那么只能在网络层分成多个 IP 数据报,也就是分片。这多个 IP 数据报有任意一个丢失,都会引起接收端网络层组装失败。那么这就意味着,如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了。

2.ARP 地址解析协议/RARP逆地址解析协议

ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。属于数据链路层。

ARP作用

ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议,如果接收到的数据包的硬件地址与本机不符,则直接丢
弃;
通讯前必须获得目的主机的硬件地址;

ARP过程

源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

为什么要有缓存表? 为什么表项要有过期时间而不是一直有效?

ARP(地址解析协议)缓存表的存在及其表项设置过期时间的原因,可以从多个方面来解释:

为什么ARP要有缓存表?
提高通信效率:
ARP缓存表存储了IP地址与MAC地址的映射关系,当主机需要发送数据到另一个主机时,可以直接从ARP缓存表中查找目标主机的MAC地址,而无需每次都发送ARP请求进行广播查询。这样可以大大减少网络中的广播流量,提高通信效率。
节省网络资源:
通过缓存机制,ARP避免了重复的网络查询过程,从而节省了网络带宽和CPU资源。特别是在局域网中,频繁的网络查询会对网络性能造成较大影响。
支持动态网络:
在动态变化的网络环境中,主机的IP地址和MAC地址可能会发生变化。ARP缓存表能够动态更新这些映射关系,确保网络通信的连续性和准确性。
为什么ARP缓存表的表项要有过期时间而不是一直有效?
防止表项积累过多:
随着时间的推移,如果ARP缓存表中的表项一直有效,那么表项的数量会不断增加。这不仅会消耗大量的存储空间,还可能影响缓存表的查询效率。设置过期时间可以定期清理不再使用的表项,避免表项积累过多。
适应网络变化:
网络环境是动态变化的,主机的IP地址和MAC地址可能会发生变化。设置过期时间可以确保ARP缓存表中的映射关系始终是最新的,避免因表项过期而导致的通信失败。
安全性考虑:
在某些情况下,ARP缓存表可能成为网络攻击的目标。通过定期清理过期的表项,可以减少攻击者利用ARP缓存表进行网络攻击的机会。
ARP缓存表项过期时间的具体设置
动态表项:
动态表项是由ARP协议自动生成的,它们存在最大老化时间。这个时间长度因操作系统和网络环境而异,但通常是几分钟到几十分钟不等。例如,在Windows系统中,动态ARP缓存项的TTL(生存时间)一般不超过10分钟。
如果在老化时间内没有使用该ARP表项进行通信,那么该表项就会被自动删除。如果在计时期间又被使用了,计时会重置。
静态表项:
静态表项是由管理员手动配置的,它们不会自动老化。静态表项通常用于固定主机或服务器的IP地址与MAC地址绑定,以防止ARP攻击或其他网络问题。
综上所述,ARP缓存表及其表项过期时间的设置是为了提高网络通信效率、节省网络资源、适应网络变化以及增强网络安全性。这些机制共同构成了ARP协议高效运行的基础。

ARP数据报的格式

在这里插入图片描述

在这里插入图片描述

以太网帧

在这里插入图片描述

结合认识

在这里插入图片描述

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

详细字段解释

ARP(Address Resolution Protocol)地址解析协议是一种用于将IP地址解析为物理MAC地址的协议,它在数据链路层上操作。ARP报文承载在链路层帧中,以太类型为0x0806。ARP报文通常包含多个字段,以下是对这些字段的简要叙述:

ARP报文字段

  1. 硬件类型(Hardware Type)
    指示硬件地址的类型,如以太网的硬件类型为1。这个字段指明了可以在哪种类型的网络上传输。
  2. 协议类型(Protocol Type)
    指示上层协议类型,如IPv4的协议类型为0x0800。这个字段表示ARP报文要映射的协议地址类型。
  3. 硬件地址长度(Hardware Address Length)
    表示硬件地址的长度,以字节为单位。对于以太网MAC地址,此处为6字节。
  4. 协议地址长度(Protocol Address Length)
    表示协议地址的长度,以字节为单位。对于IPv4地址,此处为4字节。
  5. 操作码(Opcode)
    指示ARP请求或响应的类型。常见的值有:
    1:表示ARP请求(ARP request)
    2:表示ARP响应(ARP reply)
    3:表示RARP请求(RARP request,反向地址解析协议请求)
    4:表示RARP响应(RARP reply)
  6. 发送者硬件地址(Sender Hardware Address)
    指示ARP请求或响应的发送设备的物理MAC地址。在ARP请求中,这是请求发起者的MAC地址。
  7. 发送者协议地址(Sender Protocol Address)
    指示ARP请求或响应的发送设备的协议地址,如IPv4地址。在ARP请求中,这是请求发起者的IP地址。
  8. 目标硬件地址(Target Hardware Address)
    在ARP请求中,这个字段通常被设置为全0,表示请求的目标MAC地址未知。在ARP响应中,这个字段包含目标设备的真实MAC地址。
  9. 目标协议地址(Target Protocol Address)
    指示ARP请求或响应的目标设备的协议地址,如IPv4地址。在ARP请求中,这是请求解析的目标IP地址。

注意事项

ARP报文封装在以太网帧中进行传输,当操作码为1(ARP请求)时,目的MAC地址通常为广播地址ff:ff:ff:ff:ff:ff,以便在局域网内广播ARP请求。
当操作码为2(ARP响应)时,目的MAC地址则为目标设备的MAC地址,以单播方式发送给请求方。
ARP缓存表用于存储IP地址与MAC地址的映射关系,以提高通信效率。缓存表中的表项会有过期时间,以避免表项积累过多和适应网络变化。

ARP 协议原理

数据发送到目标网络是通过无数个连续的子网实现的。主机A有一个数据包通过无数的子网送到了主机B的入口路由器处,这个路由器经过该数据包的目标 IP 地址可以知道它就是要进入这个路由器所在子网。路由器需要经过内网转发将数据转发到主机B,需要进行局域网通信,需要封装 Mac 帧,需要知道主机B的 Mac 地址,但是路由器不一定知道主机B的 Mac 地址!需要有一种技术,在局域网中,将目标主机的 IP 地址转化为目标主机的 Mac 地址,称为 ARP 协议/局域网协议。

当入口路由器收到一个数据包,会在局域网中广播一条消息,发送 ARP 协议请求,当主机B得知该报文的 IP 地址是自己时,通过 ARP 响应返回自己的 Mac 地址给主机A,主机A就能知道目标 IP 地址的 Mac 地址了。通过目标 IP 地址得到对应主机的 Mac 地址, ARP 协议建立了主机 IP 地址和 MAC 地址的映射关系。

发送 ARP 请求时目的以太网地址和 以太网帧 报头中的目的以太网地址,一般设为全F,表示广播报文。对于广播报文所有的主机都要进行 Mac 报头的解析,并查看 ARP 协议中的目的 IP 地址是否是自己,如果不是就在当前数据链路层的上层 ARP 层直接丢弃,否则就给对方响应 ARP 应答。

在 ARP 过程中,收到的任何 ARP 报文,都是先看 op 字段!因为 op 决定了 ARP 的请求与应答。
并不是每一次通信都需要 ARP 的过程,主机的 Mac 地址和 IP 地址会被主机临时缓存起来,只有在 ARP 缓存失效的时候,才会进行 ARP 过程。通过 arp -a 查看每台主机的 ARP 缓存表

通过自己的 IP 地址和子网掩码按位与,得到网络号,拼接 IP 地址,ping 所有的主机,得到所有主机的 IP 和 Mac。

ARP 欺骗

如果主机收到多次同样的 ARP 应答,会以最新的为准。如果有一台主机A,在它的 ARP 缓存中存在路由器R的 IP 地址和 Mac 地址的缓存,此时有一台主机M,给主机A发送大量的路由器R的IP和主机M的Mac地址的映射ARP响应,主机A认为 ipR:MacR 发生了变化,就会更改该缓存的映射关系,如果主机A想要进行通信,都要经过主机M,如果主机M直接把主机A的报文丢弃,会导致主机A断网!把这种给主机发送大量的ARP应答的称为 ARP 欺骗。本来主机A和路由器正常通信,如今主机A把M当作路由器,如果M对A的请求丢弃,A会直接断网。如果M以同样的方式欺骗路由器,不断地给路由器说我是A……,路由器就会认为M是A,之后M把A的请求发给路由器,收到响应后把响应再给A,当然M可以查看和修改,这时A和路由器(代指另一端或者是服务器或是这是另一端设备)不就相当于裸奔!主机A和路由器R并不知道主机M的存在,所以主机M成为了所谓的“中间人”!这种就是基于 ARP 的称为“中间人”的方式!

自我防护ARP欺骗:将动态IP-MAC改为静态

在这里插入图片描述

3.DNS(Domain Name System)

一整套从域名映射到IP的系统

背景

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

最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件的.
如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.这样就太麻烦了,于是产生了DNS系统.
DNS:一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系
如果新计算机接入网络, 将这个信息注册到数据库中;
用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今, 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容.

cat /etc/hosts 

域名

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

www. baidu.com

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

从输入url后到能看到网页 发生了什么【典中典】

http过程+域名解析
https提一下
谈论细节

4.ICMP协议:一个网络层协议

一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因.

除了有tcp/udp套接字,应用层还有原始套接字,绕过传输层直接到达网络层基于ICMP协议,

ICMP功能

ICMP正是提供这种功能的协议; ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要用ICMPv6

ICMP大概分为两类报文:

一类是通知出错原因
一类是用于诊断查询

有了TCP,为什么还要用ICMP

尽管TCP(传输控制协议)提供了可靠的端到端数据传输服务,但ICMP(因特网控制报文协议)在网络通信中仍然扮演着不可或缺的角色。主要原因如下:

错误报告:TCP主要关注数据包的可靠传输,但它并不直接报告网络层(如IP层)发生的错误。ICMP则用于在IP主机和路由器之间传递控制消息,报告如主机不可达、路由不可达、数据包超时等网络层错误。这些报告有助于发送方了解数据包无法传输的原因,从而采取相应的措施。
流量控制和差错控制:ICMP不仅报告错误,还能提供有关网络状况的信息,使上层协议(包括TCP)能够通过自己的差错控制程序来判断通信是否正确,以进行流量控制和差错控制,从而保证服务质量。
网络诊断和故障排除:ICMP报文可以用于诊断网络故障,如通过Ping命令测试网络的连通性,通过Tracert命令追踪数据包的路径等。这些功能对于网络管理员来说至关重要。
路径MTU探索:ICMP还用于路径MTU(最大传输单元)探索,帮助确定数据包在无需分片的情况下能够传输的最大长度,从而避免数据包因过大而被丢弃。
综上所述,ICMP和TCP在网络通信中各自承担不同的职责,相互补充,共同确保网络通信的可靠性和效率。

ICMP协议字段

在这里插入图片描述

ICMP报文格式包括固定的头部和可变的数据部分。ICMP头部的长度为8字节,主要字段如下:

字段名称 长度(字节) 描述
Type 1 类型字段,指示ICMP消息的类型。例如,回显请求的类型为0,回显应答的类型为8。
Code 1 代码字段,用于指示ICMP消息的具体信息。例如,回显请求和回显应答的代码都为0。
Checksum 2 校验和字段,用于检验ICMP数据报的正确性,包括ICMP头部和数据部分。
Identifier 2 识别码字段,用于唯一标识一个ICMP请求和应答。
Sequence Number 2 序列号字段,用于标识ICMP请求和应答的序列。

ICMP报文的数据部分长度可变,根据不同类型的ICMP数据包而定。例如,在回显请求和回显应答中,数据部分通常包含用户自定义的数据,用于测试网络的连通性和性能。

这些字段共同构成了ICMP报文,使得ICMP能够在网络层有效地传递控制和错误信息,支持网络的正常运行和故障诊断。

ping命令

一个域名可以通过DNS解析成IP地址.ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存周期).ping命令会先发送一个ICMP Echo Request给对端;对端接收到之后,会返回一个ICMP Echo Reply;
ping命令是一个常用的网络工具,用于测试主机之间网络的连通性。它基于ICMP(Internet Control Message Protocol,因特网控制报文协议)工作,通过发送ICMP回显请求消息给目标主机,并等待接收回显应答。

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

ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息.

ping命令的基本用法:
测试连通性:
bash
ping <目标主机的IP地址或域名>
例如,ping 192.168.1.1 或 ping google.com。

指定发送的数据包数量:
bash
ping -c <数量> <目标主机的IP地址或域名>
例如,ping -c 4 192.168.1.1 发送4个数据包。

设置数据包的大小:
bash
ping -s <大小> <目标主机的IP地址或域名>
例如,ping -s 1000 192.168.1.1 设置数据包大小为1000字节。

设置超时时间:
bash
ping -W <超时时间> <目标主机的IP地址或域名>
例如,ping -W 5 192.168.1.1 设置超时时间为5秒。

ping命令的工作原理:
发送ICMP回显请求:
当执行ping命令时,源主机向目标主机发送一个ICMP回显请求消息。
接收ICMP回显应答:
如果目标主机可达,它将回复一个ICMP回显应答消息给源主机。
计算往返时间:
源主机接收到回显应答后,计算往返时间(RTT),即请求和应答之间的时间差。
显示结果:
ping命令将显示发送和接收的数据包数量、丢失的数据包数量以及往返时间的统计信息。
ping命令的应用场景:
测试网络连接是否正常。
诊断网络故障,如路由器故障、网络拥堵等。
测量网络延迟和丢包率。
验证DNS解析是否正确。
总之,ping命令是一个简单而强大的网络工具,对于网络管理员和普通用户来说都非常有用。

traceroute命令

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

5.NAT技术

NAT技术背景

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

NAT IP转换过程

NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系

NAPT

那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
在这里插入图片描述
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项

NAT技术的缺陷:由于NAT依赖这个转换表, 所以有诸多限制

无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;

NAT穿越
NAT穿越(NAT traversal),又称NAT穿透,是指在存在NAT(Network Address Translation,网络地址转换)设备的网络环境中,实现两个位于不同NAT网络之间的主机进行直接通信的技术。NAT的存在使得私有IP地址在经过NAT设备时会被转换为公网IP地址,因此通常情况下,位于不同NAT网络的主机无法直接进行通信。然而,通过使用NAT穿越技术,可以绕过NAT的限制,实现跨越NAT网络的直接通信。

NAT穿越的原理
NAT穿越的原理主要是通过使用中继服务器(Relay Server)来实现跨越NAT网络的通信。中继服务器作为公网上的一个中介,它处于位于不同NAT网络的主机之间,并负责转发数据报文。客户端A和客户端B分别位于不同的NAT网络中,无法直接通信。通过中继服务器,客户端A和客户端B可以建立连接并进行数据传输,从而实现直接通信。

NAT穿越的方法
实现NAT穿越的方法有多种,以下是其中一些常用的方法:

UPnP(Universal Plug and Play):
UPnP是一种网络协议,可自动配置NAT设备以允许内部设备通过NAT进行外部通信。
通过使用UPnP,内部设备可以向NAT设备发送请求,动态创建端口映射,从而实现NAT穿越。
STUN(Session Traversal Utilities for NAT):
STUN是一种协议,用于检测NAT设备后面的公网IP和端口信息。
通过STUN服务器,客户端可以获取自己的公网IP和端口信息,并将其用于建立与其他位于不同NAT网络中的客户端的直接连接。
TURN(Traversal Using Relays around NAT):
TURN是一种基于中继服务器的NAT穿越方法。
当直接的点对点连接无法建立时,客户端可以通过TURN服务器作为中继,在服务器上进行数据传输,实现NAT穿越。
ICE(Interactive Connectivity Establishment):
ICE是一种综合性的NAT穿越解决方案,它结合了STUN、TURN和其他相关协议。
ICE使用候选地址和候选传输方式,尝试各种可能的连接方式,以找到最佳的通信路径,从而实现NAT穿越。
NAT穿越的应用场景
NAT穿越技术在许多应用场景中得到广泛应用,包括但不限于:

网络游戏:
玩家通常需要进行实时的多人游戏,而玩家之间可能位于不同的NAT网络中。
通过使用NAT穿越技术,玩家可以直接建立P2P连接,实现低延迟的游戏体验,而无需借助中间服务器进行数据转发。
文件共享:
如果位于不同NAT网络中,直接的点对点连接通常是不可行的。
通过使用NAT穿越技术,用户可以直接建立文件传输的连接,方便快速地共享文件。
实时通信应用:
如视频会议、语音通话和实时聊天等,通常需要快速、稳定的连接以实现实时的数据传输。
通过使用NAT穿越技术,参与通信的用户可以直接建立点对点连接,提供更好的通信质量和用户体验。
远程访问:
用户需要从外部网络访问位于内部网络的设备或资源。
通过使用NAT穿越技术,用户可以直接访问内部网络中的设备,如远程桌面、网络摄像头或家庭自动化设备等,而无需依赖复杂的端口映射或VPN设置。
物联网(IoT):
物联网设备的快速发展导致了大量的设备连接到网络中,这些设备可能位于不同的NAT网络中。
NAT穿越技术可以帮助这些设备直接进行通信,实现设备之间的数据交换和互操作性,为物联网应用提供更多的灵活性和可扩展性。
安全性考虑
在使用NAT穿越技术时,安全性是一个重要的考虑因素。以下是一些确保数据安全的方法:

认证与授权:
在NAT穿越过程中,确保中继服务器对连接进行认证和授权是至关重要的。
只有经过验证的客户端才能与中继服务器进行通信,并且需要进行适当的权限管理,以防止未经授权的访问。
数据加密:
为了保护数据在NAT穿越过程中的安全,可以使用加密算法对传输的数据进行加密。
通过使用加密技术,可以防止第三方窃听或篡改数据。
防火墙和安全策略:
在NAT穿越过程中,中继服务器和NAT设备之间应配置适当的防火墙和安全策略。
这些安全措施可以限制来自外部网络的未经授权访问,并提供额外的安全保护。
定期更新和安全审计:
保持中继服务器和NAT设备的软件和固件更新是保持系统安全的关键。
及时应用厂商提供的安全补丁和更新,以防止已知的安全漏洞。此外,定期进行安全审计和漏洞扫描,可以及时发现并纠正可能存在的安全问题。
综上所述,NAT穿越技术为解决由NAT带来的通信限制提供了一种有效的解决方案,并在许多实际应用中发挥着重要作用,为用户提供了更好的连接体验和更广泛的网络互联性。然而,在应用该技术时,需要仔细评估和权衡其可能引入的网络复杂性和性能开销,并确保满足特定应用场景的需求和安全性要求。

NAT穿越(NAT Traversal)和内网穿透(NAT Penetration或NAT Traversal,这里特指实现内网设备被外网访问的技术)

在网络通信领域扮演着重要角色,它们都是为了解决NAT(网络地址转换)带来的通信限制问题,但在具体实现和应用场景上存在一些差异。

NAT穿越
定义:
NAT穿越是指在存在NAT设备的网络环境中,实现两个位于不同NAT网络之间的主机进行直接通信的技术。它允许私有网络中的设备通过NAT与公共网络中的设备进行直接通信,而无需通过NAT设备本身进行地址转换。

实现方式:
NAT穿越可以通过多种技术实现,包括但不限于:

UPnP(Universal Plug and Play):自动配置NAT设备以允许内部设备通过NAT进行外部通信。
STUN(Session Traversal Utilities for NAT):帮助客户端发现其在NAT后面的公网IP和端口信息,从而建立直接连接。
TURN(Traversal Using Relays around NAT):当直接连接无法建立时,通过中继服务器转发数据实现NAT穿越。
ICE(Interactive Connectivity Establishment):结合STUN、TURN等协议,自动选择最优的通信路径实现NAT穿越。
应用场景:
NAT穿越广泛应用于需要直接通信的场景,如网络游戏、实时通信应用(视频会议、语音通话)、远程访问、物联网设备通信等。

内网穿透
定义:
内网穿透特指一种技术,它允许外部网络(如互联网)直接访问内部网络(如局域网)中的设备或服务。内网穿透通过在外网建立通道,使得外部网络能够绕过NAT设备的限制,直接访问内网中的资源。

实现方式:
内网穿透通常涉及以下几种方法:

端口映射:在NAT设备上配置端口映射规则,将外网的端口映射到内网的特定设备上。但这种方法需要手动配置NAT设备,且可能受到NAT类型和设备限制。
使用第三方服务:如Ngrok、花生壳、FRP等内网穿透工具,这些工具提供了易于使用的内网穿透服务,用户只需简单配置即可实现内网服务的外部访问。
反向代理或中继服务器:通过设置反向代理服务器或中继服务器,将外部请求转发到内网中的目标设备。这种方法不需要修改NAT设备的配置,但可能会增加网络延迟和带宽消耗。
应用场景:
内网穿透适用于需要从外部网络访问内部网络资源的场景,如企业远程办公、开发人员远程调试、数据远程同步、远程监控、远程联机游戏、文件远程共享等。

区别总结
NAT穿越 内网穿透
目标 实现不同NAT网络之间主机的直接通信 允许外部网络直接访问内部网络资源
实现方式 UPnP、STUN、TURN、ICE等多种技术 端口映射、第三方服务、反向代理或中继服务器
应用场景 网络游戏、实时通信、远程访问、物联网设备通信等 企业远程办公、开发人员远程调试、数据远程同步、远程监控、远程联机游戏、文件远程共享等
关注点 解决NAT限制下的直接通信问题 实现外部对内部网络资源的访问

综上所述,NAT穿越和内网穿透都是为了解决NAT带来的通信限制问题,但它们在实现方式、应用场景和关注点上存在一定差异。在实际应用中,可以根据具体需求选择合适的技术方案。

NAT和代理服务器

路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.

那么NAT和代理服务器的区别有哪些呢?

从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换(现如今已经可以工作在应用层了). 代理服务器往往工作在应用层.
从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.

代理服务器是一种应用比较广的技术.

翻墙: 广域网中的代理.:http嵌套/http隧道技术。http默认携带是其他的非http数据==》http正文可以携带其他类型的数据。
负载均衡: 局域网中的代理.

代理服务器又分为正向代理和反向代理.

代购例子:花王尿不湿是一个很经典的尿不湿品牌, 产自日本.
我自己去日本买尿不湿比较不方便, 但是可以让我在日本工作的表姐去超市买了快递给我. 此时超市看到的买家是我表姐, 我的表姐就是 “正向代理”;
后来找我表姐买尿不湿的人太多了, 我表姐觉得天天去超市太麻烦, 干脆去超市买了一大批尿不湿屯在家里, 如果有人来找她代购, 就直接把屯在家里的货发出去, 而不必再去超市. 此时我表姐就是 “反向代理”
正向代理用于请求的转发(例如借助代理绕过反爬虫).
反向代理往往作为一个缓存.
:提供服务的公司内有多台服务器,如何让这些服务器均衡的使用,不至于有些服务器很忙,有些很闲?

在这里插入图片描述

6.总结

每一个子网都有自己的子网IP和子网掩码。
ifconfig查看当前主机的IP和子网掩码可以获得网络号和主机号范围,进而可以得知和我这台主机相连的同属于同一子网的其他主机IP,对其他主机ping指令,获取IP和MAC的映射,该映射关系会存在一段时间(对方可能更换网卡,所以该映射不会一直存在,一段时间就会过期废弃),通信时直接使用,不再现用现广播获取。

子网设备太多,natp容纳不下

  1. 路由器natp有限,不够就再多构建一个子网。不用非得向nat表硬塞
  2. 不允许子网设备太多–增加碰撞

nat的设计使得公网设备想跟子网设备通信需要映射关系,而映射关系是子网设备先跟公网设备通信时路由器建立的,所以,平常的抖音等等软件使用一些功能时需要先登录。

在这里插入图片描述

在这里插入图片描述

内网穿透联机的原理

内网穿透联机有多种方法,常见的包括使用内网穿透工具(如FRP、Ngrok、花生壳等)和VPN技术。以FRP为例,内网穿透的大致步骤如下:

在具有公网IP的服务器上部署FRP服务端。
在内网机器上安装FRP客户端,并配置好与服务端的连接信息。
通过FRP客户端将内网服务的端口映射到公网IP上。
外部用户通过访问公网IP和映射的端口即可访问内网服务。

用公司的电脑访问家里的电脑

如果家里电脑直接连接到公网,并且有固定的公网IP地址,那么可以直接使用这个IP地址进行远程访问。
如果家里电脑处于内网环境(如使用路由器上网),那么需要获取内网IP地址,并通过端口映射或内网穿透技术来实现远程访问。

在学校用手机4g联网是通过运营商路由器直接访问公网。而有线/无线的校园网?

校园网认证:分配给你IP地址;通过学校的正向代理服务器访问公网。
如果有同学看电影,有的学校可能会把电影缓存,在正向代理服务器内做一个内置小网站,给别的同学看缓存后的电影—节约资源。

网络原理总结

数据链路层

数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

以太网帧格式

理解mac地址
理解arp协议
理解MTU

网络层

网络层的作用: 在复杂的网络环境中确定一个合适的路径.
理解IP地址, 理解IP地址和MAC地址的区别.
理解IP协议格式.
了解网段划分方法
理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP
理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.
理解IP数据包分包的原因.
了解ICMP协议.
了解NAT设备的工作原理.

传输层

传输层的作用: 负责数据能够从发送端传输接收端.
理解端口号的概念.
认识UDP协议, 了解UDP协议的特点.
认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.
理解TCP面向字节流, 理解粘包问题和解决方案.
能够基于UDP实现可靠传输.
理解MTU对UDP/TCP的影响.

应用层

应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
能够根据自己的需求, 设计应用层协议.
了解HTTP协议.
理解DNS的原理和工作流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于电脑的硬盘,你知道那些?

硬盘是一种主要用于存储数据的非易失性存储设备。它通过磁性存储技术在旋转的磁盘上读取和写入数据。硬盘通常安装在计算机内部&#xff0c;但也有外置硬盘供外部使用。 磁盘是什么&#xff1f;与硬盘有什么区别&#xff1f; 磁盘是一个更泛化的术语&#xff0c;可以指代任何使…

黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录 Day4

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会…

DWG文件发布至IIS后无法下载和预览解决办法

问题描述 DWG文件发布至IIS后无法下载和预览 原因分析&#xff1a; iis里面需要添加扩展 解决方案&#xff1a; 在服务器端IS属性的HTTP头下的MIME内容中添加扩展名“.dwg” MIME类型填入application/acad

分布式锁理解

介绍分布式锁&#xff0c;我觉得从项目的背景入手把 在伙伴匹配系统中&#xff0c;我创建了一个定时任务&#xff0c;做为缓存预热的手段 这个具体原因在Redis-CSDN博客 接下来切入正题&#xff1a; 想象每个服务器都有一个定时任务&#xff0c;都要对数据库或者缓存进行操…

C语言作业5(学生管理系统C语言)

成学生管理系统 1> 使用菜单完成 2> 有学生的信息录入功能&#xff1a;输入学生个数&#xff0c;并将学生的姓名、分数录入 3> 查看学生信息&#xff1a;输出所有学生姓名以及对应的分数 4> 求出学习最好的学生信息&#xff1a;求最大值 5> 按姓名将所有学…

Hyper-V 性能监控工具

虚拟化是任何组织网络管理战略不可或缺的一部分&#xff0c;对于帮助提高网络效率和资源可用性至关重要。采用虚拟基础架构具有多种好处&#xff0c;例如最大限度地减少停机时间、降低运营成本和提高生产力。 在所有虚拟服务器中&#xff0c;Microsoft Hyper-V因其多功能性和可…

亚马逊测评如何实现不同账户拥有独立运行环境,提高成功率

测评之所以被认为是最快速有效的推广方式&#xff0c;是因为它能够迅速影响多个关键因素。通过测评&#xff0c;您能够快速提升关键词的转化率&#xff0c;从而获得更好的搜索排名。优质的评价有助于增加产品的权重和转化率&#xff0c;进一步提升排名。同时&#xff0c;增加的…

在Windows环境下安装pycharm

Python环境搭建 第一步下载安装python 等待安装完成 验证python是否安装成功 Python开发工具安装部署 JetBrains: Essential tools for software developers and teams PyCharm: the Python IDE for data science and web development 下载社区版本的PyCharm 双击打开下载好的…

花几千上万学习Java,真没必要!(一)

1、主流的操作系统&#xff1a; 目前主流的PC端操作系统包括Windows、Mac OS和Linux。其中Windows是由微软公司开发的操作系统&#xff0c;Mac OS是由苹果公司开发的操作系统&#xff0c;而Linux则是开放源代码的操作系统&#xff0c;它有很多的发行版&#xff1a;比如&#xf…

PostgreSQL(二十二)缓冲区管理器

目录 一、缓冲区概述 1、缓冲区结构 2、buffer_tag结构 3、Backend进程读取操作 4、写脏块 二、缓冲区管理器结构 1、第一层&#xff1a;Buffer Table layer&#xff08;缓冲区表层&#xff09; 2、第二层&#xff1a;Buffer Descriptor Layer&#xff08;缓冲区描述层…

Vue2-动画

1.transition过渡 | 用transition CSS做动画 Vue-transition文档&#xff1a;进入/离开 & 列表过渡 — Vue.js [用transition做CSS动画]Enter状态&#xff1a;JS Bin - Collaborative JavaScript Debugging Leave状态&#xff1a;JS Bin - Collaborative JavaScript Debug…

经验分享:征信查询多了会不会影响大数据综合评分?

很多人在申请贷款的时候&#xff0c;会有一个疑问&#xff0c;就是自己的征信没逾期&#xff0c;就是查询偏多一点&#xff0c;但能达到申贷要求&#xff0c;为什么还会被拒贷?其实就是大数据花了的原因&#xff0c;那征信查询多了会不会影响大数据综合评分呢?接下来本文就为…

【C++】继承最全解析(什么是继承?继承有什么用?)

目录 一、前言 二、什么是继承 ? &#x1f4a2;继承的概念&#x1f4a2; &#x1f4a2;继承的定义&#x1f4a2; &#x1f95d;定义格式 &#x1f347;继承权限 三、基类与派生类对象的赋值转换 四、继承的作用域 五、派生类中的默认成员函数 &#x1f4a2…

[leetcode]minimum-cost-to-reach-destination-in-time 规定时间内到达终点的最小费用

. - 力扣&#xff08;LeetCode&#xff09; class Solution { private:// 极大值static constexpr int INFTY INT_MAX / 2;public:int minCost(int maxTime, vector<vector<int>>& edges, vector<int>& passingFees) {int n passingFees.size();ve…

windows节点加入一个Linux集群组成的kubernetes集群

windows节点加入一个Linux集群组成的kubernetes集群 背景描述一.准备环境搭建二.Windows上docker安装三.配置Windows server2019方法一&#xff1a;自动配置安装方法二&#xff1a;手动配置安装失败处理过程 四.Windows的node加入Linux的kubernetes集群五.配置Linux的master 背…

在linux中查找 / 目录下的以.jar结尾的文件(find / -name *.jar)

文章目录 1、查找 / 目录下的以.jar结尾的文件 1、查找 / 目录下的以.jar结尾的文件 [rootiZuf6332h890vozldoxcprZ ~]# find / -name *.jar /etc/java/java-1.8.0-openjdk/java-1.8.0-openjdk-1.8.0.342.b07-1.el9_0.x86_64/lib/security/policy/limited/US_export_policy.ja…

初学SpringMVC之过滤器解决乱码

写个 login.jsp 页面 提交的 method 一般为 post&#xff08;写 get 不安全&#xff0c;地址栏上会显示&#xff09; action 表示提交后跳转的地址 &#xff08;不直接写控制器里的路径是因为配置 Tomcat 时设置了前缀路径&#xff0c;默认走 http://localhost:8080&#xf…

Linux ---gcc

c语言的链接类型&#xff1a; 动态链接&#xff1a; ll /lib64/libc-2.17.so 静态链接&#xff1a; ll /lib64/libc.a glibc-static安装-CSDN博客https://blog.csdn.net/itas109/article/details/104226783在Linux中下载c语言的静态库。 gcc test.c -o test.s -static 以…

代码随想录二刷7.22|977.有序数组的平方

暴力解法&#xff1a; ——如果想暴力解决这个问题的话&#xff0c;可以像题目那样&#xff0c;先将每一个元素平方&#xff0c;然后再排序 双指针&#xff1a; ——从题目中找到的信息&#xff1a;这是一个非递减顺序的整数数组&#xff0c;从例子中&#xff0c;可以容易看…

搭建NEMU与QEMU的DiffTest环境(Socket方式)

搭建NEMU与QEMU的DiffTest环境&#xff08;Socket方式&#xff09; 1 简述2 编译NEMU2.1 配置2.2 修改NEMU/scripts/build.mk2.3 修改isa_difftest_checkregs函数2.4 修改isa_pmp_check_permission函数2.5 编译 3 编译qemu-socket-difftest3.1 修改NEMU/scripts/isa.mk3.2 修改…