目录
一、前言
二、以太网
二、以太网帧格式
三、 MAC地址
四、MTU
1、数据链路层的数据分片
2、MTU对UDP协议的影响
3、MTU对TCP协议的影响
五、ARP协议
1、什么是ARP
2、ARP的作用
3、ARP协议的工作流程
4、ARP缓存表
5、ARP请求报文
6、中间人
六、DNS, Domain Name System
1、DNS
2、域名简介
七、ICMP协议的简单认识
1、定义
2、功能
3、ICMP报文格式
八、ping命令
九、 traceroute命令
十、NAT技术
1、定义
2、NAT IP转换过程
3、NAPT
4、NAT技术的缺陷
十一、代理服务器
1、定义
2、正向代理和反向代理
正向代理
反向代理
3、负载均衡
常见的负载均衡算法
一、前言
上篇文章中,我们对网络协议栈中的网络层进行了详细的介绍,但是我们需要知道的是网络层并不会真正的传输数据。真正负责数据或者对数据进行传输的是数据链路层。
二、以太网
以太网其实并不是一种具体的网络,而是一种技术标准,是一种广泛使用的局域网(LAN)技术,用于在设备之间进行数据通信,即包含了数据链路层的內容也包含了一些物理层的內容,例如规定了网络拓扑结构、访问控制方式、传输速率等
-
传输介质:早期的以太网使用同轴电缆作为传输介质,但现代以太网通常使用双绞线(如Cat5e、Cat6等)或光纤。不同的传输介质支持不同的传输速度和距离。
-
传输速率:以太网的传输速率从最初的10Mbps发展到如今常见的100Mbps(快速以太网)、1Gbps(千兆以太网)、10Gbps、40Gbps甚至100Gbps,适用于不同需求的网络环境。
-
拓扑结构:传统的以太网采用总线型拓扑结构,但现在更常用的是星型拓扑结构,其中所有设备都通过交换机连接在一起。
-
帧格式:以太网的数据单位称为帧,每个帧包含源地址、目标地址、类型/长度字段以及有效载荷数据和帧校验序列(FCS)。这些信息帮助确保数据能够准确无误地到达目的地。
-
访问方法:以太网采用载波监听多路访问/冲突检测(CSMA/CD)机制来管理网络上多个设备试图同时发送数据的情况。不过,在全双工模式下,这种冲突检测机制不是必需的,因为数据可以在同一时间双向流动。
以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网、无限LAN等
二、以太网帧格式
我们知道在通信过程中,每层协议都要加上一个数据首部,即封装。
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
以太网帧格式如图所示
- 源地址和目的地址是指网卡的硬件地址,即MAC地址,长度是48位,是在网卡出厂时固化的。
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP
- 帧末尾是CRC(Cyclic Redundancy Check))校验码,它是一种错误检测技术,用于确保数据在传输过程中没有被损坏或修改。
三、 MAC地址
MAC地址(Media Access Control Address,媒体访问控制地址)是网络设备的物理地址,用于在局域网(LAN)中唯一标识一个网络接口。每个网络接口卡(NIC, Network Interface Card)都有一个全球唯一的MAC地址,这确保了在同一网络内不会有两个设备拥有相同的MAC地址。
-
格式:标准的MAC地址由6组两位的十六进制数表示,每组之间通常用冒号(:)、连字符(-)或不使用分隔符来分开。例如,00:1A:2B:3C:4D:5E。
-
长度:MAC地址总共有48位(6字节),其中前24位(3字节)是由IEEE分配给制造商的组织唯一标识符(OUI, Organizationally Unique Identifier),用来识别制造该设备的公司或厂商;剩下的24位则由制造商自行管理,用于区分不同的设备。
-
局域网内的通信:MAC地址主要用于局域网内的直接通信,如以太网、Wi-Fi等。在网络层协议(如IP)之下,数据链路层利用MAC地址进行帧的传输。
-
ARP协议:在IP网络中,地址解析协议(ARP, Address Resolution Protocol)用于将IP地址映射到对应的MAC地址上,以便能够通过二层网络进行数据包的发送。
所以MAC地址就是用来识别数据链路层中相连的节点。
那么IP地址和MAC地址的关系是什么呢?
还拿我们之前的唐僧取经的例子来说,IP地址就是路途的起点和终点。而MAC地址描述的是路途上每一个区间的起点和终点。
四、MTU
我们知道TCP协议是传输控制协议,它能决定每次发送的单个报文的大小,在我们学习滑动窗口的时候,有没有这样的疑惑?那就是既然已经知道了自己和接收方的可接受报文的大小,为什么一次将一个大的报文发过去,却还是需要分成部分发呢?
我们知道在网络协议栈中实际对数据进行转发路由的是数据链路层。
在数据传输过程中,由于链路层物理特征的原因,不同的数据链路对应的物理层对传输的数据包有着不同的限制了,就像是我们寄快递一样,不同的快递方限制了不同的快递包大小。
以太网帧中的数据长度规定最小是46字节,最大是1500字节,APR数据包的长度不够46字节的需要在后面补充。这个最大值1500就称为以太网的最大传输单元,不同的网络类型有着不同的MTU。
所以MTU称为Maximum Transmission Unit(最大传输单元),是指在网络层(如IP层)上能够发送的最大数据包大小,包括报头和数据部分。它通常以字节数为单位表示。MTU对网络通信非常重要,因为它影响到数据传输的效率和网络的性能。
如果一个数据从以太网路由到拨号链路上,数据包的长度大于拨号链路的MTU,则需要对该数据包进行分片(fragmentation)。
不同数据链路层标准的MTU是不同的。
在网络通信中,数据传输的基本单位是数据包。每个数据包包含数据以及相关的控制信息。MTU定义了一个数据包的最大大小,超过这个大小的数据包需要分片成更小的数据包进行传输,然后在目的地重新组装。我们也可在Linux下查看自己主机的MTU大小,具体如下图:
1、数据链路层的数据分片
那么问题来了,这些超过MTU的数据包是在哪里分片又在哪里组装呢?
分片行为是在发送方网络层发生的,分片之后将这些分片交给链路层,接收方在网络层向上交付时,也得需要一个完整的报文 ,所以也是在这里将分片进行组装。
下面我们看看具体的流程是什么样子的:
- 数据分片:假设我们此时需要发送一个大的IP数据包,他需要通过网络传输。首先,网络层会将这个IP数据包分成多个较小的分片,这些小的分片也属于IP数据包,所以它们也必须像大的数据包一样封装IP报头。
- 分片的传输:这些数据分片被分别发送到网络中,它们可以采用不同的路径,经过不同的路由器和链路,因为网络通常是不稳定的,所以分片的到达顺序也可能会发生变化。
- 目的地的分片接收:在目的地,网络层接收到这些分片,每个分片上都包含了偏移量和标识号,这些信息用于确定分片的正确顺序。
- 分片的组装:目的地的网络层将这些分片按照它们的偏移量和标识号重新组装成原始数据包,这个过程确保数据包的正确性和完整性。
- 上交给上层协议:一旦数据包被成功组装,它就会被传递给更高层的协议,比如传输层的TCP和UDP协议,以便最终交付给应用程序。
我们现在再来拿出之前的IP协议报头分析里面的标识位,标志位和偏移量的实际用途
下面我们,详解他们到底起到了什么作用,怎么用他们进行的分片与组装。
首先在分片之后:此时每个小IP分片的协议报头中的16位标识(id)都是一样的,且每个小IP分片的协议报头的3位标志字段中,第2位置置为0,表示允许分片;第三位表示结束标记,即如果当前的分片是整组分片的最后一个分片的话,此位就置为0,否则置为1.该位用来给接收方判断这批数据包是否全部接收到。
所以如果报文进行了分片,那么分片后形成的新的报文都是具有相同的标识位的。这也就能够在组装时很好的与其他报文分割开来了。
但是我们怎么知道这个报文是否进行了分片呢?如果该报文后有更多的分片了,标志位的最后一位会被设置为1。
这时还有一个问题:怎么组装起来呢,其实也就是怎么可以很好的将所有的分片进行按顺序组装呢?这个就用到 片偏移量 字段了。报文的第一个分片:标志位为1,片偏移量为0;报文的中间的分片:标志位为1,片偏移不是0;报文的最后一个分片:标志位为0,片偏移不是0。
怎么来确定是否有分片丢失呢?根据偏移量,来进行升序排序,结合偏移量+自身大小(16位总长度)看是否等于一个报文的偏移量。扫描整个报文如果不匹配,中间一定会有丢失的,如果成功计算到结尾,就一定收取完整了!
这个分片与组装的过程允许数据在不稳定的网络环境中可靠传输,因为即使某些分片到达顺序混乱,目的地仍然可以正确地重建原始数据包。这是网络通信中重要的一部分,特别是在广域网或互联网上,数据包可能需要经过多个路由器和链路才能到达目的地。但是实际上如果某个分片丢失或者受损,整个原始数据包将无法成功重组,接收端通常会因为缺少必要的分片而不得不丢弃整个数据包。
但是我们需要注意的是:主流情况下,都是不会进行分片的。TCP在发送数据时,就会决定发送数据的大小。一般情况下,结合MTU都是不会进行分片的。因为分片相对来说增加了丢包的概率,同时分片和组装也是有所消耗的。
怎么理解分片增加了丢包的概率:当我们发送方进行了分片发送后,只有当接收方收到了全部的分片报文并将其成功组装起来,这时我们才认为该数据被对方可靠的收到了。但如果众多的分片报文当中有一个报文出现了丢包,就会导致接收方就无法将报文成功组装起来,这时接收方会将收到的分片报文全部丢弃,此时传输层TCP会因为收不到对方应答而进行超时重传。简单理解:本来是一个报文就能解决的事,现在需要多个报文了。
我们还需要注意的是:除了源和目的地之外,在路径上的任何中间路由器都可能对数据包进行分片,前提是这些路由器没有被配置为禁止分片。如果一个中间路由器接收到一个不允许分片的数据包,但其大小超过该路由器出站接口的MTU,则该路由器将丢弃此数据包并向源地址发送ICMP消息(类型3,代码4),指示需要减小数据包大小。
2、MTU对UDP协议的影响
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了
3、MTU对TCP协议的影响
在使用TCP传输的情况下,如果某个分片丢失导致整个数据报不能被正确重组,TCP会检测到数据缺失并请求重传相应的数据段。因此,虽然IP层本身不具备修复丢失分片的能力,但结合传输层的可靠性机制,可以实现在网络不稳定环境下数据的可靠传输,但是分片会增加额外的开销,并可能导致性能下降或复杂性增加,特别是在其中一个分片丢失的情况下。
为了避免分片带来的问题,维护TCP传输的可靠性,MSS(Maximum Segment Size)技术被提出。
MSS(最大报文段长度)是TCP协议头部的40字节变长选项中。用于指示在建立TCP连接时双方愿意接受的最大TCP段长度(不包括TCP/IP头部的总长度),即数据段。MSS选项是在TCP三次握手期间通过SYN和SYN/ACK数据包进行协商的。
MSS的主要目的是为了防止数据包被分片。是在其中一个分片丢失的情况下。因此,通过合理设置MSS,可以避免数据包在传输过程中被分片,从而提高传输效率。
MSS的协商是为了确保通信的各个端点之间可以有效地传输数据,同时避免因数据段过大而导致的分段和数据包重传。MSS协商过程通常如下:
- 客户端发送一个TCP连接请求报文(SYN),其中包含自己支持的MSS大小。
- 服务器收到连接请求后,会检查客户端发送的MSS大小,并确定自己支持的MSS大小。
- 服务器在TCP连接响应报文(SYN-ACK)中回复客户端,其中包含服务器支持的MSS大小。
- 客户端收到服务器的响应后,会根据服务器支持的MSS大小来确定最终的MSS大小。
- 一旦MSS大小确定,双方就可以开始在这个MSS大小下进行数据传输。
MSS的协商过程的作用主要有以下几个方面:
- 避免分片:TCP协议要求数据在传输过程中不被分片,即一个TCP数据段的大小不能超过MSS。通过MSS协商,可以确保数据在传输过程中不会被分片,从而避免了额外的数据重组工作。
- 最大利用带宽:MSS的大小会影响每个TCP段的有效载荷大小,从而影响了数据传输的效率。通过协商一个合适的MSS大小,可以更好地利用网络带宽,提高传输效率。
- 减少拥塞:MSS协商也有助于减少网络拥塞的可能性。如果MSS大小合理,可以减少过大数据包引起的拥塞问题,提高网络性能。
举例来说,假设某个网络的MTU为1500字节,而MSS为1460字节。如果一台计算机想要向另一台计算机发送2000字节的数据,根据MTU的限制,这个数据在传输层会被分割成两个数据包,每个数据包的大小不能超过 1460 字节。在TCP协议中,每个数据包的大小将根据MSS的限制进行调整,确保TCP头部和数据部分的大小不超过1460字节。
五、ARP协议
通过上面的部分我们已经知道了IP协议和MAC地址,接下来我们就要探讨它们之间的关系了。
虽然,我们是在数据链路层这一篇文章中介绍ARP协议的,但是需要注意的是,ARP协议并不是一个单纯的数据链路层协议,而是一个介于数据链路层和网络层之间的协议。
1、什么是ARP
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写,是互联网协议族中的一员,主要用于将网络层(IP层,即第三层)的IP地址解析为数据链路层(第二层)的MAC地址。在局域网中,设备之间的通信需要知道对方的物理地址(MAC地址),而ARP协议正是用于实现这种转换的。
2、ARP的作用
在我们的网络通信中,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。而在以太网环境中,数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。
在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。
所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
3、ARP协议的工作流程
假设主机A和主机B处在同一个局域网,主机A想要给主机B发送信息,具体的地址解析如下:
- 首先,主机A会查看自己的ARP缓存表(一个临时存储最近映射关系的表),如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
- 如果主机A在ARP缓存表中找不到对应的MAC地址,则将缓存该数据报文,接着主机A就会广播一个ARP请求包到整个局域网。这个请求包含发送方的IP地址和MAC地址,即主机A的IP地址和MAC地址,以及目标设备的IP地址和目标设备的MAC地,即主机B的IP地址和全0的MAC地址(先填充全0).
- 由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,都会对接收到的报文做报头和有效载荷分离,然后验证自己的 IP与目标IP是否一致,不一致则丢弃,就不会向上交付,上面的也不知道收到了这个报文。只有被请求的主机(即主机B)会对该请求进行处理。
- 主机B比较自己IP地址和ARP请求报文中的 目标IP 地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播(也是封装后的)方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
- 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
如下
- 上面提到在ARP请求报文以广播方式发送的时候,该网段上的所有主机都可以接收到该请求,都会对接收到的报文做报头和有效载荷分离
- 所以在局域网中,网卡有一种模式称为 混杂模式,即不放弃任何数据帧,直接向上交付,这也就是局域网抓包工具的原理。所以http协议并不是十分安全的,因为数据包需要经过很多路由的时候,指不定哪个网卡就设置混杂模式。
- 在局域网中,任何时刻,只能有一个主机发送消息,如果多个消息被同时发送,会导致局域网中的数据发生碰撞,成为无效数据。该一个局域网称为一个碰撞域。所以针对这个问题,也有很多方案,比如令牌环网,就是持有令牌的主机才能发消息,发完之后将令牌转给下一个主机,类似锁。第二个就是以太网,它的策略是如果检测到发送的消息发生碰撞,数据链路层的协议就会触发策略,等一等,等待的时间根据情况定,然后再重新发送数据(主机的碰撞检测或者碰撞避免算法)。如果想要黑局域网,就只需要不断向局域网中发送垃圾数据,就像班里大喊大叫的。所以局域网不能太大,不然主机太多,容易碰撞。
那么能不能减少碰撞呢?
可以引入交换机,它可以识别局部性的碰撞,对碰撞数据不予转发。
4、ARP缓存表
每台主机都会维护一个ARP缓存表,使用 arp -a 查看,缓存表中的表项有过期时间(一般为20分钟),如果你20分钟没有再次使用某个表项,则该表项就失效,下次还要发送ARP请求来获得目的主机的MAC地址。
- IP地址: 每一行的第一个括号内的数字(如169.254.0.3)表示一个IP地址。
- MAC地址:at后面的字符串(如 fe:ee:7e:91:aa:82)表示与该IP地址对应的MAC地址。
- [ether]: 表示这是以太网设备。
- 接口名称: on eth0 表示这些映射关系是在 eth0 接口上记录的。
- ?: 表示这是一个动态学习到的ARP条目。
- gateway: 特殊标记,表示这是默认网关的条目。
例如:
? (169.254.0.3) at fe:ee:7e:91:aa:82 [ether] on eth0
这一行表示IP地址为 169.254.0.3 的设备对应的MAC地址是fe:ee:7e:91:aa:82,并且这个映射关系是在 eth0 接口上动态学习到的。
gateway (10.2.8.1) at fe:ee:7e:91:aa:82 [ether] on eth0
这表示默认网关的IP地址是 10.2.8.1,对应的MAC地址是fe:ee:7e:91:aa:82
5、ARP请求报文
ARP是一个独立的三层协议,所以ARP报文在向数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再由对应的数据链路层协议(如以太网协议)进行封装。ARP报文分为ARP请求和ARP应答报文两种,它们的报文格式可以统一为下图所示。
- 硬件类型:占两字节,表示ARP报文可以在哪种类型的网络上传输,值为1时表示为以太网地址。
- 上层协议类型:占两字节,表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800。
- MAC地址长度:占一字节,标识MAC地址长度,以字节为单位,此处为6。
- IP协议地址长度:占一字节,标识IP得知长度,以字节为单位,此处为4。
- 操作类型:占2字节,指定本次ARP报文类型。1标识ARP请求报文,2标识ARP应答报文。
- 源MAC地址:占6字节,标识发送设备的硬件地址。
- 源IP地址:占4字节,标识发送方设备的IP地址。
- 目的MAC地址:占6字节,表示接收方设备的硬件地址,在请求报文中该字段值全为0,即00-00-00-00-00-00,表示任意地址,因为现在不知道这个MAC地址。
- 目的IP地址:占4字节,表示接受方的IP地址。
ARP报文不是直接在网络层上发送的,它还是需要向下传输到数据链路层,所以当ARP报文传输到数据链路层之后,需要再次进行封装。以以太网为例,ARP报文传输到以太网数据链路层后会形成ARP帧。ARP帧如下图所示,他就是在ARP报文前面加了一个以太网帧头。
- 目的MAC地址:占6字节,如果是ARP请求帧,因为它是一个广播帧,所以要填上广播MAC地址(FF-FF-FF-FF-FF-FF),其目标主机是网络上的所有主机。
- 源MAC地址:占6字节,这是发送ARP帧的节点MAC地址。
- 帧类型:占两字节,这里用来标识帧封装的上层协议,因为本帧的数据部分是ARP报文,所以直接用ARP的协议号0x0806表示就可以了。
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
6、中间人
那么在一台主机向另一台主机请求对方的MAC地址的时候,会不会出现中间人的情况呢?
实际上是会的,如下图所示
由于ARP收到应答的时候会以最新的为主 !!!!
所以中间人最后告诉主机A自己是IP4,然后把自己的MAC地址告诉主机A,此时主机A的ARP缓存表中就保存了IP4的MAC地址是MAC3,然后同样的操作在给主机C来一次,这样它们之间的通信数据每次都要经过中间人,中间人就可以获取到它们的数据包了。这就是ARP欺骗。
六、DNS, Domain Name System
1、DNS
DNS是一整套从域名映射到IP的系统
DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为将域名转换为IP地址的分布式数据库系统,使得用户能够通过易于记忆的域名访问网站,而不是直接使用难以记忆的IP地址.
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系
最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的.
- 如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这样就太麻烦了, 于是产生了DNS系统.
- 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
- 如果新计算机接入网络, 将这个信息注册到数据库中;
- 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今, 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容
使用 cat /etc/hosts 命令查看
2、域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称
以www.baidu.com 为例
域名之间使用 . 连接
- com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.
- baidu: 二级域名, 公司名.
- www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于 ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议.
所以 域名解析:DNS最主要的功能就是将人类可读的域名(如www.example.com)转换为计算机使用的IP地址(如93.184.216.34),以便建立网络连接。
七、ICMP协议的简单认识
1、定义
ICMP(Internet Control Message Protocol,互联网控制消息协议)是网络层协议之一,主要用于在IP网络中发送控制消息和错误报告。它是一个非常重要的工具,用于诊断网络问题、通知发送者有关数据包传输失败的信息等。
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因。
2、功能
- 确认IP包是否成功到达目标地址.
- 通知在发送过程中IP包被丢弃的原因.
- ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议; ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6
3、ICMP报文格式
- 类型(Type):定义了ICMP报文的类别,如错误报告、查询等。
- 代码(Code):进一步描述了特定类型中的具体情况。
- 校验和(Checksum):用于验证ICMP报文的完整性
ICMP大概分为两类报文:
- 一类是通知出错原因
- 一类是用于诊断查询
八、ping命令
ping 命令是一个非常基础且常用的网络工具,用于测试主机之间的连通性。它通过发送ICMP Echo Request消息到目标主机,并等待接收ICMP Echo Reply消息来工作。这有助于确定两台设备是否能够互相通信以及测量数据包往返的时间延迟。
下面举个例子
- 注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
- ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期). ping命令会先发送一个 ICMP Echo Request给对端;
- 对端接收到之后, 会返回一个ICMP Echo Reply;
telnet是23端口, ssh是22端口,
ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息。
九、 traceroute命令
该命令是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器.
十、NAT技术
在前面我们已经了解了现在IPV4协议中,IP地址数量不充足的问题,提到了很多的解决方法,比如IPV6,NAT技术等。下面我们就NAT技术详细说明一下它是怎么解决IP地址数量不足的问题的。
1、定义
NAT(Network Address Translation,网络地址转换),顾名思义,是一种用于修改网络数据包传输信息的技术,主要用于在IP数据包通过路由器时,修改其中的源IP地址或目的IP地址。
- NAT技术能够将私有IP在对外通信时转换为全局IP,本质上就是私有转公有或者公有转私有
- 日常生活中,很多学校、家庭、公司内部采用每个终端设置私有IP,而在公网上的路由器上或者必要的服务器上要设置全局IP,如云服务器
- 全局IP要求是唯一的,但是私有IP是不需要的,可以允许在不同的局域网中出现相同的私有IP
2、NAT IP转换过程
假设此时主机A(IP:192.168.201/24) 要向D(IP:122.77.241.3/24) 发送请求,在主机A中构建了报文之后然后自顶向下进行交付,然后到了网络层准备开始路由
- 首先它发现目标主机没有和自己在同一个子网内(不然网络号肯定是一样的),所以将报文再向下交付封装成MAC帧发送给家用路由器B
- 家用路由器经过上面同样的操作将该报文发送给了运营商路由器C,然后由运营商路由器C将报文通过广域网发送给D。在这个过程中,需要注意的是并不仅仅将报文在不断转发,而是在转发的同时还将源IP地址不断做着替换。
- 我们知道每个路由器都有着自己的子网IP和WAN口IP,当它在做数据包转发的时候,它实质上是将报文的源IP替换成自己的WAN口IP。
- 所以一路替换上去之后,D端处理之后就可以返回到运营商服务器C,走到这里就有一个问题了 :剩下的路该怎么走呢?报文该如何正确返回到主机A呢?
下面看个具体的例子
- 上面的每台主机都是一个TCO/IP协议栈,客户端A要将报文发送给服务端
- NAT路由器将源地址从10.0.0.10替换成全局的IP(路由器的WAN口IP) 202.244.174.37,路由器就提这个客户端去向服务器发起请求;
- 返回
- NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
- 在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
- 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;
3、NAPT
如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定这个响应数据包是哪一台主机请求的呢?应该发给哪个主机呢?
所以这时候就需要NAPT来解决这个问题了,它采用的是 IP+ Port 来构建这个关联关系。
上图私有IP地址世界中有着多台主机,当然这些主机也有可能是路由器,且它们经过NAT路由器转发时IP地址都被替换成了一样的路由器的WAN口IP,所以为了分清楚服务器返回报文时各个客户端自己的响应报文,这就要求NAT路由器必须自己维护一张由外网到内网之间的数据包和主机的对应关系。
且实质上并不是主机与主机之间进行通信,而是主机上的进程与进程之间的通信,也许客户端A同时有着多个进程和服务端在进行通信,所以该NAT路由器不仅需要有能力去区分客户端主机之间的差别还需要区分同一台主机上进程之间的区别,所以数据包通过NAT路由器转发的时候,不仅需要考虑源IP地址被替换的问题,还需要考虑端口号被替换的问题。如上图中客户端A、B使用同一个端口号请求同一台服务器的同一个端口号,此时为了方便区分,NAT路由器在维护转换表时就将端口号换成1026了。
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项;因为建立连接的本质也就是客户端向服务端发起报文, 在断开连接后, 就会删除这个表项。
4、NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开
十一、代理服务器
除了上面讲的NAT这种在路由器级别上所作的地址转化的功能之外,还存在一种技术:代理服务器
1、定义
在网络中,代理(Proxy)服务器充当客户端和目标服务器之间的中介角色。它可以帮助用户间接访问互联网或内部网络资源,提供了多种功能和服务,
2、正向代理和反向代理
我们先以生活中的例子来描述以下正向代理和反向代理
正向代理
想象一下你正在尝试从国外的一个在线商店购买商品,但该商店只接受来自某些国家的信用卡支付,并且由于你的地理位置不在这些国家之列,因此无法直接完成支付。这时,你可以通过一个朋友的帮助,这个朋友住在其中一个被接受的国家,并愿意使用自己的信用卡帮你完成支付。在这个场景中,你的这位朋友就扮演了正向代理的角色:
- 你(客户端)请求帮助以完成购买。
- 你的朋友(正向代理)代替你向在线商店(目标服务器)发出支付请求。
- 在线商店只知道与它交互的是你的朋友,而不知道背后还有你这个人存在。
这就像你在使用正向代理访问互联网资源时,代理服务器代表你发送请求并接收响应,隐藏了你的真实身份。
反向代理
现在考虑你去一家大型商场购物的情景。这家商场内部有多个不同的店铺(比如服装店、电子产品店等),但对外只有一个统一的入口。当你进入商场并询问某个品牌的位置时,服务台的工作人员会根据你的需求指引你到相应的店铺,或者如果你要买的东西可以在多个店铺找到,他们可能会根据当前的人流情况建议你去人少的那个店铺。在这里,商场的服务台就像是反向代理:
- 你(客户端)想要寻找特定的商品或服务。
- 服务台工作人员(反向代理)知道所有店铺(后端服务器)的信息,并根据一定的规则(如人流分布、店铺特色等)引导你到合适的店铺。
- 即你并不知道自己最终会被引导至哪一个具体的店铺,只知道自己想要什么东西,且是在这个商场内完成购物。
这类似于反向代理在互联网应用中的角色,它负责接收客户端的请求,并依据负载均衡策略或其他标准将请求转发给合适的后端服务器处理,同时隐藏了这些服务器的具体信息。
站在客户端的角度,离客户端近的叫正向代理,离客户端远的叫反向代理。
3、负载均衡
负载均衡器位于客户端和服务器之间,接收来自客户端的请求,并根据预设的算法将这些请求分发给后端的一台或多台服务器进行处理。一旦服务器处理完请求,响应会先返回给负载均衡器,再由其转发回客户端。负载均衡不仅能够分散流量,还可以检测服务器状态,避免将请求发送到不可用或表现不佳的服务器上。
常见的负载均衡算法
-
轮询法(Round Robin):按照顺序依次将请求分配给不同的服务器,每个服务器都有平等的机会处理请求。
-
最少连接法(Least Connections):优先将请求分配给当前连接数最少的服务器,适用于每个请求占用服务器时间差异较大的场景。
-
源IP哈希法(Source IP Hash):根据客户端IP地址的哈希值决定分配哪个服务器,这样来自同一IP的请求总是被定向到相同的服务器,有助于保持会话一致性。
-
加权轮询法(Weighted Round Robin):给每台服务器分配一个权重值,权重越高,分配到的请求数量越多,适合不同性能的服务器集群。
-
响应速度法(Least Time):基于服务器响应时间和活动连接数来分配请求,选择最快响应的服务器以提升用户体验。
以上就是数据链路层的所有内容了。
感谢阅读!