独立模式: 计算机之间相互独立;
在早期的时候,计算机之间是相互独立的,此时如果多个计算机要协同完成某种业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下。
网络互联: 多台计算机连接在一起, 完成数据共享;
随着网络的进步,人们开始考虑将不同的计算机连接在一起,实现更高效的数据共享和协同工作。当某个业务需要多台计算机协作时,数据被集中存放在服务器上,进行统一管理。这使得每台计算机都可以轻松访问这些共享数据,从而轻松地在不同业务之间进行切换,提高了工作效率。
局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起;
随着网络的不断发展和扩大,越来越多的机器被连接进来,形成了局域网的构架。
在这个局域网中,有一种关键设备叫做交换机。它的主要职责是处理局域网内部的数据传输,即确保数据能够从一个主机准确地转发到另一个主机。
而各个局域网之间则是通过路由器相互连接的。路由器的主要任务是管理数据的路由和转发,确保数据能够从源主机经过一系列的网络节点,最终到达目标主机。
广域网WAN: 将远隔千里的计算机都连在一起;
局域网之间通过路由器相互连接,形成一个更广泛的网络结构,这就是我们所说的广域网。实际上,局域网和广域网是相对的概念,我们可以将广域网看作是一个大型的局域网。
比如我们学校的校园网,校园网对应的就是在一个校园范围内所建立的计算机通信网。校园网实际也是一种相对的概念,我们都可以将它们看作一个大的局域网。
"协议" 是一种约定。通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情
举个例子:
小李每个月打电话向家里要生活费,由于接通电话就需要产生话费。所以小李和小李爸爸做出了这种约定,电话响一声就是小李没有生活费了,小李爸爸就不需要接电话,只需要往小李银行卡打生活费就可以了。如果电话声大于三声,就说明是有其他事情,这个时候小李爸爸再接电话。
计算机之间的传输媒介是光信号和电信号。通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。
在Linux网络中,“网络协议”可以被理解为一种约定,用于规定计算机之间如何进行通信。这种约定涉及了数据的格式、传输方式、数据交换规则等方面,以确保计算机之间能够正确地相互理解和交流。
那么协议应该由谁来定制呢?
在当前这个互联网时代,计算机生产商有很多,计算机操作系统也有很多,计算机网络硬件设备更是多种多样,那我们是如何让这些不同厂商之间生产的计算机能够相互顺畅的通信的呢?这时候就需要有人站出来,约定一个共同的标准,并且让大家都来遵守这个标准,这就是网络协议。
在这个高度互联的世界中,网络协议的定制至关重要。这不仅关乎技术的进步,更关乎行业的未来。因为,制定规则的人往往就是该领域的领头羊。以5G标准的定制为例,华为凭借其在通信领域的深厚实力,成为这个标准的重要制定者。这无疑证明了华为在该领域的卓越地位。
- 我们日常在手机或电脑上使用的应用程序,如抖音、快手或淘宝,都属于应用层的服务。当我们在这些应用上发出请求时,这些请求会首先被传递到我们的设备操作系统中。操作系统不仅负责管理设备的进程、文件、内存和驱动,还内嵌了一个重要的组件——软件协议栈。
- 协议栈的作用是将我们的请求数据进行封装,然后通过网卡发送到网络中。在网络中,数据会经过多个路由器的转发,最终到达提供服务的目标服务器。这台目标服务器其实也是一台运行着Linux操作系统的计算机。
- 值得注意的是,我们使用的设备可能运行的是Windows、安卓或iOS等不同的操作系统,但这并不影响我们访问目标服务器。因为服务器也有自己的协议栈,能够接收并处理来自各种操作系统的请求。
- 当目标服务器收到数据后,它的协议栈会进行数据解封装操作,并将解封装后的数据传递给应用层。在应用层,运行着与我们的请求相对应的软件服务器,如抖音服务器、快手服务器或淘宝服务器。这些软件服务器会对收到的请求进行处理,并将处理结果以相同的方式返回给我们的设备。这样,我们就能在手机上看到抖音的视频、快手的直播或淘宝的商品信息了。
不同操作系统在进程管理、文件管理、内存管理和驱动管理方面的实现细节可能有所不同。例如,Windows和Linux在处理多线程的方式上存在差异:Linux通过轻量级进程来模拟线程,而Windows则采用了真正的线程机制。
然而,协议栈是由网络标准组织统一定义的,具有全球通用性。这意味着无论是哪种操作系统,都必须遵循这些标准来实现协议栈。因此,尽管客户端和服务端可能运行着不同的操作系统,它们在数据封包和解包操作上的方法是相同的。这种一致性确保了数据在不同操作系统之间能够无缝传输,确保了网络通信的顺畅进行。
我们先来看下面这个例子:
A和C通过电话机进行通话。在逻辑上,我们认为是人和人,电话和电话在沟通。但是站在工程师的角度。其实两个人不是直接进行沟通的,而是人和电话在进行沟通。A的电话机将A说的话记录下来,经过一系列的编码,通过通信网络将信息传递到C的电话,然后信息在C的电话进行转码,最后C才听到了A的话。
A和C之间的通信,我们称为语言层,他们通话用的是汉语,我们叫汉语协议;而电话机和电话机通信用的是一些电话系统的一些接口,我们将电话机直接的通信称为通信设备层。
如果将通信设备换成智能手机或者对讲机,这仅仅是在通信设备层变更了;或者两个人通过英语进行交流,这仅仅是在语言层进行变更了,仍然可以正常沟通。
分层最大的好处在于“封装”,在分层情况下,将某层的协议进行替换后,通信双方之间是不会受到影响的。
我们知道的是,操作系统中包含进程管理、文件管理、内存管理、驱动管理这四大模块,操作系统层与用户层之间有着系统调用层,操作系统层往下是驱动层,而驱动层再往下就是各种硬件设备了。
操作系统中除了有这四大管理模块,还有与网络协议栈有着密切的关系。网络协议栈主要负责数据的通信,有OSI七层模型和TCP/IP五层(或四层)模型。下面我们来介绍这两种网络协议栈分层模型:
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。自顶向下可分为5层,分别是应用层、传输层、网络层、数据链路层、物理层。
集线器:电磁信号在长距离传输过程中信号是会衰减的,而集线器的主要功能就是对接收到的信号进行再生放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。
TCP/IP五层模型与OSI七层模型各层的对应关系:
可以看到,它们的下面几层几乎是没有区别的,操作系统对应的是传输层和网络层,数据链路层和物理层都是对应在驱动层的,而TCP/IP协议当中的应用层就对应到OSI七层协议当中的应用层、表示层和会话层。物理层我们考虑的比较少,因此很多时候也可以称为 TCP/IP四层模型。
网络协议栈各部分所处位置:
一般而言:
但是并不绝对。很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发);
我们这里以同一个网段两台主机进行文件传输为例,此时各层对应的协议如下:
首先需要明确的是,同一个局域网内的主机是能够直接进行通信的,因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信。
两台计算机通过TCP/IP协议通讯的过程如下所示:
当用户需要将文件传输给另一台主机时,这个过程涉及到多个网络协议层次。为了确保数据能够正确、安全地传输,每一层协议都会在数据上添加相应的头部信息,这个过程就叫做“封装”。
通过这样的封装过程,每个协议层都提供了必要的信息和控制机制,以确保数据能够可靠、有效地传输到目标主机。这种分层结构使得网络通信更加灵活和可扩展,也方便了网络协议的开发和维护。
当数据从发送方主机发送后,接收方主机需要按照网络协议栈的层次结构对数据进行解包与分用,以还原原始数据:
这个解封装和分用的过程是协议栈自底向上的过程,每一层协议都会根据头部信息对数据进行相应的处理,并将数据传递给上一层协议。通过这样的解封装过程,接收方主机能够正确地解析和应用原始数据。
无论是发送方还是接收方,在处理数据时都要遵循协议栈的层次结构,即先封装再分用的过程。这种分层结构使得网络通信更加灵活和可扩展,也方便了不同协议之间的交互和集成。
下图为数据封装的过程:
下图为数据分用的过程:
下面我们通过一个例子来理解这个过程:
当一个用户通过微信发送信息给另一个用户时,为了确保信息在不同的版本之间传递无误,并在传输过程中保持顺序和来源的准确性,数据包会经过一系列的封装过程。
首先,应用层会添加一个v1版本的报头,以区分不同的微信版本。然后,传输层会给每个信息添加序号放在报头,以确保信息的顺序正确。接下来,网络层会添加src和dst报头,以指示信息来自哪里以及要发送给哪个主机。最后,链路层添加src mac和dst mac报头,以确定数据包的目标接收者。
经过这一系列的封装过程,数据包被发送出去,通过网卡和以太网到达接收方。在接收方,每一层协议都会进行相应的解包操作,从链路层开始,一直到应用层,最终将信息传递给接收方的用户。
从逻辑上看,每一层协议都在与对方的同层协议进行直接通信,实现数据的传递。通信的本质就是不断的封装和解包的过程。
每层都要添加报头
报头本质也是一种数据,报头一般是通过结构体实现的,因此协议栈的每一层都有一个对应的结构体来表示当前层的报头。
报头与有效载荷
- 当我们讨论网络通信中的协议栈时,每一层协议都有其特定的功能和职责。当数据从一个主机发送到另一个主机时,这些数据需要经过协议栈的每一层。每一层都会对数据进行一些处理,比如添加报头信息,然后将其传递给下一层。
- 在数据传递过程中,每一层协议只关心与自己相关的报头信息,而忽略其他层添加的报头。这些被忽略的报头信息,以及实际的数据内容,都被视为“有效载荷”。
- 有效载荷是数据中除了当前层协议添加的报头之外的部分。例如,当应用层添加了自己的报头信息后,将数据传递给传输层时,传输层只会关注其对应的报头信息,而忽略应用层添加的报头。对于传输层来说,应用层添加的报头和实际的数据内容都是有效载荷。
- 简单来说,有效载荷是数据中除了当前层协议报头以外的部分。每一层协议都只关心自己的报头信息,而忽略其他层添加的报头,这些被忽略的部分就构成了有效载荷。
如何将报头与有效载荷进行分离?
在协议栈中,每一层都需要从接收到的数据中提取出对应的报头信息。为了实现这一点,每一层都必须明确报头与有效载荷之间的界限,这样才能将它们分开。而为了达到这个目的,协议在添加报头时通常会将报头放在数据的开头,这样我们就可以根据报头的大小来区分报头和有效载荷。
获取报头大小的方法主要有两种:
- 结构体:这意味着报头的大小是固定的,不随实际数据内容的变化而变化。
- 自描述字段:报头中包含一个字段,用于指示报头的长度。这意味着报头的大小是可变的,但通过这个字段,接收方可以知道报头的实际长度。
无论采用哪种方法,每一层协议都必须提供一种方式来让我们获取报头的长度,以便在解包数据时正确地区分报头和有效载荷。这样,协议栈才能从底层到顶层依次进行数据的解包和分用,实现网络通信的正常进行。
当前层如何知道应该将有效载荷交付给上层的哪个协议?
- 在网络协议栈中,每一层都可能对应多种协议。即使我们已经成功地将报头与有效载荷分离,我们仍然需要确定当前层应该将有效载荷传递给上层哪个协议。
- 实际上,在每种协议的报头中,通常都会包含一个字段,用于指示应将分离出的有效载荷传递给上层的哪个协议。这个过程就是所谓的“分用”。通过这个字段,接收方可以明确知道应该将数据传递给哪个上层协议,从而确保数据能够正确地被上层协议处理。
- 简而言之,分用过程是协议栈中的关键步骤之一,它确保了数据能够被正确地传递给相应的上层协议。
大部分协议的共性
1.几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力。
2.几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力。(分用)
局域网内传输数据时,该局域网内的所有主机都能收到
我们来通过一个故事来帮助理解
我们看上面这张图,教室里坐满了人,老师正在讲台上发作业。老师每叫一个人上去拿作业,班里所有同学都是可以听到的。那每个学生是如何知道是自己的作业呢?通过名字!比如当老师念到张三的名字,班里每个同学都可以听到,但由于作业不是自己名字,因此只有张三会上去拿作业。
局域网(例如以太网)中的通信遵循广播机制。当一个主机想要发送数据时,该数据会被发送到局域网内的所有主机。那么在一个局域网当中,除了当前正在进行通信的两台主机以外,还有其他的主机。
那么每个主机如何判断该数据是否是发送给自己的?
以太网发生数据碰撞的问题
如何判断发送出去的数据是否发生了碰撞?
如何处理数据碰撞的问题?
一个局域网中,是不是主机越多碰撞的概率就越高?
上面说的都是同一局域网内的主机之间的通信,那跨局域网的两台主机之间是如何进行通信的呢?
当一个主机想要将文件传输到另一个位于不同网段的主机时,数据会经过一个或多个路由器。这是因为局域网是通过路由器连接的,因此一个路由器可以横跨多个局域网。在每个局域网看来,路由器就像是自己局域网中的一台主机。因此,路由器可以直接与局域网内的任何一台主机通信。
例如,如果主机H1在局域网1中想要与主机H8在局域网2中通信,主机H1会将数据发送给路由器。然后,路由器会将数据转发给主机H8所在的局域网2。通过这种方式,两个不同网段的主机之间实现了文件传输。
采用不同通信标准的两个局域网内的主机通信
上面的通信过程适用于路由器级联的两个局域网采用的是相同的通信标准。那么,如果这两个局域网使用的是不同的通信标准,例如局域网1使用以太网,而局域网2使用令牌环网,那么通信过程会有所不同。在这种情况下,路由器需要能够处理这两种不同的通信标准,以确保数据能够正确地在两个局域网之间传输。
由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。
这种情况实际是由路由器来处理的,路由器是工作在网络层的一个设备,我们可以认为路由器当中的协议栈包括了网络层和链路层。
我们来看下面这个图
一个路由器可能会级联多个局域网,当路由器需要将一个局域网的数据转发到另一个局域网时,路由器如何知道该数据应该转发到哪一个局域网的呢?
IP协议屏蔽了底层网络的差异化
除了IP地址,还有以下类似的技术:
在计算机网络中,IP地址和MAC地址确实有着不同的特性和用途。
最后我们用ifconfig查看一下自己当前主机所对应的网卡信息。
我们看到inet后的地址就是该主机的IP地址,而ether就是“以太”的意思,后面的地址就是MAC地址。实际云服务器上的MAC地址可能不是真正的MAC地址,该MAC地址可能模拟出来的。