【橘子网络】关于网络分层以及协议的全局讲解
一、网络设备
1、硬件网络设备
1.1、主机(host)
主机的定义比较广泛,所有的接收流量或者发送流量的设备都可以被称之为主机。可以是电脑,手机,服务器。在当今云服务大行其道的局面下,各种云设备也可以被称之为主机。
基于这个概念定义,我们可以进一步把主机的概念扩大,只要接送流量,你的家用电器,你的智能电视,你的智能手表,你的冰箱,你的智能电灯,都可以在这个定义之下被称之为主机。
这些设备都在接收和发送网络流量,基于此我们可以看到这个概念的全面。并且很重要的一点就是你的网络流量的发送和接收,在如何于互联网通信的时候都遵循着相同的规则。这个规则我们会在后面详细解释。
客户端&&服务端
在这些主机设备与互联网通信的时候,一般会分为两类角色,一个是客户端,一个是服务端。但是这两个角色是可以随时变换的在不同的网络环境中,我们这里给出一个如何确定是客户端还是服务端的一个方式。
# 客户端:发起请求的主机
# 服务端: 接收并响应请求的主机
比如在上图的例子中:
客户端的主机发起请求百度服务器的资源,此时他发起请求,这个主机就被称之为客户端。
而百度的服务器响应客户端请求,并且返回给客户端主机资源这个时候百度的服务器就被称之为服务端。
但是我们需要明白一个地方,就是客户端和服务端是一个发生在特定某次请求中的概念。记住是特定某次请求的,你只有在一个固定的请求中才能确定他们谁是客户端谁是服务端。所以我们再来看一个例子。
在这个图中,百度的服务器上面有一个图片改了,换成新的图片了。他需要从文件服务器中获取这个图片的地址更新他的服务。此时发起请求的就是百度的服务器,此时他就是客户端。
而响应百度服务的是文件服务器,此时服务端就变成了文件服务器。
可以看到的是,我们在不同的请求中每个主机扮演的角色并不相同,所以说,只有在固定的一次请求响应中才能确定客户端和服务端的角色。
网络服务器
我们在上面看到了各类服务器,我们可以说一个点就是服务器只不过是一个安装了软件的计算机。只不过他比较特殊,他知道如何返回一些特定的请求。所以你只要安装了合适的网络服务器软件,你可以把任何主机变为一个网络服务器。
所以你遇到的所有的服务器都是一个能提供给你服务的计算机。
1.2、IP地址
1.2.1、IP地址简介
作为主机,在互联网上传递信息,发送接收数据包的时候,需要一个地址,需要一个标识,也就是IP地址。这个地址会作为一次网络请求的唯一标识存在于网络传输中(具体会在五层模型中生效)。在这个概念下面,我们需要一个地址,也就是IP地址。你在每次网络交互中,这个地址会被打在请求的数据信息中作为识别信息在互联网中传送。
比如在这个例子中,起src就是源端地址,dst就是目的端地址,我们依赖一个称之为ip地址的字符串来标识一台主机。所有的互联网的发送都有这个src和dst。具体他的工作原理,我们会在后面的网络分层中来具体介绍。
1.2.2、IP地址的构造
ip地址在互联网中实际是一个32位的2进制字符串。每一位都有0或1来表达。比如我们的一个ip地址为:172.35.137.22。在计算机网络中的二进制就表达为
我们可以看到我们把32位二进制数,拆分为8位一组,每一组的十进制数对应ip地址中的一个片段,片段之间使用点.来分隔,就构成了一个我们常见的ip地址。
我们用8位得到的二进制数,最小为0,最大为2的8次方也就是255,所以你得ip地址每一个片段不能超过255。这里我们不做ip地址二进制的讨论,具体的ABC类网以及网络掩码我会在后面详细描述。不要忘记我们这里是概念介绍。
这些ip地址的结构往往在实际中是以层级的方式存在的,比如此时我有一个公司叫阿外巴巴,他独有10开头的所有ip地址,就是10.xxx.xxx.xxx
他下属三个子公司,分别位于杭州,北京和大同。这三个公司分别拥有总公司的三个分组。每个子公司都拥有总公司ip地址的一个字集。如下图:
他们都以一个特定的前缀来开头自己拥有的ip地址集合。比如每个公司下面可能有不同的团队。比如有销售,产品和研发。每个团队又会拥有各自子公司的一个子集。如下图:
这种拆分使得我们每个ip地址可以确认其所在特定主机的位置,比如我拿到一个10.40.23.xxx的ip地址,我就能根据子网划分知道这个地址是大同分公司下面的销售团队的一个主机地址。进一步确认其后续信息。
**这个划分ip地址结构的行为称之为子网划分,每一个划分出来的ip表达式称之为子网。**这里我们不打算详细说子网划分的问题,这个会在后面谈到子网的时候详细说明。我们还是来说网络设备。到此为止,我们每个主机都存在于自己所属的网络中了,拥有了自己的网络ip地址。
1.3、网络传输
网络实际上就是多个主机之间传输流量,在网络出现之前,我们两个主机之间传递数据的方式很朴素,就是一个人拿着U盘,拷贝出来,然后再去另一台机器拷贝进去,是不是很暴力。
而网络的作用是把这个朴素的过程自动化,让多个主机之间得以自动的传递共享数据。
而我们目前面临一个问题就是假如我自己家里有一个wifi网络,我称之为个人网络,我可以用手机连接上去,从而访问这个网络下的资源信息。
然后我在公司还有一个网络,我称之为公司网络。但是我们的公司网络和个人网络就像上面阿外巴巴一样(网络中继续划分子网),每个子公司属于不同的网段,他们之间要互相访问。比如我在家里想访问公司的资源,这时候就要把个人网络和公司网络连接在一起,这就是网络连接。实际上互联网就是很多网络的互相连接。
我们把各个网络都连接在Internet网络的过程,就是我们互联网化的过程。在这个过程中这个连接往往是网络运营商为我们提供的。而这个提供流程,需要借助大量的其余硬件来实现,比如集线器,比如网桥,比如路由器等等。这个我们后续来处理。
2、网络传输
中继器、集线器、桥接器、交换机和路由器
我们这一次来看一下数据究竟是如何在网络中传输的,这对你以后涉及到网络的真正学习的时候有引导性理解的作用,你不会困惑于一些小的症结点。
书接上文,我们看到了关于主机和IP的概念。而且我们知道,当你用电线把两个主机连接起来的时候,网络实际上就被建立起来了。就像这样。
而且如果关于电线传输信息,那我们需要知道随着传输距离的不断增大,数据信号是会变得衰弱的。
但是如果你此时把两个机器放在一个屋子里用电线连接,那么他们还是会衰减信号,但是这个距离信号仍然会被通过,那么这些宿主机的连接还是会实现,并且没啥大问题。
那么如果你的两台主机是分布在不同的屋子里,甚至不同的地域,不同的国家的时候。此时你的信号可能从发出端发出到接收端之前,就衰减了,信号无法抵达对端。那你的两个端的数据共享就会出问题。此时你就需要中继器的介入才能解决这个问题。
# 中继器是一种以再生信号为目的的硬件设备。任何从中继器一端进来的信号都会从中继器的另一端出去而不会发生衰减(他是一个加油站)。这将会解决你跨远距离将设备连接起来的问题。
截止到现在,即便引入了中继器,我们也一直在讨论一个主机直接连接另一个主机而建立起来的网络连接。在这个角度考虑网络是远远不够的。
如果此时我们加入了第三台主机,此时你需要把第三台主机全部连接到其余的主机上,互相建立连接。
如果此时我们加入了第四台主机,此时你需要把第四台主机全部连接到其余的主机上,互相建立连接。
如果此时我们加入了第五台主机,此时你需要把第五台主机全部连接到其余的主机上,互相建立连接。
…
如下图:
如你所见,这种模式下,我们每增加一台主机,就会互相建立电线的连接。这种毫无疑问是无法扩展的。也是不可取的。
这种解决扩展性问题,在计算机中很常见的就是加一层。
就像我们在分布式中解决服务之间互相访问的问题的时候,无法直接建立通信,那就找一个注册中心,网络的设计也是如此。
我们需要一个中间的角色,然后这些角色来处理不同主机之间的漏式的通信。各个主机只需要和这个角色连接,传递信息即可,如下图:
这种方式的好处是,当我们第六台主机加入的时候,很方便的就扩展进来,第六台主机只需要加一个连接到中心角色就可以了。而不用之前那种复杂繁琐的连接。
而当你接入到中间角色的时候,实际上和其他主机就已经建立了连接。这个中间角色的名字就是集线器。
# 我们之前讨论过中继器,我们知道他就是一个能再生信号的硬件设备,让信号在远距离传输的过程中不断再生,不会因为衰减导致的信号丢失。
# 这里的集线器和中继器是一样的功能,只不过他作用在多个主机互相连接的场景,他支持多个端口之间的跨端口的作用,也就是他是一个多端口的中继器。适用于上面的那种网络模式。
当我们的主机1要和主机2通信的时候,此时主机1把信号发到集线器上,集线器会把这个信号广播给其他主机(他无法定向发送,只能广播)。此时其他主机就全部收到了这个信号,自然主机2也就收到了。
这解决了规模扩展问题,集线器是引入的第一个解决网络架设的设备,允许我们连接多个主机在中心。
而现在,他们之间互相建立了连接。但是如你所见,他引出新的问题,当主机1和主机2通信的时候,其他未参加到本次通信的主机3,4,5都收到了这次发送数据的副本信息。这是无意义的,而且是不安全的,自然也就是不应该的。于是引出第二个设备就是桥接器。
此时我们设计两组主机,每一组主机都连接到相同的集线器上面,而桥接器位于两组集线器之间。如下图:
# 根据定义,桥接器也称作网桥只有两个端口,一个端口面向一组集线器连接的设备,另一个端口面向另一组集线器连接的设备。
根据定义,网桥也需要知道哪些主机在网桥的哪一边。这将使得网桥将通信限制在某一侧。举个例子:
当主机1要和主机2通信的时候,主机1发起数据到集线器,集线器会重新再生信号在每个端口,然后扩散到端口连接的各个设备,也就是主机2,主机3,以及他们这一端的集线器,集线器连接的网桥会知道你要通信的主机2在左侧,所以你得数据包就不会被带到右侧的网络里面。此时也就是只有主机2和主机3能接收到你的这个信号。
当主机1要和主机6发送信号,此时数据通过集线器,网桥会让信号流向另一端,而不会在左侧的网络。到达右侧的信号在右侧集线器的扩散下,此时主机4,5,6都能收到信号,也就完成了主机1和主机6的通信。
网桥是第一类帮助只包含到其他相对网络的数据包的设备。他知道哪些主机连接在网桥的那一端,从而让信号做出正确的流向。
但是我们看到,他仍然有不足,就是信号依然在不想关的主机之间通信,于是我们终于来到了交换机。
# 交换机更像是集线器和桥接器的结合体,只不过他是基于端口角度来工作的。他是一种在网络中促进通信的设备。我们来说明一下
交换机需要知道每个主机各自使用的通信端口,当主机1要和主机2通信的时候,主机1把信号发给交换机,交换机找到要发送的端口定位到主机2,然后发给主机2,。主机1和主机5通信也是一样的道理。
而因为他们使用端口交互,这种基于交换机的设计就需要每台主机都位于相同的网络(因为不同网络之间端口独立,可能会导致端口冲突)。所以这种模式下他们就处于一样的网段,也就是我们之前说的网络的相同逻辑分组里面。如下图。这些主机就是你家里任何一个信号设备,比如手机,电脑等等。也可以是学校机房的每一台pc机。等等吧。
现在我们把思维挪回刚才学校机房的例子。
可能不同学院有不同的机房,他们需要处于不同的网络分组,因为可能有不同的连接需求。比如外国语学院的网络只是需要简单的网络连接。
而计算机学院不仅需要连接互联网,还需要连接一些云资源来进行学习。基于这种要求,所以我们建议放在不同的网络中其实是个不错的建议。如下图:
此时每个学院之间的主机通信依然是走之前我们说的交换机的逻辑。那么此时如果主机1和主机4需要跨学院网络交互呢?他们的网段都不在一个上面。而交换机只能作用在网络内部,那此时我们需要跨网络交互呢?此时我们就需要引入第四种设备,也就是路由器。来处理网络之间的通信。
而我们在如今社会可以更进一步,我们可以把互联网使用路由器连接上来。如下图。
我们进一步分析路由器的作用,路由器可以控制两个网络之间的流量。当主机1和主机4要通信的时候,显然这两个主机不在一个网络里面,他们的通信要经过路由器,此时路由器就为我们控制流量或者添加安全策略,甚至于流量的重新定向提供了绝佳场所。因为路由器位于网络之间的边界上面,可以为不同网络之间的交互提供操作场所。这种过滤在交换机上可做不到,不过现代的交换机有的可以做到这一点。但是在网络中一般认为,位于同一网络的设备不需要过滤网络内的流量。如果你的设备主机需要不同的连接,最好放在不同的网络中。网络边界指的是逻辑分组之间的的分离,也就是网段的分离。
# 路由器的工作原理就是,他是知道他自己连接的是哪个网络。
这就意味着在上图中的路由器,他知道自己三个接口上面分别连接的是计算机网络,外国语网络和互联网。各自的连接方向都是知道的。
这些不同的连接信息,就是路由。而所有的这些路由信息,都存储在路由器中一个称之为路由表的地方。
所以路由表是路由器知道所有路由信息的媒介也就是实现。路由器会基于路由表把各个地方来的流量引导到对应的网络上。引导到相应的接口。
当我们说路由器引导流量去各自网络的时候,也就是说路由器知道每个网络的所在位置,这个操作来自于他自己本身就处于每个网络中。当路由器连接进一个网络的时候,它就被赋予了这个网络中的一个ip地址。这个ip地址被称之为网关,也就是我们在ipv4那里配置的网关地址。网关是流量经过路由器去其他网络的门和出口。当你配置网关的时候,就是这个ip被当做网关生效。网关是主机离开本地网络的途径。
当我们主机1在网络1的时候,他要访问外部网络,必须配置这台主机的网关是192.168.17.01,这样当他发送数据出网络的时候,他就会根据这个配置找到路由器,路由器根据路由表为他转发流量。
此时我们可以再进一步来讨论网络:
我们看到我们可以架设多级路由器,来连接多级网络,我们一直都在说互联网其实就是一大堆路由器,他们的通信可以依赖这些路由器,每次发起通信都是走他的网关,也就是最近的路由器来发起下一步请求,然后再到下一个路由器,知道转发到目的网络。包括你跨互联网的交流也是如此。
这实际就是数据在互联网上面的传输方式。也是路由器在网络中的扮演角色。
而有些概念你必须明确,就是路由实际上就是数据在网络上移动的过程。而路由器大家也没必要神话他的作用,他就是执行路由的设备。
同样的,交换机的概念中,交换也是数据在网络上移动的过程。交换机也是为了做到交换的数据移动的设备。
之所以逼逼这一句,是因为还有其他的设备在网络中存在。例如接入点,防火墙,负载均衡器,第三层交换机,正向代理,反向代理等等。在云时代,还有一些设备存在于云端,比如虚拟交换机,虚拟路由器。但是不管怎样,他们都是执行的交换或者路由,或者二者兼而有之。他的的作用就是为了数据移动。
而后面我们会来解释关于这些设备的作用,他们不管做啥,都是为了交换或者路由,也就是数据移动,不管他们以什么形式存在,他们都是为了实现这个作用。不信吗,你可以想想springcloudgateway,是不是在软件层面实现了路由和交换的作用。
你也可以再想想nginx是不是也是这个意思,只不过实现的时候各有操作而已。
二、网络模型
这一部分我们正式开始研究关于网络模型的设计,相信大家都或多或少的在不同的地方看到过什么网络分层的概念,也都知道一些关于什么物理层,传输层等等,但是你知道每一层到底是干嘛的吗,这一章就解开这个答案。
# 网络的总体目的是为了允许两台主机彼此共享数据,在有网络之前,我们要想在两台主机之间共享数据,就需要在这台主机上面插一个盘,拷下来然后去另一台主机上拷贝出来,实现这种形式的数据共享。但是网络的出现,允许主机通过网络自动共享数据,使得这种共享变得自动化了。
# 要实现这种自动化,就需要参与通信的主机之间,遵守一套规则。就像说话一样,说英语的就要按照英语的语法来说,说汉语的就要按照汉语的语法来说,不然就会出现信息共享错误的问题。这在网络中也是一样的,网络通信同样有这么一套规则。网络就按照这套规则,被划分为七层模型。这个模型被称之为OSI模型。
# 似乎从大自然的进化来看,也是比较倾向于分层模型来设计的。比如人类身体,有呼吸系统,消化系统等等。这些系统各自独立工作,互相交互,使得人这个系统可以正常运行。网络分层也是如此,每一层都服务于特定的功能,如果这七层每一层都能正常的工作,完成自己的功能。那么就达到了联网的效果,也就是主机之间可以共享数据了。
我们学习网络模型,并不是要简单机械的记忆有哪些层,每一层是干啥的。我们需要明白每一层的功能,他们是如何各自工作又互相配合,达成网络的总体目的,也就是主机之间彼此共享数据。
下面我们就从物理层开始一层一层的剥开你的心。
1、OSI模型之物理层
计算机中的数据是以位的形式存在的,也就是0和1。如果我们要实现主机之间的共享数据,就得有一个角色把这些0,1传输到下一台主机。这个角色就是物理层。物理层的目的就是传输比特位。任何有助于把0,1从一台主机移动到另一台主机的东西都将被视作第一层技术。也就是物理层技术。
比如电缆就是第一层技术,他就是传输的0,1比特位。
但是你也不要被物理二字迷惑理解。OSI模型在wifi技术出现之前,就已经被设计出来了。wifi就是一个物理层技术,因为wifi的存在就是为了把0,1传输到另一台主机。而且除了电缆和wifi属于第一层技术,其余一些东西也属于这一层技术。
之前我们提到过的中继器,其作用是为了把信号放大(再生信号),所以其作用只是为了扩展你电信号的能力,其作用就是一个电缆的再生。所以中继器也是第一层技术。自然的,集线器也是这个目的,所以他也是第一层技术。
这就是物理层的目的,在这个目的达成之后,物理层的使命就完成了,这就把我们的目光带到了第二层,链路层。
2、OSI模型之数据链路层
这一层将与物理层交互,他把物理层的比特放到导线上,并且在对端从导线取回比特位。这就意味着不管你的导线连接的是什么,只要交互了比特位,这就是第二层技术。也就是说,当比特信号发出,是通过网卡传输出去的,也就是这个网卡就是第二层技术。wifi的接入卡也是第二层,因为他们和那些无线电波互相作用。
现在的网卡或者wifi接入器已经很少见到了,但是以前还真是电脑上插个什么玩意才能上网。现在的话,wifi接入卡已经能直接植入在手机和手表中了,相信你也能体会到。第二层的总体目标还是把0,1传输给下一个地方,也就是一跳一跳的。在网络中有个术语叫下一跳。
第二层技术找到下一个主机的地址有新的寻址方式,称之为MAC地址。MAC地址是48位,用12位16进制数字表示
mac地址在计算机中根据系统不同会有不同的表达方式。
windows:94-65-9C-3B-8A-E5
linux:94:65:9C:3B:8A:E5
思科路由器和交换机:94.65.9C.3B.8A.E5
不管怎么表达,他都是48位二进制,用12位16进制表达。只是不同的系统下分隔符不同而已。他的工作方式是每一个网卡都有自己唯一的一个MAC地址。
假如A主机的mac地址是macA,B主机的mac地址是macB,无论如何,mac地址允许数据从一个网卡到下一个网卡,也就是从一个跳到下一个地址。
所以我们已经知道网卡位于第二层,实际上还有一个设备也在第二层,那就是交换机。前面我们知道交换机是在网络内帮助两台主机之间传递数据,交换机会帮助网络流量向前移动,完成这一跳。交换机可以让网络流量传递到下一个主机,也就是他的作用就是完成流量的下一跳。所以他就是第二层技术。
但是一般有了互联网之后,我们会传递流量从一跳到下一跳,会传递多个路由器。
我们这里有个问题就是第二层技术是面对的每次一跳数据,那么问题来了,他是怎么从一个跳到另一个跳,直到对端。这就是第三层的技术。网络层。
链路层数据每一跳都跳到下一跳,但是对于从主机发起端,如何准确到达对端,这就他做不到了。他只能对着网卡的mac地址一个一个跳,到了对端主机所在的路由器网卡就没了,但是到了对端路由网卡,如何找到网络中的对端主机,这时候需要网络层完成这一操作,也就是IP协议。
3、OSI模型之网络层
网络层中使用新的寻址方式,也就是ip地址。我们可以看到路由器其实是有助于数据从一端到另一端的,所以路由器其实被用在第三层技术。主机因为是处于两端接收发送,所以也是端对端的。所以主机也在第三层。实际上ip就是第三层的,所以任何带着ip的设备都是第三层技术。
# 此时有个问题,如果我们在第二层就有了mac地址,能够下一跳来寻址,那么为啥还需要第三层的ip地址呢?
# 第二个问题,如果我们在第三层有了ip地址,能够实现ip寻址,那么为啥还需要第二层的ip地址呢?
这两个问题的答案,有助于理解数据包是如何在网络上面流动的。我们之所以需要不同的寻址方式,是因为每一种寻址方式都有其不同的作用体现。
假如我们此时要把从主机1发送数据去主机2,当然了,数据都是一些0,1比特位,第二层和第三层根本不知道数据是啥,他们只能看到0,1,只知道一堆0,1要发去对端,其余的一概不知。来吧,我们来揭秘数据包到底是如何在互联网中发送的。
我们来一个正式的结构。
OK,此时我们数据包(一堆01比特位)从主机1开始发出,因为主机是第三层的,所以此时他要把第三层的协议内容封装好,也就是本端的ip地址和对端主机2的ip,地址,主机1是知道自己要发给谁的。
此时他封装好了自己的数据,以及第三层的协议信息(源端ip和对端ip)。
此时他要发数据就要去下一跳路由器,所以就要根据mac地址进行下一跳,跳去下一个路由器的网卡,这个过程的寻址是寻址的mac地址。于是就变成了这样。
此时封装好第二层协议,发去下一跳路由器1,等数据到达路由器1的时候,此时他的上一次的第二层协议就完成了使命,此时就要卸去第二层协议的封装数据。变为这样。
此时路由器1就要发去自己的下一跳,也就是路由器2。于是他要再次包装第二层协议,就变为了这样。
此时完成封装,发去下一跳路由2,成为这样。
此时数据到达路由2,这一跳也结束了,就要卸去上次的第二层封装变为这样。
继续下一跳,最终数据到达了主机二变为这样。
此时到达了对端,第二层和第三层数据都被卸去。变为这样。
此时数据就到了对端,于是数据就完成了发送。最后的10.1.1.11->10.8.8.88作用就是完成了他的使命,最后被卸去也是没啥了。
这里我们看到了mac地址和ip地址的作用,他们在不同的地方有不同的寻址功效发挥。
注意,我们这里一直在单独讨论mac和ip,好像他们之间没啥关系一样,但是实际上着两种协议之间存在解析连接关系,也就是ARP协议,这个协议会把第三层的ip协议和第二层的mac地址做关联起来,后面我们就来研究ARP协议,这个协议很几把复杂。
截止到目前,我们看到了前三层的工作,他们各司其职完成自己的本职工作,对网络的整体目标做出努力。
下面我们将进入第四层模型的工作范畴。也就是对于java开发而言,最重要的传输层.大名鼎鼎的TCP协议就在这一层发光发热。
4、OSI模型之传输层
传输层要做的事情就是端对端的传输,他要保证端对端的传输是无误的,正确的,好用的。这一层所有的工作都是围绕这个目标展开的。下面我先来解释一下这几句话。
我来举一个常见的不能再常见的例子:
有一天早上你去了公司打开了网页csdn开始准备cv代码,然后同时也开了一下QQ音乐带上耳机准备摸鱼,你突然想起今天还是CF穿越火线送装备的日子,就顺手打开了CF客户端。这样你的电脑上就至少开启了三个应用。这三个应用都是通过网络来接收发送数据的。
接下来的一个问题是当数据到达主机之后,如何准确的找到是发给哪个应用程序的呢?你接收到了CF的数据,然后转发给了QQ音乐?听啥都是逆战是吧。这肯定是不行的。这就是传输层要做的事情,传输层完成数据流的区分,他将接收所有的数据,并且确保正确的数据到达正确的应用程序中。
所有的数据都被发送到计算机上面,通过第三层报头完成端对端传输,通过第二层报头完成跳对跳传输。第四层传输层有自己的协议来完成寻址,实现端对端服务对服务的数据传输。第四层的寻址方式第一次涉及到一个概念就是端口,实际上端口就是第四层的概念,出了这一层,没有端口的说法。
# 这里一共有两组端口,一个是TCP端口(0-65535),一个是UDP端口(0-65535)。
TCP和UDP是两种不同的区分数据流的策略,TCP实现更看重可靠性,而UDP更加看重效率。TCP和UDP是两种实现第四层的策略,具体实现十分精妙,后续我们再说,这里不做具体分析,因为很庞大。
# 但是他们的工作原理可以说一下:就是每一个期望在线路上接收或者发送数据的程序,都将与一个特定的端口号相关联(绑定)。
当数据到达网络的时候,除了前面说的会在数据流中封装第二层和第三层的报头,还会封装上第四层的报头。
第四层标头应该指明应该接收数据的特定程序。上图就表示出,数据是发给80端口的也就是网页程序的。以上就是传输层区分数据流的高级描述。下面我们来更加具体的看一下这个问题。
我们来举个例子:
这是一台客户端机器和三台服务器,就像我们前面主机层面说过的,服务器其实也就是一个运行着很多软件程序的计算机,只不过他知道如何响应请求罢了。
这些服务端运行的软件程序,每个软件都被分配了一个预定义的知名端口号。该端口和底层网络应用程序相关联。
此时假如我们的aaa服务器被分配监听使用Https的安全web请求,他被分配到监听TCP的443端口。
bbb服务器监听普通HTTP的web请求,默认情况下监听使用TCP的80端口。
ccc服务器监听20536的udp端口。
此时当客户端向服务端发送请求,请求数据的时候,不仅仅要向固定的IP去发送数据(这里不说DNS解析),还要向对应的固定的端口发送请求。此时客户端会选择一个随机端口作为本次连接的源端口。假如我们要连接bbb服务器,此时他的请求过程是这样的。
我们看到他会封装第四层报头,源端的端口是随机生成的。目标端就是bbb监听的80端口。这里需要注意一点,别被我图里面的那个迷惑了。ip地址是封装在第三层数据报头的,端口是封装在第四层报头的。
而且实际上客户端那个随机的端口是极其重要的,因为他本质上是服务端响应请求的时候,返回给客户端的时候,客户端哪个请求接收响应的端口。举个例子:
当bbb服务器返回web请求的时候,此时的响应数据包就是如上图封装的了,此时要明确返回客户端的端口是谁。
所以每个连接其实都是有一个源端口和目标端口的,目标端口由接收程序确定,源端口由客户端随机选择。
我们看到这个连接是有以下特性的,他们通过端口来确定对端接收程序,每一次发起请求的客户端端口都是随机的。
而你请求不同的应用程序,其目标端口也是不同的,这就可以隔离了数据流的区分。不会混淆。
在此过程中,我们可以在一个客户端对同一个服务器的同一个应用程序发起多次请求。你经常会在网页上面打开多个CSDN的标签页,这时候你每次打开一个标签,都会在客户端产生一个新的随机端口。用来隔离请求。
这就是TCP和UDP的简单原理,他们的工作使得数据被隔离到达了正确的应用程序上面。
而传输层的这一工作也将把我们的视角带到上三层。
# 注意,,端口发生在第四层,你尝尝听到的应用层http默认80端口,其实是有歧义的,端口只有在传输层,这个80是传输层定义的。
5、OSI模型之应用层
你可能会奇怪,上面说的七层网络,现在怎么就直接到应用层了。
实际上在他们创建出OSI七层模型的时候,每一层都有其功能,但是上三层比较模糊,因为每个应用都可以随心所以的实现伍六七层的数据功能。所以他们被统一的归入了应用层中,于是OSI网络模型就被重新划分成为五层模型。这个五层模型被称之为TCP/IP模型。再说一遍,网络模型是方便你理解数据怎么传输的在网络中。所以重点是在1-4层上面,我们就不对567层做具体的区分了。
第五层就是你的应用了。
6、数据流动
上面我们看到了TCP/IP模型的简介,下面我们将以一个实例来说明数据是如何在这五层中传输的。在我们使用这个五层传输栈到底发生了什么。
此时主机A发送数据去主机B,主机要经历的其实就是数据的封装。
而我们之前说的各个硬件设备都在各自的层上面工作,比如交换机在第二层,那么他其实就只会查看数据传过来时候的第二层的标头额就是数据帧,完成下一跳的传输,他不会管其他的层的标头。同理其他也是一样。
但是,我还想说一件事,就是我们一直说IP是第三层协议,TCP/udp是第四层协议。但是这个概念很模糊,他们会有例外。
比如我们说的路由器是第三层工作的,但是有时候我们可以在路由器配置一些访问列表,这样的话,路由器就会查看访问的应用,这样路由器就不完全是在第三层了,他承担了一部分第四层的作用。
三、主机在数据传输中起到的作用
这次我们来了解数据是如何在两台或者多台主机之间进行传输的,其实笼统的来说主机之间的传输分为两种,一种是主机直连,一种是跨网络传输。
其中主机直连也不是就说两台机器就直接连着电线进行通信的,中间可能经过多个交换机这种。
而且跨网络连接指的是经过路由器的连接,多个子网之间的主机进行通信的。
我们先来看一下这种直连的形式的。
1、直连模式
如图所示,这种不经过路由器,就是在一个网络中进行的通信就是直连模式,而且两台通信主机并不知道也不需要知道他们的数据经过了多少个设备,经过了什么样的处理,简单来说就是在同一个网络传输数据,不关心如何连接。
而第二种模式是这样的:
当然了,这种模式下面,通信的主机也不关心和他通信的主机是在一个路由器还是多个路由器的对面,或者干脆就在互联网的另一边。这个他不关心,也不需要关心。我们也不需要分析的太复杂,我们就分析每台主机如何和网络那边的主机进行通信即可。
这两种模式将会覆盖所有的网络通信的原理知识。OK,花开两朵,单表一枝。我们先来看所谓的直连模式。
我们先来讨论两个主机是直接相连的,不要关心中间有几个交换机还是集线器,他们的功能都是一样的。
我们有两台机器,中间通过导线相连,每台机器都有自己的mac地址,ip地址和子网掩码。虽然我们从头到尾现在还没说过子网掩码到底是干啥的,但是我可以简单告诉你,子网掩码就是告诉你一个网络的具体大小的。这一切通过一个叫做子网的概念来说明,而关于子网划分后面我们再说。
此时主机1需要有一些数据data发送去主机2,从网络的角度来看,接收方也好,发送方也罢,其实都不关心这份数据是什么,我们只需要知道有数据发出即可,至于是啥,不关心,也不需要关心。就是一堆0,1从源端发往目的端。
主机1唯一知道的就是自己的IP地址,也知道主机2的IP地址,至于如何知道,后面我们再说。或者可以简单说一句,你知道DNS吧,DNS可以把你要访问的域名转换为IP地址,这是他获取对端IP的一种方式。
此时主机1也就是101.1.12试图与主机2 10.1.1.22发起通信,他可以知道主机2是和他在同一个网络中的。主机1会通过自己的ip地址与子网掩码做比较(位运算)从而得知自己所处的网络上面存在多少其他的ip地址。不管结果如何,但是此时请你暂且明白,主机1已经知道了主机2是处在同一个网络中的。这一切都会在子网划分的模块中揭示。
因为此时主机1知道了主机2的IP地址,所以此时他可以在数据上面封装第三层的报头(自己的ip和对端ip),但是第三层技术不足以让数据在电线中传输,所以他还需要第二层技术也就是他要把第二层的报头封装到数据包上面。但是问题来了。
# 主机1现在不知道主机2的mac地址,怎么办?
此时我们来想一个场景,相信大家都ping过Ip地址,ping就是一种发送数据的过程(icmp协议,后面说)。ping的时候我们只给计算机提供了ip地址,然后计算机自己去计算mac地址,那么计算机如何只用你提供的ip地址就得知了对端的mac地址呢?这就是ARP协议。
至此,我们得知,主机1将不得不使用ARP协议来获取主机2的MAC地址,实际上这就是ARP协议的作用。
ARP协议旨在把一个第三层的地址链接到第二层的一个特定地址上面。
下面我来说明ARP是如何获取对端的MAC地址的。
1、主机1此时要获取主机2的mac地址,他此时只知道自己的IP1和mac1和主机2的IP2,不知道主机2的mac2
2、主机1会发送一个ARP数据包,数据包中包括,自己的IP1 MAC1,以及对端的IP2以及一个FFFF的mac地址,注意这个ffff不是对端的mac,而是ARP协议中一个特殊的保留地址,ffff表示你要想网络上面所有的主机发送ARP数据包就使用FFFF,你也看出来了,他是一个广播的形式,他给所有的主机发送了这个ARP数据包,实际上这也是广播的定义。广播也包括定向广播和本地广播,这个这里不展开说了。
3、ARP存储在每一个带有IP地址的设备中的一个称之为ARP缓存的地方,主机1有IP地址,主机2也有IP地址,所以他们各自都有自己的ARP缓存列表。
此时主机1的ARP缓存列表中只有一个主机2的IP2映射对端的mac2,但是对端mac2他不知道是啥,所以就是这样10.1.1.22---->?对端的ip和一个空映射,因为还不知道。
至于主机2,他现在啥也没有,啥也不知道。他是空的。
4、然而此时当这个ARP请求广播出去,越过了电线,广播到达了主机2的时候,主机2的ARP缓存列表就会发生变化,此时主机2的ARP缓存就变为了10.1.1.12---->mac1
也就是此时主机2的ARP缓存已经知道了主机1的IP1和MAC1的映射了。因为主机1的ARP包过来的时候是带着的。
5、因为此时主机2接收到的主机1的ARP请求里面有主机1的IP和mac,所以主机2在响应这个ARP请求的时候,可以带着自己的IP和MAC直接以单播的形式响应给主机1,于是主机1现在就能把自己ARP缓存中的主机2的IP2和主机2的MA2C的映射补充好了,就成为了10.1.1.22---->mac2
# 此时主机1就有了主机2的IP地址和MAC地址。OK,我们的问题解决了。
此时主机1知道了主机2的MAC地址,主机1就能在自己的数据包上面封装好第二层报头。这个第二层报头将会实现在直连模式下的跳对跳的传播(这里没有路由器,所以不涉及路由器的第三层报头解析,但是对端主机是处于第三层的,所以对端会分析这个IP报头是不是发给自己的)。于是数据就能传入电线或者WIFI的形式到达主机2上面。
数据到达了主机2,主机2会丢弃第二层报头和第三层报头,得到主机1发送的数据,此时就完成了这一次数据通信。
而此时假设主机2还要给主机1回复一个响应数据就简单多了,因为主机2现在已经在自己的ARP缓存列表填充了主机1的IP和MAC的映射关系,所以他能够直接通过主机2的IP得知主机2的MAC,就能直接封装第二层和第三层报头而无需走过ARP的广播了。
实际上,此后这两台机器所有的通信都会简单很多,因为他们已经有了自己和对方的第二层和第三层技术所需要的一切东西了。下面我将以图的形式描述这一过程。
1、此时主机1要给主机2发送数据
2、主机1封装数据的第三层报头也就是源端IP1和对端IP2
3、主机1此时为了传到数据去电线,所以还要封装第二层报头L2,也就是源端的MAC1和对端的MAC2
但是主机1不知道对面的MAC2,所以他去ARP缓存表1里面去看,发现也没有。
于是他就要发起一次ARP通信。鉴于他不知道对端MAC,所以此时是一次广播ARP(对端MAC是FFFF)。
4、主机2收到这个ARP的时候,就知道了主机1的ip1和mac1,就会填充自己的ARP缓存表2
此时主机2就知道了主机1的ip1和mac1,于是他会定向广播给主机1这个ARP响应。
5、主机2响应主机1ARP请求,定向的就不是FFFF了,就是明确的mac2
此时主机1收到响应后就有了主机2的ip2和mac2的映射了,就会缓存到自己的ARP缓存列表1里面,就会变成这样。
6、此时主机1就有了主机2的mac2了,就能封装第二层数据包了,于是这个请求就完成了
此时封装完第二层数据包,传给第一层变为一堆二进制就能发去导线或者WIFI去传输了。
7、主机2再返回给主机1响应
响应的时候,还要封装数据第二层第三层头,但是主机2的ARP缓存表2是有主机1的IP和MAC的映射的,所以他不需要ARP广播了,就直接发。就完事了。
2、跨网络模式
既然是跨网络的模式,就必然是接入了路由器这类设备,于是我们就引出这么一个网络拓扑图。
主机1和主机2位于不同的网段,通过路由器转发交互信息。而且主机1和主机2还有路由器都有自己的ip地址和MAC地址。
而且主机1和路由器还有主机2都有自己的ARP缓存列表。
现在主机1要给主机2发送数据了,主机1知道自己的ip和mac地址,并且他知道对端的IP地址,这个地址可能是客户端写代码发数据指定的。
而且主机1知道对端这个IP和自己所在的IP地址不是一个网络。他会查看自己的IP地址和子网掩码,并且将其与目标地址的IP地址做对比得知这一点。所有的这些都是根据子网划分的知识得知的,后面我们会单独提及此事。但是在我们这里,请你相信,主机1和主机2不在一个网络中。而且主机1是知道他试图通信的对面的主机2的IP地址的。
具体的不多说了,前面说烂了。主机1要发给主机2就得经过路由器,所以就要封装第二层包头和第三层报头,第二层报头就是mac地址的,他是为了发去下一跳的,而下一跳是个路由器,此时他不知道路由器的mac地址。于是就要走上面说的那些ARP的广播来填充ARP缓存列表。
# 这里我们有一个问题:主机1是怎么知道路由器的IP地址呢?他只知道主机2的地址。
答案就是路由器的地址已经在主机1的本机上面配置为主机1的默认网关了。这个你玩电脑的应该很常配置。这就是主机1知道路由器的IP的方式。
所以此时经过ARP的操作主机1就能通过电线发送数据去路由器了,路由器接收到数据之后卸去第二层封装的mac数据包头,获取到数据。此时数据包还有对端IP的第三层报头,此时就交给路由器来完成后面的一切操作,路由器接管。
此后路由器作为源端主机,发送数据会添加新的第二层报头(路由器的MAC),此时不管是后面直接发去主机2还是经过一系列路由器发送过去,主机1就已经完成了使命。
# 这里我解释一点,当主机1缓存了比如路由器的ip和mac的映射,此后哪怕他不给主机2发数据了,而是给和主机2在一个网络的主机6发数据,这个ARP是可以复用的,因为你还是给下一个路由器发包,你还是能用到这个映射,所以你还能复用这个,不用再去广播了。因为他们的第二层网络报头是一样的。
四、交换机在数据传输中起到的作用
1、关于数据交换
我们之前说了,**交换是在网络中移动数据的过程。**而交换机的功能就是数据交换。
我们在这里将会以一副交换机和四个主机相互连接的案例来了解这个过程。但是重要的一点就是我们要明白,所有叫做交换机的东西都将以下面我们描述的这种方式来工作。我们将会简单的描述这些主机之间相互通信的交换规则。他们都将需要IP地址和MAC地址。
既然交换机只负责网络内部的通信,不涉及和其他网络交互的操作。这就告诉我们所有通过交换机通信的主机设备必须属于同一个IP网络。这一点你在图中也能看到,都是10.1.1.x的网络。
而这个例子中关于主机A和主机D做通信是如何实现的呢?
在之前我们描述了主机在网络中的操作,这里就不做太多描述了,当然了之前的操作在这里还是适用的,但是我们这次在这里只关注交换机。不关注之前的路由器之类的了。如果你还记得,交换机是第二层设备,所以这里他只会使用第二层报头来做决定。也就是说交换机压根不会关心第三层报头。
**事实上,第二层报头后面所有的数据都会被交换机视为简单的数据。**你我都知道,实际上是存在一个第三层报头的,但是交换机压根不会关心的。他只会根据第二层报头做出下一步决定。因为交换机不关心第三层技术,所以我们在这个例子中,我们只讨论第二层技术,所以我们为了简化拓扑网络,可以在网络拓扑中去掉所有包含IP地址的设备。这样我们就能只关心第二层了,不用关心IP地址了。
下面我们就来分析数据是如何从主机A到达主机D的通信过程。
现在我们简化操作,我们认为主机A已经知道了主机D的mac地址,他们是通过ARP技术来知道这件事的,前面说过了,这里就不说ARP了。
在交换机中维护并且使用着一个MAC地址表,mac地址表是交换机端口和MAC地址的映射。在网络拓扑中的每一个主机都通过特定端口插入到这个交换机中去。
就像图中一样,每个设备主机插入不同的端口,分别是1,2,3,4。每一种不同的星号的交换机,都会使用不同的端口编码。当然了不会是1234这种。我只是举个例子。
MAC地址表包含的是特定的交换机端口和连接到该端口的设备的映射。类似这样。
通过这张表,交换机就能知道在2端口的地方连接着mac地址为b2b2的主机。相信你看出来了,交换机,只关心mac地址,其余的可以去死。和ARP缓存表一样,这张表一开始也是空的,当数据流过拓扑图的时候,交换机将会填充这个映射表。
在这个mac映射表之外,交换机只做三件事,学习,泛洪,转发。所以,如果你理解了这三个动作,你实际就理解了交换机的工作,也就明白了数据交换的原理。换言之,你遇到的所有的交换机,不管品牌,厂商,星号,版本,其实都是这样的原理。
主机A在封装完数据包后,转为二进制发到电线上面,把数据放到线路上面。此时交换机将会执行他的第一个任务就是学习。学习这个动作,会使得交换机更新他的mac映射表,其中包含交换机端口,和数据帧的源端的主机的mac地址的映射。
当数据发送到交换机上面的时候,交换机将会更新他的映射表,存储a1a1和1的映射关系。这就是学习动作,交换机将会学习把所有的源端的mac地址和他的端口做好映射。现在他要发挥他在第二层技术中的作用了,他将会查看数据包的目的地址,他发现数据包是发往d4d4的D主机的。(数据包封装了报头,前面说过的)。
你我当然都知道d4d4位于拓扑图的另一端,你甚至知道他就是主机D,但是当前局势下面,交换机不清楚。他只知道1和a1a1的关系。他也不知道d4d4是插在哪个端口。所以他现在啥也不知道,它能做的就是把接收到的数据包,复制出来发送给接入他的所有主机。也就是主机BCD。注意,他不会发回去给A,他会转发给除发过来的源端主机此外的所有主机。这一操作,就是泛洪。泛洪动作导致交换机上面的所有主机都能接收到帧的副本。当主机BC接收到数据帧,他会查看报头的目的mac,当他发现目的mac不是自己的时候,就会丢弃这个数据帧。当主机D接收到,发现目的就是自己,双向奔赴的爱情,他们注定有结果,D就会处理这个数据帧。这就是数据从A到D的过程。
此时主机D收到了数据包,他要发送一个响应给主机A,于是他封装数据放到电线上,数据来到交换机,交换机又会触发他的学习操作,记录mac端口映射。于是此时变为这样。
那么此时交换机能干吗呢?他会查看数据帧的目的端mac地址,这次他不会简单的泛洪了,他之前已经学习了A主机的映射,所以此时他有目的性的发给了主机A。这就是交换机的第三个动作,转发。转发动作使得交换机把数据直接发送到相应的出口,而无需泛洪。这一次之后,主机A和主机D之间发送数据,就都是直接转发了,不涉及学习和泛洪。这就意味着主机BC再也得不到任何副本数据。
其实这就是所有关于交换机的交换数据理论,但是问题来了,实际上路由器这个工作在第三层的也是这样,但凡你是为了数据流动做努力,他就是这么个流程。只不过他们作用的位置不同。
而每一个主机的网卡都会有一个mac地址,平时他们不工作,当你想给交换机发一些数据的时候他们就会站出来。
同样的,你千万不要以为交换机就只有mac地址,他也可以配置IP地址,当你给交换机配置了IP地址,交换机就等于一个主机了,只不过他比较特殊这个主机,普通主机不是也有私有ip么,交换机肯定也有。但是他始终是工作在第二层的。但是他有IP,所以其实你可以用SSH的协议登录上去管理他。
同样的,你千万不要以为交换机就只有mac地址,他也可以配置IP地址,当你给交换机配置了IP地址,此时交换机实际上就会工作在第二三层。这里我看到说可以给交换机配置一个IP地址,此时交换机就相当于主机。此时交换机实际上既能解析第二层报头也会检查第三层报头。拿到二三层报头,做下一步的发送,解析都在她这里做了。
2、泛洪(单播&&广播)
之前我们说了,当主机A给主机D发送数据的时候涉及到泛洪操作,但是我们要明确一点就是那是一种单播泛洪。对于单播的定义就是一对一的数据通信,也就是我们例子中的主机A给主机D发送数据。
那么如果我们的主机A发送的是广播的数据呢,比如此时主机A发送的是一个ARP请求呢?当你知道了他是一个ARP请求的数据包的时候,那么意味着这个数据包的目的MAC地址都是FFFF(表示把数据包发送给本地网络上面的所有主机),也就是他是一个广播类型的数据包。
这里当你发送一个广播的帧的时候,此时数据包是FFFF,流程依然是把数据放到电线上面,发给端口1,此时交换机因为看到他是一个广播类型的帧,所以他压根不会去检查MAC映射表,他直接就会发起泛洪。
而只有在单播的时候,他才会涉及到这个表,当他学习到这个mac和端口的映射后,之后的数据包过来他就能直接转发。但是这种操作在广播不会。
所以我要说明的一点就是,单播和广播是针对数据帧的类型说的,他和泛洪不是一个概念,泛洪是一种交换机的操作,而单播和广播是数据帧的类型,特别是FFFF类型的帧表示的就是广播。
交换机触发这三个动作的时机就是数据流量经过交换机的时候,在这一点上,交换机本质就是一个主机,只不过是一个特殊的主机。这就是单播和广播的区别。
可以简单的理解就是广播总是泛洪,而单播只是偶尔泛洪(映射表有的时候就是转发,不会泛洪)。
3、vlan
泛洪这个操作其实说白了也很容易理解,就是交换机在不知道目的的时候,会把数据包复制传播下去。而这个概念,也会把我们的视角带到一个叫做vlan的地方。
vlan代表虚拟机局域网。vala允许做的一点是你拿一个交换机,可以连接多个主机,通过不同的端口。而他允许你把这些端口划分为隔离的独立组。如图所示:
这个交换机上面有四个机器连接在四个端口,我们人为的把AB划分在vlan1上面,把CD划分在valn2上面。形成两个独立的隔离组。此时这个交换机就相当于多个小交换机,我们这里等于两个小交换机。每个小交换机上面都能独立的执行自己的操作。这就意味着vlan1这个交换机上面要维护自己的mac映射表,而vlan2这个交换机上面要维护另一个mac映射表。交换机会在自己的隔离组中完成学习,泛洪和转发三个操作。他的本质是在你大的物理交换机中创建小的交换机组。
而这个小的交换机组是我们逻辑划分出来的,这个逻辑分组中的每一组,就被称之为一个valn,所以你实际在使用vlan的时候,之前的交换机理论依然适用。
你所做的就是把这几个操作,限制在了你划分的组内,使用一组自己的端口,这其实也是一种虚拟技术。
4、多个交换机的场景
在我们进行了一系列枯燥的文字描述之后,我们此时再来看一下多个交换机在网络中的时候是如何工作的。而这个操作我们将使用如下的网络拓扑图:
此时我们来讨论,主机A要给主机D发送数据,此时我们不说ARP了就,为了简化主流程。
主机A发送数据包,封装二层数据报头,他是通过ARP知道对端的mac地址的,这两个交换机并不会共享映射表中的信息。
此时数据报放到电线上面被发去端口1,交换机接收到数据之后,在mac映射表中查找目的端mac4的映射,此时映射表是空的。所以他无法得知对端在哪里,此时他先做学习动作,学习mac1的映射,于是他在映射表中记录学习结果mac1---->端口1。
然后他会查看这个包的目的mac地址是mac4,但是他不知道mac4对应的主机在哪里,于是此时他选择泛洪(我们的数据帧不是广播帧ffff,所以是单播泛洪)。泛洪的操作就是把数据包发给他所在网络上面其余的所有主机(除了源端),也就是整出副本发给主机B和交换机2(右边的交换机)。主机B拿到数据包一看不是给自己的就会默默丢掉这个包。
于是数据包来到了交换机2,此时交换机2会学习这个数据包,因为数据包的src是mac1,所以他会学习mac1的映射和自己的接收端口建立映射关系,并且更新自己的mac映射表。
此时一切都来到了交换机2这里,交换机2此时也无法得知mac4的位置,所以他在学习之后又会做一次单播泛洪,这次泛洪的结果就是主机c和主机D都会接收到数据包,然后主机C依然会丢弃。而主机D就会接收到数据。然后按照理论,主机D要返回一个响应数据。于是主机D把响应数据封装为包放到电线上,发给交换机2的端口4。
此时端口4查看映射表,发现自己没有源端mac4的学习信息,依然会发起学习操作,更新自己的映射表。
然后他按照要求会发送目的地位mac1的数据包,他查看自己的映射表发现在端口6,于是他直接转发给端口6,此时端口6直接转发给交换机1,数据包就来到了交换机1的5端口,.此时交换机1照例会学习数据包。因为此时数据包是源端为mac4,并且他是在端口5接收到这个包,所以交换机1会学习这个信息,并且更新映射表。
此时数据在交换机1了,他看到目的是mac1,直接查看映射表得知主机A在端口1上面,直接通过端口1转发数据到达主机A.
那么这就是所有的过程,此后的数据传递,交换机就有了信息,能查看映射就会直接转发,不能就泛洪。而学习只是为了知道目的主机在交换机的哪一端。
而且你可能会发现,从主机C到达交换机1的数据会建立起mac3---->到端口5的映射,这个当然是允许的,允许端口5和多个mac地址来建立映射,因为他们的映射关系是来源于数据流量流到网络上的。只要流过就会触发学习。
五、路由器在数据传输中起到的作用
1、前置概念
这里我们来描述一下路由器是如何为了促进网络中数据传输而努力的。
我们先明白一个概念,就是交换机是在同一个网络内部进行数据传输的,而路由器的位置是在促进不同的网络之间的数据传输。
我们之前说主机设备的时候,说过每个网络都有自己的网络空间。网络中的每个主机都有自己的IP地址。如下图所示:
而且我们还说了路由实际上就是网络之间移动数据的过程。而我们今天的主角就是路由器,他是一个主要用于路由的设备。他的工作位置如下图所示:就像这样:
而这里我们主要说的就是路由器,我们先来梳理一下之前的逻辑,我们在一个网络中拥有两台主机。每个主机都有自己的IP地址和MAC地址。而在这个网络中我们要这两台主机交谈,我们需要一个交换机。这个过程就是我们前面说过的交换机的原理。。如下图。
而如果一旦涉及多个网络之间主机的交互,我们就需要一个路由器。此时路由器也接入了网络,路由器此时就是一个主机。既然是主机,那他也有自己的IP地址和mac地址,这个路由地址就是你这个网络和外部网络交互的出口,额,,,也就是网关地址。这都是我们之前在第二层和第三层技术中说的东西。
这里我们为了减少变量,我们只讨论路由器,不说交换机的事情了,但是交换机的理论依然是适用的。于是我们简化网络拓扑图为如下设计:
在这里插入图片描述
这里话说回来,如果路由器和主机一样,都有自己的IP地址和MAC地址,在第二层和第三层上面表现得简直就是一样的,那么我们如何去从概念上区分主机和路由器的区别呢?你可能会说,路由器就是路由器,这不是一看就显而易见吗?路由器的样子千奇百怪,而学术概念的定义是区分他们最合理的手段。
其实要区分这两个概念,可以引用关于IPV6的RFC。如果你不熟悉这个,RFC的全称实际上是requests for comments,这是定义互联网标准的文件类型。曾经我见过一句话。
当你争论网络世界中的工作原理的时候,谁能引用RFC,谁将获得胜利。
因为RFC实际上就是建立互联网传输标准的指令。你看看,根正苗红,无解。不过他这套定义同样适用于IPV4的概念。RFC中认为,实现IP或者拥有IP的任何东西都被称之为节点。
然后他将路由器定义为任何转发不向自己发送地址的数据包的节点,这个定义使得主机的定义就被剥离出来,主机仅仅是一个节点,而不是路由器。
所以路由器和主机之间真正的区别在于路由器转发的数据包不是他们自己的,也永远不可能是他们自己的,注意这句话十分重要。我来举个例子:
# 当一个网络中出现一个数据包的时候,作为主机会查看这个数据包的报头。如果是他自己的就接收,如果不是他自己的就丢掉这个数据包,如果是他的那就接收处理。这是主机的做法,这个包有可能是他的。
# 而作为路由器,路由器接收到一个数据包的时候,他会知道,这个包永远不可能成为他的,所以他只会尝试着努力把数据包转发出去。
这就是主机和路由器的不同之处。
当然了,路由器不会只转发一个数据包,他必然会把这个包转发去其他网络,所以网络拓扑中必然还存在另一个网络,如下图所示:
而我们说路由器有自己的IP和MAC地址,这句话的意思实际上就是路由器连接到一个特定的网络的意思。所以我们说路由器在他连接的多个网络实际都有一个在该网络中的IP和MAC。这样才能说他处于这个网络上面了。于是这个图就变为了这样。路由器和每个网络都有一个适配的地址。
2、路由器接入多个网络
2.1、关于路由表
为了实现路由器的目标,路由器必须维护一个他所知道的所有的网络的映射,这个映射关系被称之为路由表。路由表内部有所有的网络关系的映射。而每条路由仅仅是一组如何到达特定网络的指令。
用我们这个拓扑图来举个例子就是:他内部有两个路由指令。
1、路由器1知道通往55网络的任何地址,并且他会知道应该使用的是路由器左边的接口。
2、路由器1知道通往44网络的任何地址,并且他会知道应该使用的是路由器右边的接口。
而在网络中路由器的左右的接口有更专业的称呼,比如fa01,gig002。这太专业了,我们还是用左右接口来称呼吧。而且路由表是一个非常重要的概念,实际上大部分网络工程师的工作就是确保路由表的正确性,以便在网络中正确的移动数据。
3、填充路由表
对于填充路由表在网络中有三种方式:我们分别来讨论这三种模式:
3.1、直连路由
对于每个路由器直接连接的每个网络,都存在一个直连路由。比如我们上面那个图,路由器1直接连接到44和55两个网络。此时路由器1的路由表中就存在两个路由信息。DC是直连的意思,driect connect
路由表中存在两个路由信息,此时路由器就知道44网络位于他的右侧接口,和44网络通信就使用右侧接口。同理也就知道55网络的信息。此时如果我们再次加入一个网络进来呢?就变成了如下图所示的66网络的分布。
此时假如我们要从主机10发送数据去主机8,此时数据包SRC:10.0.66.10 DST:10.0.55.8这样的数据包发送到路由器2的时候,路由器2查看自己的路由表得知这个IP药走right接口,就会转发到55网络给主机8。
要是此时我们的主机10想给主机9发送数据呢,此时数据包SRC:10.0.66.10 DST:10.0.44.9这样的数据包发送到路由器2的时候,路由器2的路由表没有这种映射,很不幸,此时他不知道发给谁,不知道如何到达你指定的44网络,所以他会丢弃这个数据包。
这种很显然不行,也不符合我们的现实,,我们需要跨网络传输。但是显然因为路由器2现在和路由器1的网络无法沟通,但是幸运的是,我们还有两种填充路由表的方案来补充。
3.2、静态路由
每当网络管理员动态的向路由器提供关于特定网络位置的指令的时候,静态路由就会存在。
比如我可以登录到我的路由器2上面,给他配置一个静态路由,告诉路由器2,无论什么时候它想到达44网络,他都应该把数据包发送到路由器1的IP地址,10.0.55.1,于是此时我们的网络拓扑图成为这样。
现在,如果路由器2从主机10接收到发给主机9的数据包。此时路由器2查看路由表知道把数据包转给10.0.55.1这个位置,然后路由器1查看路由表得知转发给路由器1的右侧接口,这样就转发给了主机9了。
那么此时主机9要返回一个响应给主机10呢?此时路由器1不知道66网的路由信息。所以按照常理会丢掉这个数据包。但是我们在配置静态路由的时候,给路由器2配置完了,还得给路由器1配置一个静态路由。变为这样。其余的就和上面一样了。
这就是我们通过静态路由的方式告诉了路由器之间无连接的时候是如何进行数据寻址的。
最后我们还有一种路由表的填充方式,那就是所谓的动态路由。
3.3、动态路由
实际上动态路由和静态路由差不多,静态路由是我们明确的告诉路由器和指定的哪个网络做映射。动态路由其实也差不多。动态路由是路由器自动的相互通信,并且共享他们锁知道的信息,以便告诉彼此如何到达他们可以到达的网络。
假如此时我们要去掉这些静态的配置如下图:
此时我们就让路由器1和2之间进行动态路由,路由器1将会和路由器2分享路由器1知道的44和55网络的信息。路由器2会说,额,,,我知道了55网络(因为他就连接着),但是我不知道44网络。那既然你告诉我了,那我就记录一下。是不是很像交换机的学习动作。
以后路由器2发送到44网络的任何东西都会发送给路由器1。同样的路由器1发送给66的任何东西都会发给路由器2,于是他们各自把自己不知道的部分,当对方告诉他的时候会以动态路由的信息填充到路由表。于是网络拓扑图变为如下:
实际上,动态路由的填充结果和静态路由的填充结果是一样的。但是区别就在于如何学习这个映射规则。如果你是网络管理登录到路由器的管理界面手动配置的那就是静态路由,如果是路由器动态学习自动的相互通信互相学习的就是动态路由。
路由器之间用来交换动态路由的确切方法是由不同的动态路由协议控制的。比如什么RIP OSPF BGP EIGRP IS-IS等等。这些协议的不同之处在于彼此共享网络路由信息的频率。
他们如何发现对方的存在,每条路由包含什么类型的信息,对于接收或者发送的路由有多大控制权。这个内部设计是硬件的领域,这里不做过多描述,实际上这是网络工程领域很大一部分。
4、路由器的ARP
我们之前说过,ARP协议的作用是查找网络的第三层IP地址到第二层mac地址映射的一种协议。那么路由器作为第三层的设备,其拥有第三层的IP地址,其实他同样拥有ARP协议所需要的一切。实际上,所有有IP地址的设备都有一个ARP映射表。这不难理解,因为他在网络中需要封装报头,对于IP所在的第三层技术来说,他必然要封装他所知道的对端的第二层报头。这必然涉及ARP协议。
每个路由器都有自己的路由表映射,如下图。
所有有IP地址的设备都有一个ARP映射表,路由器有IP地址,他自然也有ARP映射表。在每种情况下,路由器的ARP表将维护直连网络中所有节点的IP地址到MAC地址的映射。如下图网络拓扑。
有了前面的知识,要想描述出这么一副拓扑图其实并不难。但是和路由表不同的一点是,ARP映射表一开始是空的。他们将会因为数据流量流过而动态的填充ARP映射表。这一点和路由表不同,路由表必须预先填充才能发挥作用。之前我们说过,路由器接收到一个他不知道往哪里发送的包他会选择丢掉这个包,所以如果你不填充这个路由表将会丢失数据包。但是对于ARP,如果路由器没有他需要的ARP表项,它可以简单的通过地址解析来找出他需要什么。
下面我们来描述路由器1和路由器2如何使用他们的路由表和ARP表来让一个数据包从主机a通过这两个路由器到达主机c。
5、ARP表和路由表配合工作
首先我们来准备这个网络拓扑图。
1、首先主机A将会准备一个数据包,这个数据包可能是你new了一个user对象这样。注意此时的ARP数据映射是空的。
此时主机A准备一个数据包,并且封装上第三层的报头,报头里面有源端和对端的IP地址。主机A此时可以通过查看自己IP地址,通过子网掩码的对比来确定对端的IP是不是和自己在同一个网络上面。很显然,我们这个例子中源端和目的端不在一个网络上面,也就是我们常说的不在一个网段上面。
此时主机1将会把数据包发送到默认网关上面,也就是路由器1左侧的接口。
问题来了,这是主机A发送的第一个数据包,他并不知道路由器1的mac地址,所以他无法封装第二层报头,也就不能找到对应的网卡进而传送数据。
所以主机A在进行发送数据之前,必须进行ARP操作。
2、主机A进行第一次ARP操作
我们先来审视一下这一步操作,我们为什么要进行这一步操作,我们的主机A现在要发一个数据包,但是他发现这个数据包是在别的网络,所以他要把这个数据包发给他配置的网关地址,也就是路由器1。此时这个网关地址是在他的主机上面配置的,他是知道这个地址的。
所以他现在什么都知道了,就可以给他要发数据的地址也就是路由器1的地址发一个ARP来获取路由器1的mac地址封装第二层报头。
此时主机A发送ARP请求包给路由器1,来请求IP地址为10.0.44.1的mac地址。主机A发出的ARP请求包包含自己的IP和MAC的映射。
此时路由器1接收到这个包之后,第一次发起学习,他就能知道,哦,网络里面有一台主机A的ip是10.0.44.9.他的mac地址是a9a9。于是路由器1第一次更新自己的ARP映射表。
此时路由器1将会生成一个响应,该响应包括主机A试图解析的ARP映射。也就是路由器1的IP地址和MAC地址,返回给了主机A。
主机A此时就得知了他的默认网关的IP地址和MAC地址的映射了,此时他就能填充他的第二层报头了,并且也能填充自己的ARP映射表。于是变为这样。
3、主机A完成ARP映射表的填充以及第二层报头的封装
此时主机A终于完成了这个数据包的第二层报头的封装,他会把这个包从主机A发去路由器上。变为这样。
路由器收到这个包之后的第一件事就是丢掉第二层报头,因为他也已经没用了。他完成了下一跳之后第二层报头就没用了。记住 **第二层报头的唯一作用就是让数据包从一个MAC地址发去另一个MAC地址,一旦成功就会被丢弃。**现在他已经完成了使命,所以被丢弃了。此时变为这样。
现在路由器1将会在他的路由表中查看目的IP地址。他会尝试找到一个匹配来决定他这个数据包发送去哪里。因为我们这个包的目的IP地址是10.0.66.7,在路由器1的路由表中存在一个映射,就是Static 10.0.66.x/24 10.0.55.2,所以他可以知道这个数据包可以被发送往下一跳地址为10.0.55.2。这个地址是路由器2的地址。于是此时路由器将会把数据包发送去路由器2。
4、发送去路由器2
现在路由器1将要把数据包发去路由器2了,也就是从mac地址为eee3的地址发去mac地址为eee2的地址。于是他要包装第一个第二层报头。
问题在于此时在路由器1的ARP表里面没有IP地址为10.0.55.2的ARP表项。于是他依然没有办法封装这个第二层报头,所以他只能再次执行地址解析协议发送ARP请求给路由器2也就是10.0.55.2。
这个ARP协议依然包含他自己的Ip地址和mac地址的映射,也就是10.0.55.1---->eee3,于是在路由器2接收到这个ARP请求之后,就会学习这个ARP映射的关系,填充他自己的ARP映射表。并且返回给路由器1自己的ip和MAC地址的映射。让路由器1填充自己的ARP映射表,并且封装第二层报头。就变为这样。
此时可以把数据包从eee3这个网卡发去eee2这个网卡了。次数数据包就到达了路由器2。一旦到达路由器2他就完成了下一跳的工作,此时路由器2将会丢弃这个数据包的第二层报头。变为这样。
此时路由器2将会查看路由表确定目的地址10.0.66.7的下一跳是不是存在于路由表映射中。发现有一个DC 10.0.66.X/24 left。所以此时他知道他应该从路由器的左侧的接口转发出去这个数据包。而且根据路由表显示,此时下一跳的地址是DC模式的路由,也就是直连的地址。所以他现在知道他的目的网络到了。也就是他到达了最后一跳,因为这是个直连的形式。
所以此时他将会发送数据包去目的地址,但是此时他并不知道目的地址10.0.66.7的MAC地址,无法封装第二层报头。所以他继续发起ARP请求。所有的步骤和我们之前一样,经过一系列操作之后,主机C在接收到ARP请求后,主机C的ARP映射表学会了路由器2的ARP信息,而生成的响应会让路由器2的ARP表中填充主机C的IP和MAC的映射。并且封装这个数据包的第二层报头。变为这样。并且发送至主机C。
此时数据包到达对端,主机C将会丢弃第二层报头,第二层的目的就是为了从一个MAC到达另一个MAC。此时他完事了。他是网卡级别的。
主机C会检查第三层报头发现数据就是给他的,所以不再往下传了,此时就会丢弃第三层报头。当然了前面的流程数据包到了主机也会做检查。
第三层报头的作用就是把数据从一个IP地址传送到另一个IP地址,他是网络级别的。此时主机C拿到了数据user对象,然后反序列化,就能看到你那些属性了。
5、数据响应
前面我们看到了数据包是如何从主机A发送去主机C的,现在主机C也收到了数据包,此时他会返回一个响应给主机A。这个响应其实过程差不多,只是会快很多。
因为每个设备都已经经过一轮ARP的学习填充了。此时主机C有一个响应数据包响应给主机A,但是在路由器看来,他不知道这是个响应,他不关心这个,在他看来这就是一堆二进制数字。
因为过程其实差不多,所以我就不画图了,就简单的用文字来描述了。
此时主机C发起数据包,会封装一个第三层报头,为SRC:10.0.66.7 DST:10.0.44.9 因为对端地址不是一个网络,所以要发送给默认网关,也就是路由器2的地址10.0.66.2,但是因为不知道他的MAC地址,所以要先去看一下主机C的ARP表,发现有10.0.66.2的ARP表项,mac为eee4。所以此时就直接去封装第二层报头。发给路由器2.路由器2拿到之后丢弃第二层报头,检查对端地址为10.0.44.9,发现在他的路由表里面有static 10.0.44.x/24 10.0.55.1这个映射,所以直接就发去10.0.55.1,这个实际上是路由器1的地址,但是此时他没有路由器1的MAC地址,无法封装第二层报头。于是他要去检查路由器2的ARP表发现有,封装第二层。然后发送给路由器1,路由器1此时退去第二层报头,然后发现目的地址是10.0.44.9,他去查看自己的路由表发现是直连的,而且从右边接口发出,所以就开始封装第二层报头,但是他不知道10.0.44.9的mac,就要去查看自己的ARP表,发现有这个表项,对端MAC为a9a9,所以直接封装第二层到达对端。然后丢掉二层三层,反序列化,最后看到code是200就返回前端,500就异常,这都是http协议了,这里不多说了。
OK,到此为止我们说完了数据包是如何在多个路由器之间传递的。如果有互联网接入也是一样的。因为互联网本质就是一堆路由器,没有区别。
6、层次结构的网络拓扑图
之前我们描述的一直都是一个很直白的网络结构,比如路由器都是线性的,都是直连的。实际上这种结构很少。所以这里我们来描述一个相对稍微复杂一点的网络结构拓扑图。而网络拓扑设计为层次结构的路由器,将会使得网络拓扑更加容易扩展,并且对于网络中的用户提供一种更加一致的连接。
我们先来看一个设计为层次结构的路由器连接结构。
我们为一家名为阿外巴巴的公司分配了两个不同地域的子网。每个地域子网下面分配了不同部门的子网。各个部门使用各个层级的子网来划分。我们可以看到这个拓扑结构就有明显的分层次。每个子层级用的是不同层级的网络。OK,拓扑的描述就到此为止。我们就基于这个结构来说明一下为什么上面说这种层次结构将会使得网络拓扑更加容易扩展,并且可以对于网络中的用户提供一种更加一致的连接。
6.1、层次结构的好处
假设此时我们的北京分公司今年赚钱了,想扩展两个单位,所以此时的北京网络就需要扩大并且增加两个网络。比如说就叫会计网络和服务台网络吧。在每一个网络新增进来都有一个路由器来处理每个网络的流量,于是拓扑图就变为这样。
不管怎么变,新加进来的路由器和网络都可以直接水平扩展进来,然后统一接入到一个聚合的路由器上面就可以了。这两个网络就直接被接入到公司的网络拓扑的其他部分了。这就是层次结构方便扩展的特点。
而关于网络中的用户提供一种更加一致的连接这个问题,我将用一个反例来说明这一问题,假设我们现在路由器都是线性连接的,比如这样。
那么对于我的销售部门要和研发部门通话就要经过两个路由器。
而销售部门和服务台部门通话就要经过五个路由器。
而服务台部门要和互联网通信需要经过6个路由器。
销售部门和互联网通信需要经过两个路由器。
这种表现看来就对于某些子网很不友好。所以这种模式对于用户来说不具备一致性的连接方式。
并且如果销售团队的路由器发生故障,那其他子网都不能访问互联网了,很垃圾。
我们设计为层次结构的中心化通信,这种是具有很好的扩展和一致性的。当然了,我们之前描述的线性方式的连接理论在这里依然生效。因为即便是分层部署的,但是各自的路由线路还是一条线,这依然符合我们之前说的东西。
而且除了以上的原因,还有一个我们使用分层部署的原因是一个叫做路由汇总的概念。为了描述这个概念,我们需要来看一下路由器五的路由表。
我来解释一下路由表中24的意思,这个概念本身是子网划分的概念,这里我只说他的用处,当我们一个数据包比如说SRC:XXXX DST:10.40.77.8出现在路由器5的时候,这时候他会去路由表对比前24位,也就是10.40.77发现他应该走这个条路由表项,所以他会被发去路由器8.
24的意思就是前三个字节,也就是IP地址四部分的前三部分。
6.2、路由表合并
基于上面的知识我们来看这个路由表,我们发现一件事,后面三个路由表项都执行路由器4这个路由器。这种情况下,我们完全可以把这三个表项合并为一个。也就是我们知道当你目的地址为10.20开头的IP地址都将被发送去路由器4,于是我们就从比对IP地址的前三个部分变为比对前两个部分,也就是前16位。于是路由表变为这样。
所以此时我们就知道只要是发送去10.20开头的数据包都将被转发去路由器4,从而去往大同分公司。但是就目前看来,你这个合并路由表项好像也没啥意义。因为总共就合并了三个。那如果公司赚钱了,开始扩展业务呢,后面会加入一堆的部门进来,这种合并就显得很有意义了,起码在路由器存储角度,你的成本是降低了不少的。而且你后面不管咋增加,我就这一个,也不用变,。因为我匹配的是这个规则下面所有的网络,实际上他的意义就是匹配的所有的大同公司下面的网络。
那么我们还能更进一步吗。我们来看路由器8的路由表。
我们首先可以把下面三个路由表项合并。变为这样。
此时我们再进一步,可以发现还有三个表项是指向路由器5的,我们可以进一步合并为。
此时我们就完成了这个合并,合并后的内容只匹配前8位就可以了。此时的意思就是只要前面是10的IP地址都会匹配到这个路由表项。
那么假如说,此时在路由器8上面出现一个发去10.40.77.8的数据包呢,此时他查看路由表去发现他能匹配上两条路由表项,就是他这个包符合路由表里面的两个内容。这种时候我们路由器必须要知道这个数据包匹配哪一个路由表项来转发这个数据包。而路由器决定的方式也很简单,就是哪个更具体就使用哪个匹配,在这个例子中,上面的10.40.77.0/24---->DC这个路由表项比下面那个全匹配更加具体,所以就使用第一个路由表项。这个策略其实还有很多,后面专门可以研究一下。这里就先这样。
我们在来看拓扑图,我们看到路由器8的数据如果要和互联网通信,他的下一跳地址永远是路由器5,所以我们其实就可以比/8更进一步。因为路由器8无论是要和巴黎还是哪里还是互联网任何地方通信,总是要经过路由器5的。所以我们可以给路由器8设置一个默认路由。默认路由有点像最终的路由汇总。如下图所示这样。
他是一个全0的地址。/0的意思就是匹配前0位,也就是不匹配。也就是说每一个IP地址都会被这个路由表项所匹配。这个默认路由的意思就是告诉路由器8,要到达任何地方,就去路由器5。实际上你观察这个路由器的结构就是他要和任何网络通信都会经过路由器5。然后路由器5再经过他的路由表分配下一跳路径。这就是所谓的默认路由像一个最终汇总路由。而路由汇总只能是你把路由结构部署为层级结构的时候才可能实现。
六、关于一些协议
上面的其实都是一些基础入门的东西,而且有些偏于硬件,对于JAVA开发来说这一块东西是帮助理解数据的传输流动的。但是不是最重要的。不过没有上面的铺垫,对于你理解网络传输也是不足的。所以有时间还是看一看。
但是重要的是协议,他直接约束了网络传输的规则。以及数据包的定义格式。不懂协议就不懂数据包,也就不懂网络。所以下面就开始进入协议的篇章。但是是直接从TCP协议开始的,传输层的东西是网络编程主要对接的部分。不过可以先来了解一下一些常见的不常见的奇奇怪怪的协议。
1、什么是协议
协议就是构成互联网标准的一套规则和消息。比如我们前面逼逼过一嘴地址解析协议(ARP协议),这个协议要做的事情就是解析IP到MAC地址的映射,协助完成第二层报头的封装。他们允许完成两台主机发现彼此的MAC地址,在他们只知道双方的IP地址的前提下。这通过发送ARP请求和响应ARP请求来完成这一目的。
2、有哪些协议
ARP协议
问题就在这里,我们说的是发送响应ARP,但是我们需要知道我们需要发送什么东西。ARP请求中询问了什么问题,或者ARP请求中包含了什么信息,或者ARP请求中添加了什么作为目的MAC。
同样的,我们也需要确定ARP响应的样子,你需要知道你得到了什么。ARP的规则由RFC826号文档来定义。至于RFC不说了,他们遵循一个严格的文档递增定义规则。这个后面再说。实际上你可以通过查阅RFC 826号文档来了解ARP协议会话的所有规则。这些规则作为互联网标准发布的事实,允许ARP协议在不同的网络供应商去实现。而大家都遵守这个规则,就能够使得你的苹果手机和小米手机可以通话。这既是为何我们使用ARP的时候即便厂商不一样,也能使用同一种语言。
FTP协议
或许你还经常听说的一种协议叫做FTP协议,FTP允许客户端服务器互相发送和接收文件。
FTP的对话消息由如下部分组成。
客户端将会发送retr命令,他代表retrieve,请求指定的文件。这将会提示服务器响应该文件。
SMTP协议
这个协议的意思是简单邮件传输协议。这是电子邮件协议用来交换电子邮件的协议。
客户端也就是邮件发起人,将会向SMTP服务器发送hello命令,然后SMTP服务器将会以250响应码进行250响应。
现在客户机和服务器可以互相交换电子邮件了。
Hello和250只是SMTP标准中的一些消息。
HTTP协议
还有就是大名鼎鼎的HTTP协议,也就是超文本传输协议。这就是你在任何时候任何地点和WEB服务器通信时候使用的协议。
web服务器托管下,许多网站都是用超文本标记语言HTML编写的。这些HTML格式的页面都是使用http请求交换的。
当你浏览site.com的时候,你可客户端,也就是你的浏览器会向web服务器发送一个get请求,web服务器将会响应一个200 ok消息,然后提供你所要求的网站。至于如何解析你发起的地址,这个规则很多不过这都属于应用层协议,这里不多说了。
SSL&&TLS协议
这两个协议允许客户端和服务器之间建立安全通道。
然后他们可以在通道中进行HTTP对话,这个过程就是所谓的HTTPS,他就是在SSL或者TLS通道中进行保护的HTTP对话。这可以让你安全的浏览网页。
这些都是比较重要的协议,在真实网络中实际存在成千上万种协议,这些协议的存在使得网络互联成为可能。他们各自为某一种功能做出贡献,互相配合。
3、一些其他的
其实概括就到这里了,但是我还想说一下关于些其他的东西。就从主机说起吧。我们之前说过主机是所有网络流量经过的地方叫做主机。
而且主机可以分为客户端和服务端,我们也说过服务端只不过是一种能响应请求的主机罢了。这就意味着,这些服务器只是安装着FTP MSTP SSL等协议的软件的计算机罢了。
既然他们遵守这些协议,而协议又是作用在网络拓扑上的,所以他们同样遵守我们前面说的那些规则。其中一个关键点就是当一个主机和另一个主机交流的时候,他们必须知道对方的IP地址。因为一切的开端就是封装第三层报头。但是我们来看一个问题。
在这个图中,我们的客户端机器和FTP通信的时候,我们是知道他的IP地址是84的,但是要是当我们和SMTP的服务器通信的时候呢,这时候他没有看到IP,他只有一个xxx.@163.com这个域名而已,那么此时他就不能知道IP,就无法封装第三层报头了,那么是不是就错了。
没有错,我们还有另一种协议,就是域名系统或者叫做DNS协议。DNS使用DNS服务器把域名转换为IP地址,世界上大约有几万台DNS服务器在公网为这件事做出努力。他的工作原理是当你在浏览器输入一个地址的时候,浏览器会委托操作系统把这个地址请求给DNS服务器,DNS服务器将会提供一个对应的IP地址来告知你这个地址的IP地址,这就使得我们后续的工作可以顺利完成。尽管你从来没有提供过IP地址给服务器。DNS的存在使得电子邮件成为可能,因为我们发送邮件都是通过域名来发送的。所以你能看到DNS的重要性,而且DNS实际上比我们描述的东西要多得多。我们把视角再次切换到主机。
当此时我们一台主机要和互联网通话的时候,他需要配置四项东西来标识他在网络分层中所要提供的东西。
# ip地址,比如我们配置为10.0.1.99
# 子网掩码,/24 子网掩码的作用是为了表达主机所在网络的大小。这将告诉主机他所通信的对象是在自己所处的网络还是在其他网络上面。子网掩码可以是/24或者是255.255.255.0
当一台主机拥有了IP地址和子网掩码,这将允许他和自己所处网络上面的主机进行通信了。但是当这个主机想要和外部网络的主机进行通信的时候。他就需要一个路由器去连接到对方网络,特别是他要把这个路由器的Ip地址配置在自己机器上的默认网关上面。
# 默认网关:就是你和外部网络通信的时候的路由器的IP地址。
此时有了网关地址,这三项就足以让主机和网络中的任何地址的主机发起通信了。但是仅限于使用IP通信。但是很多时候,你上网看邮件,博客都是通过域名去请求的。就像前面说的你没有IP就不能通信,所以我们还需要借助DNS协议,来解析域名。所以还需要配置DNS服务器的地址。才能让主机和域对话。所以第四项其实就是DNS服务器的地址。
# DNS:8.8.8.8
只有配置了这四项,才能完整的网络交互。当你的主机也许是手机,平板,或者笔记本或者是个高压锅,你要想网络通信都需要配置这四项内容。但是我们有时候会发现,比如我去一个星巴克去吃东西。我们在那里连接到了现场的新的WIFI的时候,似乎我们没有配置什么东西就能访问互联网了。
这个工作是一个叫做DHCP的协议在背后发挥重要作用。也就是动态主机配置协议,
DHCP:动态主机配置协议
DHCP的作用是它允许DHCP服务器为任何客户端提供IP地址,掩码,默认网关和DNS服务器,这实际就是你每次连接到wifi网络时候发生的事情。你的主机将会发送DHCP discover消息来发现DHCP服务器。然后DHCP服务器,将会向客户机提供这四项配置作为响应。这样你的客户端主机就拥有了可以和网络通信的必要条件。
这里我们就说完了,主要就是说了一些常见的协议,而协议中的重头戏TCP/IP协议,我们会在后面的描述中逐步展开。
七、子网划分
1、IP地址的表达方式
前面说主机的时候我们说过IP地址的组成方式,是由四组的八位二进制也就是4个字节大小组成的一个字符串。每一位可以写入0或1两种结果。
通常IP地址是使用十进制表示的,所以我们会把每一个字节的八位二进制转换为十进制然后用.来划分开,进而表达一个IP地址。而IP地址其实又可以从逻辑上划分为两部分,分别是网络号和主机号。
# 网络号:网络号代表着某一个完整的网络范围。
# 主机号:主机号代表着某一台确定的独立的主机。
既然我们知道了网络号代表着一个网络的完整范围,那么我们就其实也就能大概知道,当一个网络号表示的范围越大,那么他能容纳的主机也就越多。反之你网络号表示的越精细,越小。那你能容纳的主机范围也就越少。
于是在这个概念的驱使下,我们的视角来到了关于网络类型的概念下。
2、四种网络类型
网络类型总共分为ABCD四种类型,其中D类型作为保留这里就不说了。我们就来看ABC这三类网络。
# A类网络:强制性要求,四个字节的高八位中的第一位必须是0
这就会得到一个结果,当我们高位第一位是0的时候,这个八位最大表示的就是127,你第一位是0,后面七个最大加起来也就是127,其范围是0-127。
因为A类IP地址只有8位用于net-id
A类IP的net-id中,第一位必须是0
全为0的IP地址不可分配
全为1的网络号127.x.x.x虽然可用,但是被设置为保留地址,不能分配
正是由于以上4条原因,A类IP地址的网络个数最大是27-1-1=126.
由此可得网络号范围为:0000 0001~ 0111 1110 即 1~126
# B类网络:强制性要求,四个字节的高八位中的第一位必须是10
当你高位第一位是1,那你肯定就大于128了,后面第二位是0,其他加起来最大可以到达191,其范围是128-191
# C类网络:强制性要求,四个字节的高八位中的第一位必须是110
当你高位前三位是110,你的范围是192-224
这就是三类网络的第一个字节的取值范围,我们可以通过第一个字节的大小就能区别出来其所属的网络类型。或者你直接看高位就能确定了。
那么我们为啥要划分出来三类网络呢,因为他要对网络号和主机号做一个区分。