数据链路层
- [1. 对比理解 "数据链路层" 和 "网络层"](#1. 对比理解 "数据链路层" 和 "网络层")
- [2. 以太网](#2. 以太网)
-
- [2.1 什么是以太网](#2.1 什么是以太网)
- [2.2 以太网帧格式](#2.2 以太网帧格式)
- [3. 认识MTU](#3. 认识MTU)
- [4. MAC地址](#4. MAC地址)
- [5. 对比理解MAC地址和IP地址](#5. 对比理解MAC地址和IP地址)
- [6. MTU对IP协议的影响](#6. MTU对IP协议的影响)
- [7. MTU对UDP协议的影响](#7. MTU对UDP协议的影响)
- [8. MTU对于TCP协议的影响](#8. MTU对于TCP协议的影响)
- [9. ARP协议](#9. ARP协议)
-
- [9.1 ARP协议的作用](#9.1 ARP协议的作用)
- [9.2 ARP协议的工作流程](#9.2 ARP协议的工作流程)
- [9.3 ARP数据报的格式](#9.3 ARP数据报的格式)
- [9.4 op字段](#9.4 op字段)
- [10. 其他重要协议或技术](#10. 其他重要协议或技术)
-
- [10.1 DNS(Domain Name System)](#10.1 DNS(Domain Name System))
- [10.2 DNS的背景](#10.2 DNS的背景)
- [10.3 域名简介](#10.3 域名简介)
- [10.4 使用 dig 工具分析 DNS 过程](#10.4 使用 dig 工具分析 DNS 过程)
- [10.5 ICMP协议](#10.5 ICMP协议)
-
- [10.5.1 ICMP功能](#10.5.1 ICMP功能)
- [10.6 ping命令](#10.6 ping命令)
- [11. NAT技术](#11. NAT技术)
-
- [11.1 NAT技术背景](#11.1 NAT技术背景)
- [11.2 NAT IP转换过程](#11.2 NAT IP转换过程)
- [11.3 NAPT](#11.3 NAPT)
- [11.4 NAT技术的缺陷](#11.4 NAT技术的缺陷)
- [11.5 NAT和代理服务器](#11.5 NAT和代理服务器)
1. 对比理解 "数据链路层" 和 "网络层"
-
决定将数据交付给下一跳路由器的时候,下一跳路由器一定和我在同一个局域网。
-
所以每一跳之间,本质上的两个节点间的一跳都叫做:局域网转发(子网转发)。所以宏观上,我们的网络的本质就是一个一个子网构成的。只不过子网和子网之间用对应的路由器进行了连接,路由器的工作就是在这么一个个子网当中不断进行转发、进行决策。所以查找的目标主机的时候必须得先找到目标主机所在的子网。
-
所以网络的最后一层要解决的就是,如何做到将主机A的数据转发到同一个局域网下的路由器A,如此便可以做到后续在各自局域网中的一跳(都是局域网子网问题)。
2. 以太网
2.1 什么是以太网
- "以太网" 不是一种具体的网络,而是一种技术标准。既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等。
- 例如:以太网中的网线必须使用双绞线(网线),传输速率有10M、100M、1000M等。
- 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等。
2.2 以太网帧格式
(1)几乎任何协议都要首先解决的两个问题:
- 如何分离和封装。
- 如何交付和分用。
(2)以太网的帧格式如下所示:
- 目的地址:需要去哪一台主机的MAC地址。
- 源地址:是哪一台主机发送的报文的MAC地址。
- 类型:决定了将有效载荷交付给上层谁的问题。
- 帧协议类型字段有三种:IP协议、ARP协议、RARP协议。
- 帧末尾:是CRC校验码。
(3)认识MAC地址
- 在局域网当中,想进行转发的时候,首先必须保证每一台主机的唯一性。因为IP地址实际上是网络层的概念,所以在数据链路层当中无法去标定唯一 一台主机,所以对于数据数据链路层,需要一个标识主机的唯一方案 :MAC地址(物理地址 / 网卡地址)!
-
MAC地址:是一个48位的整数,是网卡在出厂时就内嵌到网卡中的,是一个固定的序列,用来标识网卡的唯一性,每一台主机只要携带网卡了,都至少必配一个MAC地址 。MAC地址在全球也是唯一的,不过其主要的运用场景不是广域网当中,而是局域网当中标定特定一台主机的唯一性 ,所以只要网卡是唯一的,用网卡的主机就是唯一的。
- 虽然使用IP也是可以的,毕竟在局域网内,私有IP照样是具有唯一性的,但是此处数据链路层采取的是MAC地址(另一套地址方案)。主要是不想让数据链路层,有任何使用IP的方式在里面,以达到在软件上进行一定程度上的解耦。
(4)如何分离和封装?
以太网的帧格式采用的是定长报头,帧末尾CRC校验码同样也是定长。
所以,当数据链路层向上层网络层进行交付的时候,只需要将数据帧中的报头和有效载荷进行固定长度的分离就行了(头、尾定长一去就是有效载荷)。解包之后每一个字段该怎么拿,字段的位置与大小也都是固定的,很方便拿。
(5)如何交付和分用?
这两个字段如果填的是0800,代表的就是有效载荷放的是IP报文,进而向上交付给IP层就行了。同样的还有0806、8035,以表明有效载荷不同,从而交付给不同的软件层。
(6)重谈局域网通信原理。
-
就如同一个班级在进行点名,老师A进行一 一的点名,当点同学F的时候,老师A点名的这个行为,学生B、C、D、E是都听到了的(在坐的所有人都是听到的),但是只有学生F答了一声到。而学生F向老师A说的时候,同样的学生B、C、D、E也是都听到了的(在坐的所有人都是听到的)。所以,可以说A和B是在进行众目睽睽之下进行定向的通讯。
-
而之所以学生B、C、D、E,并未做出反应,是因为老师A并未喊道他们,而他们之所以能知道喊的不是他们就是因为他们也听到了的(接收到了的)。
①主机A向主机B发送报文,当在一个局域网中转发报文的时候:
而收到的每一个主机于是就拿着其中的目的地址进行对比,看是否是自己,不是就直接丢弃,是就保留,做报头和有效载荷的分离,然后将有效载荷向上进行交付。这就是局域网通讯原理:直接把数据仍到局域网当中,其他目标主机自动会去识别该数据,是自己的就留下,不是自己的就丢弃。就相当于喊了一嗓子,通过路由器转发同理,路由器本就是局域网中的主机,其检测到是发送给其的报文就会保留并作后续转发。
②但是当我们在发数据的时候,别人也想发数据呢?
- 换句话说扔进网路中一个数据帧,也就是扔了一个光电信号。在一个公共的介质当中,你说你的我说我的,彼此信息必定就会发送干扰。
- 也就是说:如果局域网中,同时有多台主机都在发送数据,数据之间就发送了碰撞。
③数据发送碰撞了发送方主机知道吗?
-
是知道的,就与日常的公共场合说话的一样,是所有人都听的到,包括我们自身。碰撞的时候发送方的主机也是可以知道的(通过CRC校验码 / ......),而一旦碰撞了数据也就无法使用了,所以尽量不能发生碰撞问题,而只有发了才知道会不会碰撞,而如果碰撞了就会激发避免碰撞算法。发送主机会休息随机时间,然后再重新发送。
-
所以数据链路层也需要可靠性。
(7)整体理解数据链路层的原理:
- 结论:主机A向主机F发送消息,这两台主机是在做进程间通讯。
- 进程间通讯的本质是,先得让主机A和主机F看见同一份资源,而这的典型的同一份资源就是局域网,所以在读写局域网的时候,因为该局域网被所有主机共享,所以该局域网可以称为共享资源。
- 而我们通过碰撞检测的方式(检测到碰撞,则立马根据相关算法进行重传),一定要保证在己方发数据的时候,没有别人的干扰,这就叫做对资源进行独占。
- 所以本质局域网资源是一个临界资源。当我们在进行多个主机通讯的时候,本质上要保证临界资源的数据一致性,就是任何时刻保证一个数据在发。在之前的进程间通讯的学习中是采用的加锁,而在局域网中是先试试,碰撞了就根据一定算法再试试,直到成功即可。
(8)局域网中主机越多越好,还是主机越少越好?
- 主机越少越好, 就和一个公共场合中人多人少导致说话碰撞多的问题,这也就是为什么局域网不能太大,如果局域网太大就会出现一发数据就碰撞一发数据就碰撞的问题,导致数据发送不出去。
- 这也证明了三大运营商的强大,在一个人口巨大的活动下,我们还能正常的进行看视频等网上娱乐,这点也能证明,那个活动场所地区附近的基站的转发能力是十分十分的强大的。
(9)如果非得在局域网中连接很多很多的主机怎么办?
-
这个时候就需要用到一种设备:交换机。
-
交换机的特性:利用交换机将局域网划分成很多很多的子区域,这些子区域依旧属于局域网。
- 这个时候A与F处于一个局域网,如果A想给F发送报文,可以经过交换机直接将报文给F没有任何问题。但是如果B、D、E也有类似的操作,导致发生碰撞,然后交换机识别到碰撞了,交换机就不会将数据往后转发,此时就减少了碰撞的垃圾数据填充的问题。
- 如果A向B发送消息,交换机就甄别到在其包括的局域网一侧,交换机就不会将数据转发到另一侧了。
- 这样大大减小了压力,在另一侧得数据,交换机以同样得方式进行处理。
总结:
- 交换机的作用:划分碰撞域。
- 局域网数据帧发送的时候,越短越好, 越长代表着其要花费更多的时间在局域网中进行传输,更容易发送碰撞。而太短也不好,太短涵盖的有效数据量又太少了。
3. 认识MTU
(1)MTU 相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层,产生的限制。
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。
- 不同的数据链路层标准的MTU是不同的。
(2)攻击局域网的原理
- 我们想让局域网瘫痪,让别人上不了网很简单,只要不断的疯狂的向局域网中发送消息就完了。写一个不断的使用网卡发送请求的程序是很简单的,可是我们也是局域网中的一个主机,一旦碰撞了,我们的主机会自动进行碰撞避免算法,是很难影响的。
- 而网上是有一些工具的,而这些工具是可以绕过数据链路层的,然后不采用数据链路层的碰撞避免算法,然后直接将数据打包给网卡,让网卡直接给发送出去,这个数据无意义。而是绕过碰撞避免算法,所以碰撞就碰撞了,没事继续发,然后导致局域网中其他用户无法上网。
在网络转发的过程中,目的IP是不变的。
(3)MAC帧报头会发生变化吗?
- 一定会, 因为每一个主机都有不同的MAC地址,所以当报文跳一个路由器之后,下一跳的MAC源地址与MAC目的地址就变化了。
所以有效数据没有变化,但是MAC帧报头是发生变化的。
(4)整体理解:
- 每一个路由器,一定会级联多个子网,而每一个子网都有网络号,所以每一个路由器一定有多个条目(一定是一张表,每一个表内部的条目都会涵盖目标网络是谁,子网掩码是什么,是否正常使用),然后当收到一套报文的时候,先拿报文当中的目的IP和路由表的子网掩码按位&,然后再与表中目标网路进行对比,是就扔出,不是就继续查找,这就是路由表。
- 然而,对于上述情况还有一个问题。就是我们上述讲的都是讲报文向上一层局域网进行交付,而IP报文,被千里进行推送,而到达了一个主机的入口路由器,那接下来就是将报文交付给这个目标主机,但是入口路由器封装MAC报头,就必须知道目标主机的MAC地址!所以此时我们就需要有一个如何让一台主机再同一个局域网内知道另一台目标主机的对应的MAC地址。所以便要有新的协议:ARP协议。
4. MAC地址
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)。
- 在网卡出厂时就确定了,不能修改。MAC地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突,也有些网卡支持用户配置mac地址)。
使用ifconfig命令可以查看Linux的MAC地址:
ether就是以太的意思,后面跟的就是当前主机所对应的MAC地址。如果是虚拟机的话,看见的MAC地址可能有多个,是由虚拟机虚拟出来的,而实际上我这个云服务器的MAC地址也是虚拟出来的,对于云服务器不用管,未来认为其是一台实际的机器就可以了,因为云服务器给我们的不一定是在一台机器上,有可能只是用了一个机器的一部分资源(其是按资源进行划分的)。
5. 对比理解MAC地址和IP地址
- IP地址在整个转发过程中,尤其是目的IP是一直不变的,IP地址的目标一直不变给我们带来的好处就是:IP地址描述的是路途总体的起点和终点。
- MAC地址描述的是路途上的每一个区间的起点和终点。
(1)就如同唐僧的取经路:
- 唐僧的出发地到目的地:东土大唐 -> 西天。
- 唐僧的长途跋涉途中:东土大唐 -> ...... -> 车迟国 -> 黑风岭 -> ...... ->西天。
- 源IP -> 目的IP:是永远都不会改变的。
- 源MAC -> 目的MAC:会根据当前所处的位置,不断的进行变化。
目的MAC是受目的IP的影响的,以此到达目地的IP。
6. MTU对IP协议的影响
(1)由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。
- 将较大的IP包分成多个小包,并给每个小包打上标签。
- 每个小包IP协议头的16位标识(id)都是相同的。
- 每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0)。
- 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层。
- 一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据。
7. MTU对UDP协议的影响
(1)回顾一下 UDP 协议:
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报。
- 这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
8. MTU对于TCP协议的影响
(1)再回顾一下 TCP 协议:
- 对TCP的影响和UDP是一样的,只不过TCP会重传,但是毕竟也是会消耗资源的,所以尽量还是不要分片。因为MAC帧的规定而导致的网路层发生分片,就会增加丢包概率。而为了减少这样的情况,那么此时就应该让IP报文将自身交付给MAC帧时(充当MAC帧的有效载荷的时候)长度不要超过1500,也就是IP报文整体大小不要超过1500。
- 可是之前讲过,IP协议要发多大的数据,是不由IP协议决定,IP协议就是一个跑腿的,真正的决策(一次发送多大的数据、发多少、丢包了怎么办)是由传输层决定的,所以IP协议也没有办法。
- 所以此时因该能够让TCP单次发送报文的时候,报文的大小不要错过某一个数字: MSS(Maximum segment size,最大段尺寸)。
(2)MSS和MTU的关系:
- 所以这也就回答了一个问题,就是TCP发送数据时的滑动窗口,滑动窗口范围之内的数据可以直接发送,而并不用对方立马给与应答。
- 而发送的数据并不是整体一个打包直接发送过去,而是一个一个的数据段,然后再一个一个的附上TCP发送,就是因为下层不允许我们将数据一次发送过去,因为最根上MTU有这样的规定。所以为了保证IP不分片,所以要设置对应的MSS:
- TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size)。
- TCP在建立连接的过程中,通信双方会进行MSS协商。
(3)在最开始的时候,一个数据都没有发,因为这个MTU有可能会变化,其次发送方也想让接收方知道,其单次发送一个报文的大小 - MSS的大小(为了更顺畅的进行通讯)。所以在进行建立链接的时候,双方就会进行MSS的协商,也就是三次握手的时候,除了会协商双方的接收能力,也会进行协商双方单个报文的大小,尽量减少数据发送体积的问题。
- 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
- 然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
- MSS的值就是在TCP首部的40字节变长选项中( kind = 2 )。
(4)整体理解:
- 这也正说明了,分片不是主流,因为当它们在建立握手的过程中的时候,交换了双方的MSS,而做了这个工作,双方在进行后续的通讯的时候,其中的数据报文的大小也就不会再出现分片问题了。
9. ARP协议
虽然我们在这里介绍ARP 协议,但是需要强调,ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。
9.1 ARP协议的作用
ARP协议建立了主机 IP地址和MAC地址的映射关系。
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
- 因此在通讯前必须获得目的主机的硬件地址。
9.2 ARP协议的工作流程
- 其实就像高中新来的一位老师,对于他班里的学生的姓名是一个也不知道,但是他有一张记有每一个人的学号,但是没有名字,于是老师需要念学号的方式认识同学,而老师在念学号且让其告诉姓名的操作,无疑是一次班内的广播,于是每一个同学都会收到这么一个报文,并且最终在局域网中广播的时候一定采用的还是MAC帧。
- 于是大家都听见了,然后大家都需要从这个报文中提取学号的信息,也就是IP地址,对比是不是自身。于是,是的留下,不是的丢弃。于是这个是的同学就会发送:我是学号:......,我的名字是:XXX,然后封装位MAC帧,然后将这个消息定向的发送(因为它可以知道是谁问的),本质上还是广播,并且其他同学进行丢弃。
- 此时老师就知道这个学号的真实姓名,于是这就完成了一次简单的过程,这就叫做ARP。
先广播,再一对一进行发送,并且所有逻辑都属于封装成MAC帧,在局域网当中完成。
9.3 ARP数据报的格式
(1)ARP数据报的完整格式:
(2)以太网首部不需要关心,所以真正的ARP协议:
- 硬件类型:这次要进行ARP时,对应的局域网的网络种类 / 网络的标准 / 网络的类型,一般固定1:为以太网。
- 协议类型:我们想要转换什么样的地址类型,如:想将IP转换为MAC地址 / ......,一般固定0x0800:为IP地址(未来想将IP转换为MAC地址)。
- 硬件地址长度:通常代表就是,如果是硬件地址长度是MAC地址(以太网地址)固定为6字节。
- 协议地址长度:通常代表就是,我们是MAC地址表征硬件,IP地址表征软件。一硬一软,对应的就是协议地址对应的就是软件长度,IP地址为固定为4。
前四个为固定写法,可以不需要看,重点是后面的字段。
- op字段:为1表示ARP请求,op字段为2表示ARP应答。
- 发送端以太网地址:发送主机的MAC地址。
- 发送端IP地址:发送主机的IP地址。
- 目的以太网地址:ARP请求时:因为目的就是获得目的以太网地址,所以不知道为全F(二进制全1)。ARP应答时:
- 目的IP地址:目标主机的IP地址。
9.4 op字段
- 如果一台主机能向另一台主机发起ARP请求,那么在未来除了主机掉线情况,这台主机一定会收到对应的ARP应答。一但一台主机可能向多台都可能未来要发送消息,所以这台主机可能向多台主机都曾经发送过ARP请求,就决定了这台主机他未来一定会收到大量的应答。所以对于一台主机来讲,其在正常工作的时候即可能对外发送ARP,也可能收到ARP。
- 任何一个主机可能之前向目标主机发送过ARP请求,也就注定了未来会收到对应的ARP应答。
- 任何一台主机,也可能被别人发起ARP请求。
局域网中:任何一台主机收到ARP的时候,可能是一个应答,也可能是一个请求。所以一个主机收到的ARP就既有可能是应答也有可能是请求,所以需要op进行区分。即:为1表示ARP请求,op字段为2表示ARP应答。
10. 其他重要协议或技术
10.1 DNS(Domain Name System)
DNS(Domain name system),也称为:域名系统,是一种互联网协议,主要功能是把容易记忆域名转换为计算机通信使用的IP地址(IP:61.166.150.123,IP地址一般是些数字组成,难以记忆,也不能表达其他文字可用体现的意义),例如www.baidu.com,就是百度收索的主页域名,当我们使用此域名时,通过DNS就会解释返回其所在服务器的公网IP地址给计算机,计算机通过获取的IP地址就可以访问对应服务器上的内容(计算机在网络上进行通信都是依靠IP地址来进行的);我们把DNS的工作,称为域名解析:把域名转换成IP地址DNS也可以把IP转换为域名,这就是俗称的反向解析.
10.2 DNS的背景
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆。 于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系。
最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件的。
- 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。
这样就太麻烦了,于是产生了DNS系统。
- 一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。
- 如果新计算机接入网络,将这个信息注册到数据库中。
- 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
至今,我们的计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。
powershell
cat /etc/hosts
10.3 域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
powershell
www.baidu.com
域名使用连接:
- com: 一级域名,表示这是一个企业域名,同级的还有 "net"(网络提供商),"org"(非盈利组织) 等。
- baidu: 二级域名,公司名。
- www: 只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。
10.4 使用 dig 工具分析 DNS 过程
(1)安装 dig 工具
powershell
yum install bind-utils
(2)之后就可以使用 dig 指令查看域名解析过程了。
powershell
dig www.baidu.com
(3)结果形如
(4)结果解释
- 开头位置是 dig 指令的版本号
- 第二部分是服务器返回的详情,重要的是 status 参数,NOERROR 表示查询成功。
- QUESTION SECTION 表示要查询的域名是什么。
- ANSWER SECTION 表示查询结果是什么,这个结果先将
www.a.shifen.com 查询成了两个 ip 地址。 - 最下面是一些结果统计,包含查询时间和 DNS 服务器的地址等。
(5)更多 dig 的使用方法,参见:
https://www.imooc.com/article/26971?block_id=tuijian_wz
10.5 ICMP协议
ICMP协议是一个网络层协议 。
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通。但是IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。
10.5.1 ICMP功能
ICMP正是提供这种功能的协议;ICMP主要功能包括:
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包被丢弃的原因。
- ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要是用ICMPv6。
10.6 ping命令
- 注意,此处 ping 的是域名,而不是url! 一个域名可以通过DNS解析成IP地址。
- ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存周期)。
- ping命令会先发送一个 ICMP Echo Request给对端。
- 对端接收到之后,会返回一个ICMP Echo Reply。
注意一个坑:ping命令基于ICMP,是在网络层。而端口号,是传输层的内容,在ICMP中根本就不关注端口号这样的信息。
11. NAT技术
11.1 NAT技术背景
之前我们讨论了,IPv4协议中,IP地址数量不充足的问题,NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能:
- NAT能够将私有IP对外通信时转为全局IP。也就是就是一种将私有IP和全局IP相互转化的技术方法。
- 很多学校、家庭、公司内部采用每个终端设置私有IP。而在路由器或必要的服务器上设置全局IP。
- 全局IP要求唯一,但是私有IP不需要。在不同的局域网中出现相同的私有IP是完全不影响的。
11.2 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 发送数据时就会生成表中的映射关系。
11.3 NAPT
那么问题来了,如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的。那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了,使用IP+port来建立这个关联关系。
这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下,建立连接时,就会生成这个表项。在断开连接后,就会删除这个表项。
11.4 NAT技术的缺陷
- 由于NAT依赖这个转换表,所以有诸多限制。
- 无法从NAT外部向内部服务器建立连接。
- 装换表的生成和销毁都需要额外开销。
- 通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开。
11.5 NAT和代理服务器
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。
代理服务器看起来和NAT设备有一点像。客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器。服务器返回结果后,代理服务器又把结果回传给客户端。
那么NAT和代理服务器的区别有哪些呢?
- 从应用上讲, NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
- 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层。
- 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
- 从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序需要部署。
在服务器上,代理服务器是一种应用比较广的技术。
- 翻墙:广域网中的代理。
- 负载均衡:局域网中的代理。
代理服务器又分为正向代理和反向代理。
代购例子:
- 花王尿不湿是一个很经典的尿不湿品牌,产自日本。我自己去日本买尿不湿比较不方便,但是可以让我在日本工作的表姐去超市买了快递给我,此时超市看到的买家是我表姐,我的表姐就是 "正向代理"。
- 后来找我表姐买尿不湿的人太多了,我表姐觉得天天去超市太麻烦,干脆去超市买了一大批尿不湿屯在家里,如果有人来找她代购,就直接把屯在家里的货发出去,而不必再去超市,此时我表姐就是 "反向代理"。
- 正向代理用于请求的转发(例如借助代理绕过反爬虫)。反向代理往往作为一个缓存。