所谓 “局域网” 和 “广域网” 只是一个相对的概念. 比如, 我们有 “天朝特色” 的广域网, 也可以看做一个比较大的局域网。
比如打电话约定电话铃响的次数的约定,而计算机网络协议,是通信双方所遵守的约定。
计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式。
思考: 只要通信的两台主机, 约定好协议就可以了么?
定好协议,但是你用频率表示 01,我用强弱表示 01,就好比我用中国话,你用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了基本的协议,也是无法正常通信的。
所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是 网络协议。
阿熊在龙国A市B小区C单元住着,阿熊的楼上是卖牙膏的,有一天阿熊的牙膏用完了,直接去楼上买牙膏就行,而阿熊只需要操心到手的牙膏怎么使用即可。 阿熊这天又把牙膏用完了,不同的是,阿熊这次想要试一试国外的牌子,这个时候阿熊点开网络购物,从加拿大买了一款牙膏,下单之后,阿熊只需要静待快递到即可,而发货公司考虑的就多了。
首先,发货公司需要确定目的地址,然后需要确定中途的每一个站点,只有确定了,以及到达每个地方的配送方式,最重要的是,包裹如果出现了以外该怎么办,有哪些补救方法。
在现实生活中有上述的问题,而在计算机网络的世界中同样存在这些问题,通过以上的例子,我们可以将网络当中的所有问题归为以下四类:
而计算机网络协议的出现就是为了解决以上问题所制定的。
一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公司。
能定制协议标准的组织或公司主要有以下几类:
在计算机中,很多东西都是分层的,比较常见的就是 软件分层 与 网络分层。相信很多人都听说过这样一句话:任何问题都可以通过添加一层软件层来解决。软件分层能更好的解决问题,但是为什么需要网络分层呢?
实际上,网络分层是为了让层和层之间是松耦合的,这样,如果上层出现问题就去上层解决,下层出现问题就去下层解决。不至于一个小问题导致整个网络瘫痪。
在这个例子中, 我们的"协议"只有两层:语言层、通信设备层。
但是实际的网络通信协议,设计的会更加复杂, 需要分更多的层, 但是通过上面的简单例子,我们是能理解,分层可以实现解耦合,让软件维护的成本更低。
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可 靠的通讯。
虽然OSI提出了七层模型,但是并不负责实现这七层模型,仅仅是提出了定义,而后人们通过工程实践得出,OSI七层模型实现起来比较困难,现实一般需要5层模型即可。而 应用层 表示层 会话层,统一为应用层。同时也可称为 TCP/IP 五层(四层协议):
物理层我们考虑的比较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为TCP/IP 四层模型。TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
上三层合并为一层,这是因为上三层的不确定性太大,有些通过网络传播的是音频,有些是视频,有些是文字、图片等等。所以不能将这些都内置在OS中,否则就会限制网络的功能。
如果你学过Linux系统编程,那么在看到OSI七层模型的时候,可能第一时间想到的是操作系统划分的层状结构,那么计算机网络与OS还有关系吗?实际上,他们的关系如下:
上图很清晰的解释了计算机网络相对于操作系统的位置。而传输层和网络层集成在操作系统内部的,所以,网络就是OS的一部分。操作系统在诞生之初,其网络协议栈就已经存在了,因为其集成在内核当中。
所以用户是无法直接访问网络协议栈的,网络势必要像OS那样,提供系统调用接口给上层使用。而基于网络的系统调用接口开发出的程序,就属于应用层。有些人觉得系统调用使用起来比较麻烦,所以又对网络的系统调用接口做了封装,形成网络库。
按照常识,我们都知道,windows的电脑是可以给苹果用户的电脑发消息的,安卓同样可行。实际上,世界上所有的OS只要想入网,就必须遵守TCP/IP协议,保证不同主机之间的数据通信。这就是OS与网络之间的关系。
截止到目前为止,我们并没有真正的接触协议。我们都知道,OS大部分都是由C语言来编写的,而TCP/IP网络协议栈也属于内核的一部分,则TCP/IP网络协议栈也是由C语言来编写的。
仔细观察下图:
问题 :主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?
假设在一个局域网内,有多台主机,共用这个局域网,那么这些处在同一个局域网当中的主机,是否可以相互通信呢?
按照常识,我们都知道,同一局域网内的主机之间是完全可以相互通信的,但是他们是如何做到的呢?怎么知道我要发送数据的对端是谁呢?
其实很简答,在上课时,老师喊阿熊起来回答问题,明明其他人也都听到了,但是为什么就阿熊站起来呢?因为只有阿熊自己叫做阿熊。而在计算机当中,每台主机都有自己的唯一标识,我们称为 Mac地址。
有关Mac地址的详细原理:
在Linux当中,我们使用 ifconfig
可以查看本机的Mac地址:
尽管如此,它们之间想要通信还有不少的问题。阿熊在上课被叫起来回答问题,这个时候张三肯定不会说,“阿熊,昨天借我的5毛钱赶紧还我”。但是在计算机的世界里,发送数据时可能不止一台主机在发送,而它们处在同一局域网之间,就 有可能会发送数据碰撞。
所以,每台主机为了避免这种情况,内置了碰撞检测和避免方法,当局域网内有其他主机在发送消息时,当前主机就会阻塞等待,等待网络通信状态重新变好,才会继续发送数据。所以,我们又把 一个局域网称为一个 碰撞域。
所以在 任何时刻,在局域网内只能有一台主机发送数据的局域网,我们称为 以太网。
还有一种网络叫做 令牌环网,在一个局域网内,有多台主机,只有一台主机持有令牌时才可发送数据,否则只能等待令牌。
不论是 局域网 还是 令牌环网,本质都是 在同一时刻只有一台主机发送数据。
我们已经初步了解了局域网通信的原理,再来看同一个网段内的两台主机进行收发消息的过程:
现在有两台主机进行通信,上面我们说了,如果两台计算机想要通过网络进行通信,那么他们必须遵守相同的协议,一台主机在发送数据时会自上而下对发送信息进行封装,而收端收到信息需要自下而上解开对信息的封装才能拿到信息。
而不同层协议之间,都认为自己是在和对端同层协议进行通信。每一层协议都会对原有的数据进行封装,形成 报头,除了本层添加的报头,剩下的信息 我们称为 有效载荷。
当应用层对原始文本添加了报头,并不能直接发送给对端同层协议,而是需要向下继续添加下一层协议报头,下一层协议同样需要添加这一层自己的报头,直到数据链路层封装完最后的报头。
这个数据就被封装完成了,然后就可以通过网卡向对端主机发送数据。对端主机收到数据的流程与发送的流程截然相反,自底向上一层一层的解包,最后才接收到数据。
前面我们说了,TCP/IP协议属于内核中的一部分,而每一层封装的报头,实际上就是计算机网络协议的结构化数据报头。说人话就是结构体。两台计算机通过tcp/ip协议通讯的过程如下:
对端主机在收到数据的时候,是需要解包的,从数据链路层往上一层一层解包,但是每一层可能是不同的协议(比如,网络层协议可能不是IP, 有可能是ICMP协议),那么当前层在将数据解包之前,需要先明确将解包过后的有效载荷发送给上层的哪个协议,而这部分工作实际上在本层报头解析时就已经完成了,因为当前层的报头会有下一层协议报信息,这样就可以发送指定层的指定协议了。
上述过程在计算机网络中的专业术语叫做 解包 与 分用:
下图为数据封装过程:
下图为数据分用的过程:
现在又两个不同的局域网,它们之间想要通信,所以使用了路由器将两个子网建立连接,这样,处在不同网络之间的数据就可以开始通信了。
跨网段的主机的数据传输,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器。
我们先不着急了解双方是如何跨网络通信的,我们先来看一下唐僧去西天取经的故事:
话说唐僧师徒四人去西天取经,这一回,唐僧一行人刚从女儿国出来,前往黑风岭,熟悉故事的我们都知道,黑风岭的下一站就是火焰山。唐僧一行人刚到了黑风岭,就遇见了黑风岭领主,领主问唐僧:“你是谁,从何而来,到哪里去?” 唐僧回答:“贫僧自东土大唐而来,要到西天取经,敢问施主可知通往西天路的下一站是哪里?” “原来是唐僧,来了就别走了,袈裟留下!”
如果黑熊精是一个好领主,他就会告诉唐僧下一站该前往火焰山。而有意思的是在唐僧身上永远会有两套地址:
唐僧无论去到那个地方,如果有人问唐僧从哪来到哪去,唐僧一定回答:“自东土大唐而来,到西天取经去。” 我们发现,第一套地址无论唐僧在哪里都不会改变。
但是每当唐僧去到了不同的地方的时候,唐僧上一站从哪来,下一站到哪去都会立刻刷新。也就是说,唐僧的第二套地址是一直在变化的。
而在计算机网络当中,上述的两套地址,它们分别对应:
其中 目的IP地址给我们提供路径规划的依据,唐僧为什么要去女儿国?因为唐僧要去西天,唐僧为什么要去黑风岭?因为唐僧要去西天。
这里涉及了IP地址的概念,IP地址是什么?以及它与Mac地址有什么区别?
在Linux当中可以使用 ifconfig
命令查看IP地址:
路由器一般至少横跨两个子网,所以这里路由器要有两张网卡,有两个Mac地址。
在 网络层IP进行封装协议头时,就已经将源IP于目的IP封装进报头里面。而在最后一层协议封装时,需要将原Mac地址与目的Mac地址封装进数据报头。所以左侧设备的网络源mac地址是自己,目的mac地址是路由器 mac_left 地址。
此时,被封装完的数据通过网卡发送到了路由器,路由器发现目的mac是发给自己的,那么就对第一层协议头进行解包并分用,当有效载荷到达了上层IP网络层,此时源mac和目的mac已经不再重要,此时IP层协议对IP报头进行分析,发现目的IP是 主机B.
路由器作为三层交换机,也有自己的层数划分,不过只有两层。所以路由器的IP网络层会重新对有效载荷进行封装,送达下层协议,当有效载荷到达了下层协议,不论是什么网路,都会对有效载荷进行报头封装,这时,源mac地址变为了 right_mac ,目的地址变为了 IPB。
于是对端主机B就可以收到对应的数据了,因为通信双方遵守相同的TCP/IP协议,所以由路由器转发的数据在主机B也是可以看懂的,在经过一层层的解包和分用,最终把信息呈现给了用户B。
IP层往上,这些协议有区别吗?
实际上IP层往上,双方的协议并没有任何的不同,而IP层往下就有差别了,上面例子中,第一次封装的是以太网的数据报头,发送给了路由器,而路由器发送给对端B时,却变为了令牌环网的数据报头。