网络层与数据链路层

网络层

什么是IP协议

IP协议属于网络层协议,网络层解决的问题是把数据从一个主机送到另一个主机。IP协议则是具备了可以把数据从一个主机,跨网络传输到另一个主机上的能力。

对上层来说,以应用层的TCP协议为例,TCP可以把数据可靠的传输给对端,但是它并不是真正的去传输数据,而是制定各种保证可靠性的方案,包括什么时候发,发什么,发多少等等。实际传输数据的活还是交给底下的协议来做,TCP就像是一个决策者,指定数据发送的策略,而IP协议则执行者,负责让数据可以交付到对端的主机上。

网路中有很多的主机,你与目标主机大概率并不直接相连,都是通过网络间接相连的,所以你的报文在传输过程中一点会经过一些中间节点,你的目的地决定了你如何在众多的节点中进行路径选择,这是能够跨网络找到目标主机的根本。只有你进行了正确的路径选择,你才能够到达目的主机。

这些节点在互联网中一般是路由器充当的,路由器中会有一个路由表,数据发送的途中我就可以根据这个路由表判断如何选择路径,即:
1.每台主机都有自己的IP唯一性保证
2.我知道我要去哪里,路径明确了,就可以做路径选择了。
3.网络中存在的大量路由器供我们进行路径选择,并且有路由表可以帮我们查找去特定点的最短路径。

为了支持这些,需要的基本设备
主机:配有IP地址,也会进行路由控制
路由器:配有IP地址,又能进行路由控制
节点:主机和路由器的统称

路由器散落在全国各地,就是一个图形结构,主机节点从A到B,本质就是一个路径选择的过程

IP协议报头

IP协议也属于TCP/IP协议栈,也就是说,IP协议也在内核中,那他的报头就和TCP一样,是用C语言编写的一个位段,结构如下图:

请添加图片描述
IP报头的标准长度是20字节,但是还有可能会包含选项字段。
下面是IP报头中各种字段的含义:

  • 4位首部长度
    表述的是以四字节位单位报头长度,四位的数值范围就是0~24-1=0-15,因为报头的标准长度是20字节,所以加上选项报头的长度范围就是20-60字节。通过定长的报头加上报头中的自描述字段就可以得知报头的全部大小,然后就可以做到分离报头的目的。
  • 8位协议
    表示上层协议的类型,用来解决分用问题。
  • 4位版本
    通常是一个确定的版本,一般是IPv4。我们现在使用的IP协议有两套,除了IPv4,还有IPv6。IPv4使用的是4字节32位bit位表示IP地址的,IPv6使用128位8字节表示IP地址。IPv6现在也有使用,但是主流的还是IPv4,因为他们两个并不兼容,所以要更换并不容易。
  • 8位服务类型
    决定了IP在路由时的一些策略,3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 也就是说正真有效的就是4位TOS,其分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本。 这四者相互冲突, 填写报文时只能根据场景选择一个设置。 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
  • 16位总长度
    这个长度包括IP的报头,可以用来分离报文与报文。
  • 6位标识,3位标志,13位片偏移
    与IP的分片相关
  • 8位生存时间
    IP报文在网络中不断路由,有很多种情况,比如环路路由、目标主机已经离线找不到等,那么报文在网络中就有可能变成一种游离性的报文,找不到地址。所以一定要给每个报文设置一个生存时间TTL,IP报文在网络中是一个节点一个节点传输的,所以8位生存时间代表的是一个报文能够经过的节点总数,每经过一个节点,生存时间就减一,TTL减为0时,该报文会被自动丢弃。
  • 16位首部校验和
    虽然IP协议不做可靠性保证的,但是不代表它可以给上层传输一个错误的信息,首部校验和就会对IP报文进行相关的校验,如果校验出问题了,那就会丢弃报文。
  • 32位源IP和32位目的IP
    IP报文的出发地和目的地。源IP在发送情况下是没有作用的,他的作用是你的请求完毕让时别人知道怎么给你响应。

分片与组装

为什么要进行分片
IP要进行跨网络传输,首先要能把数据从一台主机送到和自己相连的下一台主机,这个能力是靠数据链路层的mac帧提供。任何两个相连的主机,它一定是在同一个局域网,所以数据链路层解决的是局域网通信的问题。

mac帧有一个规定:mac帧报文在网络中跑携带的最大有效载荷长度(ip报头+ip有效载荷)规定一般情况下不能超过MTU(1500字节)

为了遵循这个mac的规定,IP有两种解决方法:即尽量减少一性发送报文的长度,从而符合下层的规定,如果实在不能减少,那就带对报文进行分片。实际的网络通信中,大部分情况都不会选择分片的方法,因为分片可能会导致很多问题

但是IP层的报文大小并不是由IP层决定的,这是由传输层决定的,为了让传输层不要给网络层一次性发送太大的数据,通信双方在进行三次握手时,除了要发送SYN,ACK之外,还要协商MSS:最大传输段尺寸

mac帧的最大有效载荷规定不能超过1500字节,而他的有效载荷包括了IP层的报头+有效载荷,IP层的最小报头长度是20字节,那么IP层的有效载荷最大就不能超过1480字节,而IP层的有效载荷由传输层的报头+有效载荷组成,tcp协议的报头最小也是20字节,那么tcp的有效载荷最大就是1460字节,这个就是tcp传送的最大段尺寸MSS,只要tcp向下传输的有效载荷小于MSS,就可以让IP层可以不进行分片。所以一般情况下MSS=MTU-20-20。MSS是双方tcp在握手阶段协商的基本报文大小,MTU是mac规定的传输数据的最大单元。

什么是分片和组装
当IP报文无法被整体发送让对方整体收到时则需要将报文拆成多篇,然后再由对方自由组装的情况。

对IP协议来说,如何将报文进行分片和组装那是IP协议自己的事情,你是把报文分片发送然后拼接,还是直接发送一整个报文他们都不关系,只要最终要保证下层拿到的是小于MTU的报文,上层拿到的是一个正确的报文就可以。所以IP协议自己就要有能够保证报文分片,组装的安全性的字段。而报文要进行分片,那就表示我一定要发送多次才能把报文发完,一旦次数多了,那么出错的可能性就大了,所以才要尽量避免分片。

如何分片
可以通过16位的片偏移+3位标志中的“更多分片”判断一个报文是否是分片的报文

IP层可能会收到很多报文,那就需要对这些报文进行区分,区分方法可以通过源IP地址用来区分一台主机发过来的所有报文,然后可以通过16位标识区分一台主机发来的报文的唯一性。如果发来的报文经过了分片,那就可以通过13位片偏移,找到每个报文在原始报文中的偏移位置

如何进行合理的组合
要进行组装,首先要拿到被分片过的报文,每一个分片都是一个完整的报文,所以都是有报头的,就可以通过报头的16位标识实现聚合所有的分片报文,然后按照片偏移进行升序排序。

理想情况下,我们用16位标识和16位片偏移就可以把分片的报文组合起来,但是我们还要考虑到可能发生一些特殊情况比如丢包,就需要确认我是否收到了所有分片的报文,借助的即使报头中的3位标志字段。

3位标志字段: 第一位保留(暂时没什么用). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果你是最后一片,这个标志位就设为0,如果为1,则表示后面还有更多的分片。所以大部分不分片的报文这个标志位都是0。

在发送时,每个报文的起始片偏移+自生分片的长度就应该是下一个分片报文的起始片偏移。接收时,首先会根据片偏移进行升序排序,如果起始的片偏移量不从0开始,那一定是因为第一个报文丢了。如果我没有收到更多分片标志为0的报文,那一定代表我没收完,不管是丢了还是还没到我都不关心,反正就是没收完。可以通过报文的起始偏移量+其自身长度,判断它后面的报文有没有丢,进而判断组装时有没有中间的报文丢失。

网段划分

IP地址分为两部分:网络号+主机号

数据包路由的时候,一定是要贯穿多个网络的,所以定位时,首先要找到对应主机所在的网络,然后在确定的网络中找到对应的主机。这样把网络划分成一个一个的子网络的好处在于一旦我们要查找某一个主机时,就可以快速排除和该主机不再同一区域的主机,可以大大的提高检索的效率
请添加图片描述
每一个被划分的网络的编号就是网络号,不同的子网就是把网络号相同的主机放在一起。如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复

通过合理的设置网络号和主机号,就可以保证在在网络中每一个相互连接的主机IP地址都不相同。更重要的是,可以把网络号相同的IP地址放在一起,就可以形成一个一个不同的网络,这些不同的网络经过路由器连接,就可以实现让我们在查找时先找目标网络,再找目标主机

实际上手动管理IP地址是比较麻烦的,现在有一种技术叫DHCP动态地址分配,它可以给子网中新增的主机自动分配IP地址,避免我们手动管理。目前这个DHCP其实是一种应用层的功能,被集成在了路由器中,因此路由器也可以看作是一个DHCP服务器

子网划分的方式
曾经有这样一种划分方案:
首先通过第一个bit位的不同,把网络分为A类和其他类,如果第一个bit位为0,那我就不会把报文转给其他网络,然后通过第二个bit位区分B类和其他类,以此类推。这样在找目标网络时一次性就可以排除一半的序号。但是这种划分的粒度是非常粗糙的,划分的结构如下
在这里插入图片描述
这种划分方案中,肯定是A类能够表示的主机数更多,因为它用作表示网络的bit位更少。但是随着互联网的发展,这种划分方式的局限性很快就显现出来了。比如说有一个组织比如公司,学校,他们要入网,不同组织申请的是网络号,如果是B类网络,那么它最多能分配214个大约是一万多个,也就是说B类网络最多能够被一万多家组织使用,B类网络显然是不够用的。并且理论上一个B类子网可以有216个IP,那就等于是一个B类网络中有6万5千多台主机可以使用该网,但是一个组织也不一定可以用完这些IP,那就造成了大量的浪费。

针对这种情况就提出了一种新的方案,称为CIDR(Classless Interdomain Routing)。引入了一个子网掩码(subnet mask)的概念区分网络号和主机号。

子网掩码也是一个32位的正整数,子网掩码是用过与IP地址进行按位与来获得网络号的。因为按位与的特性,可以得知子网掩码中bit位为1的位在于IP运算后的值就是IP原本的值,而bit位为0的位则会变成0。因为子网掩码判断的是网络号,所以它只需要对比一个IP的网络号部分,也就是说只需要保留IP的网络号部分,所以子网掩码通常前半部分都是1,后半部分都是0,具体有多少个1则取决于想用多少个bit位表示网络号。比如:
主机IP:192.168.7.1
mask:255.255.255.0
网络号:192.168.7.0

每一个子网除了有自己的网络号之外,还有一个自己的子网掩码,路由器是知道和自己相连的每一个网络的掩码的,当它收到报文后,就可以用每一个网络的掩码与报文的目的IP按位与,就可以得到目的主机的网络号

假如说你现在的IP是192.168.60.19,你来到了一个网络,这个网络的子网掩码是255.255.192.00,那么就代表当前的子网是用IP地址的前18个bit位划分的,因为子网掩码的的前18位都是1,那么这时候用IP地址与子网掩码与运算,即可以保留你的前18位,这个前18位的值就是网络序号,然后你就可以对应的在网络中找到该序号的网络,这时候如果下层还要对网络进行更细致的划分,那么子网掩码是1的位数就会更多,假设这时候是255.255.255.0,那就是用前24位进行划分,在和你的IP与运算,然后你就可以找到对应的子网,然后再根据情况去找主机或者网络。
请添加图片描述

IP地址和子网掩码还有一种更简洁的表示方法,比如192…168.60.19/24,表示子网掩码的高24位全是1,即子网掩码为255.255.255.0。

这样就可以通过灵活的调整子网掩码的位数不断的对子网进行划分,然后构成类似多叉树的结构

由此可以发现,IP地址中的网络号和主机号的大小并不是固定的,只要子网掩码变得越来越长,就表明目标网络变得越来越小,也就代表目标网络变得越来越具体。所以,子网掩码的作用就是让我们可以快速的提取目标网络,然后进行对比

特殊IP地址

并不是所有的IP地址都会在公网中被别人使用,有些IP本身就是有特殊用途。比如我们在计算自己的网络号时,会和子网掩码进行与运算,得到的结果中主机号是全为0,这就是一种特殊IP地址,表示网络号
如果主机号为全1,代表广播地址

127开头IP地址用于本地环回(loop back)测试,通常是127.0.0.1,其典型的特征是数据会贯穿协议栈,但是并不会被发送到网络中。

IP地址的数量限制

我们现在使用的IP协议有两套,除了IPv4,还有IPv6。IPv4使用的是4字节32位bit位表示IP地址的,IPv6使用128位8字节表示IP地址。IPv6现在也有使用,但是主流的还是IPv4,因为他们两个并不兼容,所以要更换并不容易。

因为最初的IP地址是32位,一共有232种排列组合,也就是说一共大概就43亿多的IP地址,但是全世界现在已经有70亿人了,并且这些IP地址还包括一些不能用的特殊IP,所有这肯定是不够用的。虽然CIDR可以减少IP地址的浪费,但是并不能彻底解决IP地址不足的问题,现在的解决方案可以直接使用IPv6,但是IPv4和IPv6不兼容,所以要想全部升级几乎是不可能的。下一种方案就是动态IP地址

动态IP地址的意思就是你不联网的时候,我就不给你分配IP,别人连的时候我再给你IP地址,相当于是一种共享IP的策略。给你IP和回收你IP的人就是路由器,使用的就是动态IP地址+NAT技术。

公网IP和私网IP

理论上IP地址有32位,如果你不想接入公网,那任何位你都可以随便用。但是RFC 1918标准规定了如果你想组建局域网,你不能使用任意IP,必须使用IP地址中的一部分即私网IP。

也就是说,所有的IP地址都分为公网IP+私网IP两种,他们两个不能有任何交集,公网IP只能再公网使用,私网IP只能用来组建私网。私有IP有以下几种

  • 10*,以10开头的,前8位是网络号,共16777216个地址,可以用来组件大型局域网
  • 172.16到172.31,前12位是网络号,共1048576个地址
  • 192.168.开头,前16位是网络号,共65536个地址

数据从局域网到广域网的过程

两个网络之间,是由路由器相连的,那么路由器上就一定有两个接口,一个是在局域网内和其他主机通信的网口,对应的IP地址就和该局域网的其他主机属于同一网段,叫做子网IP,这个对内的接口被称为LAN口。对于这个局域网来说,想要这个路由器帮我们访问外网,就要用到路由器的另一个对外的接口WAN口,对应的就是公网IP。LAN口和WAN口不是一个绝对的概念而是一个相对的概念,当你的连接的外网如果接入了一个更大的网络,那你的WAN口在那个网络看来就成了LAN口。

路由器的功能之一就是组建局域网,一般而言,一个局域网中的1号主机通常就是路由器。所以我们在家里装上路由器之后,路由器就可以组建一个局域网,而局域网的设备可以直接通信,所以我们就可以和我们的路由器直接通信了。而你家的路由器是可以直接连上运营商的服务器的,所以就可以通过路由器把报文传输到运营商的服务器,运营商再把数据交到公网,然后经过路径选择被传到互联网公司的服务器上。出去了怎么回来?并且不同局域网的IP是可以重复的,怎么找到我?

所以私有IP不可以出现在公网上,因为私网IP不可以作为唯一性的标识,也就无法被返回给目标主机了。所以报文在发送时,目标IP地址不变,而自己的源IP替换成路由器对于的WAN口IP,当报文到达下一个路由器之后,依然是目标IP不变,而源IP换成了自己的WAN口IP。当服务端收到报文之后,就可以把响应返回给交给自己报文的那个路由器,只要目的IP变成了公网IP,那就不用替换了,这样就能保证这最后一个是由的源IP地址一定是公网IP。这就是数据发送出去的过程,而数据怎么回来就是数据链路层考虑的问题了。这种在子网或内网中的数据转发时将源IP地址替换成特定路由器的WAN口IP的技术称为NAT(地址转化).

使用NAT的原因就是因为IP不够用,如果我们可以让很多设备使用私网IP,然后映射到一个公网IP上,这就可以大大增加可以上网的设备数量。还有就是我们上网必须要经过运营商,否则我们不就可以不交钱随便上网了,运营商首先要在自己的子网内对你请求的合法性做判断,然后才能让你进入公网。

路由

实际的报文在路由器怎么路由?
报文从自己的主机出来,一直到路由器接入公网,这时候它就会拿着自己的目的网络的IP地址在路由器的路由表里查目标网络,如果找不到,说明目标网络肯定不在当前网络,路由器就会把这个报文转发给默认路由,如果找到了,那这个报文就会通过对应网络的特定端口被送去下一跳,在下一个网络里继续查对应路由器的路由表,找下一个路由器,直到到达了目标网络的路由器,这时候查找目标网络的任务完成,接下来把数据送到主机就变成了送公网转发变成从局域网内转发,这时候通过局域网的通信原理就可以把数据转发给目标主机。

所以每一台在网络中的设备都有自己对于的路由表,里面就是和当前路由器的链接的网络号。Linux要查看路由表可以用命令route查看。
在这里插入图片描述
Gemask表示的就是子网掩码
Desrination表示的就是掩码完后你应该去哪一台主机

通过和路由表中的网络号进行对比,找到自己对应的网络,然后通过接口转发出去。如果路由表查完了还是没有找到,那就会就有一个Desrination是default,这就会相当于把报文通过eth0转发出去,这就是默认路由。默认路由的意义就是虽然我的局域网里没有你的目标网络,但是我可以帮你离开这个局域网,让你去别的网络找。

eth0这个接口在我们使用ifconfig命令查网络的时候就可以看到该接口对应的信息,

这里查到的云服务器的IP其实属于局域网IP,也就是说,局域网通信是也是需要查路由表的,局域网内的设备他的路由表里除了这个局域网的路由器之外,还有局域网内的其他主机,那么在把消息给路由器之前,它首先会查自己的路由表,如果发现路由表里有目标主机,那他就会意识到这是一个局域网通信,不需要入网,所以就直接把报文交给目标主机了,如果没有,那就证明这不是局域网通信,他就会把报文交给路由器,然后继续路由。

数据链路层

IP的核心作用是提供一种跨网络传输数据的能力。数据在使用IP进行转发时,一定先要把数据交给直接相连的下一跳主机,下一次跳到哪里,由IP层决定,而怎么跳,就是数据链路层决定了。下一跳主机和我一定属于同一个网段,所以本质是我要进行局域网通信

以太网

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

以太网内标识一个主机使用的是MAC地址,这个MAC地址是烧在网卡上的,全球唯一。如果我在局域网内想发送一条信息,局域网内的所有主机其实都可以收到,但是主机在对报文做对比时如果发现这个报文不是给我的,我就把报文直接丢弃,是我的我再接收。也就是说两个主机在通信时,虽然他们认为自己在和对方通信,但实际上周围有一堆的“吃瓜群众”,只不过这些“吃瓜群众”不关心你们通信的报文而已。

而在向以太网中发数据时,如果多个主机同时发,那就会造成干扰,就类似于系统中的临界资源,而系统中我们可以通过加锁解决,网络里就只能让他们先进行碰撞,如果碰撞了就执行碰撞避免算法,所以以太网是基于碰撞域和碰撞检测的局域网通信标准

以太网的帧格式

在这里插入图片描述
MAC帧采用的分离报头的方案是定长报头,报头一共14字节,在后两个字节包含了一个类型字段,如果是0800,表明报文是IP数据报,如果是0806,表明是ARP请求/应答,如果是8035,表明是RARP请求/应答。并且MAC帧不光对传输的数据上线有要求,不能太长,同时也要求数据不能太短,如果太短后面就会有PAD填充。
前面两个字段分别是目的MAC地址和源MAC地址,长度是48位,6字节,用来让主机区分报文是否是传给自己的,一般用16进制数字加冒号的形式来表示(例如:08:00:27:03:fb:19),MAC地址出厂就确定了,不能更改。
后面还会有一个CRC校验。

MTU

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

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

数据包转发的过程

在真实的一跳一跳的过程中,目的IP地址是不变的,用来支持路由规则,而我们的源mac地址和目的mac地址,大概率是一定在不断变化的,因为我们的上一跳主机和下一跳主机是在不断变化的。也就意味着,在IP层,所有的设备看到的数据都是一样的。

报文到达目的网络之后,我们只知道目标主机的IP地址,但是还不知道对方的MAC地址,那我数据就无法跳过去,所有这里的就需要通过IP地址,获得MAC地址,这种策略我们称为ARP协议

ARP/RARP协议

ARP和RARP协议和MAC在级别划分上都属于数据链路层的协议,但是ARP属于是局域网协议,在MAC的上层。类似的还有ICMP/ICMP与IP协议。

ARP数据报格式

为什么说ARP协议在MAC的上层,从ARP数据报格式就可以看出来
请添加图片描述
硬件类型:代表底层采用的网络标准,一般都是以太网,用1表示
协议类型:代表的是要用要什么类型的地址换MAC地址,0x0800表示IP地址
硬件地址长度:通常指MAC地址的长度,一般以太网中就是6字节
协议地址长度:只被转换地址的长度,IP的长度为4字节
op:1表示ARP请求,2表示ARP应答
剩下几个字段的意义和名称一样,只有目的以太网地址需要注意,当发送ARP请求时,我是不知道目的以太网地址的,所以这里一般是FFFFFF。MAC报头中的以太网目的地址也不知道,所以也是FFFFFF,相当于在以太网中进行广播。所有主机都会收到这个报文,然后所有主机都会进行报文解析,去掉MAC报头,然后把MAC的有效载荷交付给他们上面的ARP层,然后他们会先确认op是请求还是应答,如果确认是请求,则通过目的IP字段,检测这是不是询问我的MAC地址,如果主机发现这不是给我的报文,就直接丢弃,只有目标主机保留。然后目标主机会填自己的ARP应答,把op字段换成2,然后填上自己的MAC地址IP地址和发送请求主机的MAC地址和IP地址,之后交给MAC层,填上MAC层的报头,把这个响应再发回去,同样,局域网的所有主机也都可以收到这个应答,但是只有当初的发送端会保留这个应答,可以称为是以1对1的方式把应答返回给最初的主机,然后向上交付给ARP层,这时候还要先检查op,确认是应答了就可以取出这个报文的发送端MAC地址和发送端IP地址字段,拿到了对方的MAC地址。

ARP层收到报文后,一定要先检查op的原因就是每台主机都有可能被发起arp,也都有可能收到arp应答,所以要先通过op区分这两种情况

ARP协议的存在的必要性:
在同一个局域网中给对方发消息,必须要知道对方的MAC地址,才能封装MAC帧,实际上大部分情况只知道对方的IP地址,所以我们需要IP->MAC。如果直接使用FFFFFF虽然在IP层也可以从IP地址判断报文是否是给我的主机的,但是实际上这个报文早就该被丢弃了,不应该让他上了IP层才发现这不是我的报文,这本来就是MAC层的任务,所以我要在MAC层就解决问题,把对其他层的影响降到最低,避免网络资源的浪费。

ARP不是只有在到了目标网络找不到主机时才会发起ARP,实际上在数据传输的每一跳,每一个局域网都可能发起ARP。但是也不是每一次发送都要发起ARP,因为发送数据的一方可以对IP与MAC地址进行缓存,缓存之后就可以直接通过IP找到目的MAC地址了。

查看mac缓存:arp -a

RARP

逆地址解析协议,将MAC地址转化为IP地址,就可以通过对方的MAC地址,询问对方的IP,然后让对方应答回来。

DNS

DNS(Domain Name System),是一种从域名映射到IP的一套映射方案。网络真实的通信过程其实和域名是没有关系的,能够用域名上网,一定是把域名转换成了IP。

DNS底层使用的协议是UDP,DNS是通过向域名解析服务器发起UDP请求,解析自己DNS,也就是说浏览器不考虑缓存时,要做的第一件事就是域名解析。

TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序。 但是人天生对数字是不敏感的,人更擅长处理字符串,于是人们发明了一种叫主机名的东西,是一个字符串,,并且使用hosts文件来描述主机名和IP地址的关系。最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的。但是如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。并且其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。这样就太麻烦了,于是产生了DNS系统。

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

至今,我们的计算机上仍然保留了hosts文件。在域名解析的过程中仍然会优先查找hosts文件的内容。

可是域名也没有多好记。那就出现了搜索引擎,无论是域名还是搜索引擎,其本质就是方便用户。

域名简介
以www.baidu.com为例:
com:一级域名,一般以.com结尾的表示是一个企业域名,表示该公司是一家盈利性的商业公司。同级的还有.net网提供商。.org表示开源组织或非营利性组织,比如boost.org
baidu:二级域名,一般代表公司相关名称
www是一种习惯性写法,写不写都可以访问

ICMP

可以通过ICMP协议进行网络状态的控制和管理
网络通信时一般就两个目的,一是传送数据,二就是主机在线管理。如果我们通信时就想确认一下目标主机在不在线,那就可能使用ICMP这样的协议基于IP向对方发起请求,ICMP不是以传送数据为目的的,而是只要能够联通对方主机,那我的任务就算完成。

ICMP协议是一个 网络层协议。一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因。而ICMP正是提供这种功能的协议; ICMP主要功能包括:
1.确认IP包是否成功到达目标地址.
2.通知在发送过程中IP包被丢弃的原因.
3.ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
4.ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;

如果主机A给主机B发送消息失败,那么中间的路由器就可以给主机A发送一个ICMP报文,报告发送失败的原因,所以ICMP协议是由内核自主实现,当数据包发送不成功时,可以给上层报告出错原因。

ICMP报文大概可以分为两类:
一类是对方通知我出错的原因;
一类是我主动去查是什么原因,诊断查询

不同类型对应不同的原因

我们可以用ping命令加网站域名来检测对方主机是否联通,底层采用的就是ICMP协议

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

ping命令是一个用户层的命令,所以在使用ping命令时,其实是绕过了传输层直接使用了网络层提供的管理命令。这样的操作在网络协议栈是允许的,并且在Linux中也有一套可以绕过传输层的套接字接口,叫原生套接字。

traceroute命令

也是基于ICMP协议实现, 能够打印出从你的主机一直到目标主机之前一共经历多少路由器。

它的基本原理就是:因为ICMP会对错误报文进行响应,那我发送的时候首先将我报文的生命周期TTL设置为1,那么报文到达第一个路由器时就会被丢弃,然后路由器会给主机发送ICMP,这就拿到了第一个路由器的信息,然后我再把TTL设置为2,报文传输两个路由器后被丢弃,又会给发送方返回一个响应,然后不断的增加TTL,知道报文被成功送给对方主机,这样就可以检测到报文发送的路径。

NAT技术

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

数据从局域网发送到公网时,局域网的路由器会把IP报头的的源IP换成自己的WAN口IP,以此避免私有IP出现在公网上,然后路由器把报文发送给对端主机,对端主机收到后进行响应,就可以直接把报文发回到路由器上。但是报文回到路由器之后又怎么发回给源主机?

NAPT
NAT路由器的工作不只是源IP替换,路由器还会在路由器内部提供一张NAPT路由转化表(NAT转化表)。其实就是在路由器内部维护了内网IP+port与WAN口IP+port的映射关系,即内网请求和外网请求的映射对。当路由器收到对方发来的响应时,就可以查看这个NAT转化表,找到内网的对应主机。因为这个映射是通过IP地址+port端口号实现的,所以内网的几台机器的端口号可能一样,但是IP一定不一样,而响应的WAN口IP可能一样,但是端口号一定不一样,这就保证了映射双向的唯一性。

在NAT转化的时候,除了替换成路由器的WAN口IP之外,大部分情况,源端口号甚至也会被替换掉。因为如果路由器同时给内网的两台主机发送消息,不可能使用同一个端口号。

所以网路路径上的每一个路由器都会维护一个NAT表结构,而家用路由器可能维护的设备比较少,而运营商的路由器可能存在大量的子网,每一个子网都要建立对应的转化表,所以就会有更大的表结构,所以路由器才会分商用和家用两种。

NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
1.无法从NAT外部向内部服务器建立连接;
2.转换表的生成和销毁都需要额外开销;
3.通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开

NAT和代理服务器
代理服务器是部署在局域网里的,当局域网内的主机想要访问外网时,会先经过代理服务器,而如果主机数量非常多,并且有很多人都访问了同样的资源,代理服务器就可以把资源缓存在自己的服务器上,实现加速访问的目的,一般在学校和公司都会有,但是因为数据会先经过代理服务器,也就表示主机访问的内容代理服务器都可以知道,所以也就有人可能会用这个服务器去监视局域网内的上网请求。这种帮你去请求的代理叫做正向代理。

还有一种代理方案叫做反向代理,服务器要向外提供服务,那他就待把自己的服务器信息暴漏出去,但是如果你有多台服务器,那总不能把所有的都爆露出去,人也记不住,可以在域名解析的时候,同一个域名对应着多台服务器,但是这样做有可能导致用户访问的服务器不均匀,大部分都访问其中一个,造成个别服务器的压力就很大,而其他机器又没有满载,并没有完全利用上这些服务器,这是对资源的浪费。所有这种方案是不会使用的,正常的处理方法是用一个反向代理服务器。当用户访问服务器时,所有的请求都会先访问这个代理服务器,然后代理服务器通过某种方式把用户的请求转发给服务器,这就完成了自己的工作,最后响应的时候服务器再自己给用户响应就可以,也就是说反向代理服务器的核心工作就是任务转发,这样就可以在转发的时候通过设置合理的转发规则,保证每台机器的请求或负载数量是较为平均的,每一台机器都可以较高效的提供服务,这种策略被称为负载均衡。除了有正常请求,也有很多非法请求,那在代理服务器安装一些防火墙之类的软件,就相当于多了一层软件屏障,可以直接把非法请求在代理服务器就进行抛弃。

路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.而代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.那么NAT和代理服务器的区别有哪些呢?
1.从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
2.从底层实现上讲,NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
3.从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
4.从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值