🍎作者:阿润菜菜
📖专栏:Linux系统网络编程
文章目录
- 一、协议初识和网络协议分层(TCP/IP四层模型)
- 认识协议
- TCP/IP五层(或四层)模型
- 二、认识MAC地址和IP地址
- 认识MAC地址
- 认识IP地址
- 认识以太网和互联网
- 三、数据包封装和解包分用(数据段,数据报,数据帧)
- 四、局域网和广域网的通信
- 局域网通信
- 跨网络通信
一、协议初识和网络协议分层(TCP/IP四层模型)
我们知道一台计算机里面有很多的硬件,正是这些硬件之间互相配合协同工作才能让我们的计算机健康的运行,当然这里面也离不开软件对硬件的管理。
假设我们脑洞大一点,把计算机里面的各个硬件拉出来,各自放到很远很远的地方,而计算机依旧能正常运行,靠的就是协议,而协议本质就是一种约定,硬件和硬件之间也有协议,比如磁盘的HBA协议,磁盘和内存IO时也有协议,所以协议不仅仅是网络专属的,计算机体系结构里面也有协议,那计算机内部不就相当于一个小型的网络吗?各个设备通过网线连接,设备之间有协议约定,所以各个设备能够正常通信,以便于计算机为用户提供良好的服务,所以网络和计算机是不分家的,体系结构中有网络,网络中有体系结构!
认识协议
实际在网络中,所有的网络问题本质都是传输距离变长了,如果传输距离很短,那还需要担心发送数据会丢失吗?或者对方接收不到数据,又或者对方没有接收到完整的数据,这些问题自然就不用考虑了,因为传输距离很短,中间的障碍很少,出错的概率很低。而当传输距离过长的时候,就容易导致出现问题,比如传输信号减弱从而导致数据丢失,所以一旦长距离传输的时候,就会引入新的通信问题,而为了尽可能的减少通信的成本,就需要定制协议!!!
我们提前做好约定,达成双方的共识,让通信的两台主机之间约定好协议,而协议就会降低通信的成本。
所以说 “协议”本质就是一种约定,通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情。而网络协议是通信计算机双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容 。
那协议该由谁来定制呢?
计算机生产厂商那么多,操作系统厂商也有那么多,磁盘厂商也有很多,其他硬件设备的厂商也有很多,那如果每个厂商都有自己的协议,生产出来的各式各样的计算机还如何通信呢?只能一个厂商里面的计算机才能通信,这显然是不行的,所以此时就需要一个人站出来,定制统一的网络协议标准,这个网络协议就是TCP/IP协议,1983年TCP/IP协议正式替代NCP,成为大部分因特网共同遵守的网络协议标准。
正所谓“一流的企业做标准,二流的企业做品牌,三流的企业做产品”。但是标准的定制有一部分是公益性、开源性的,它制定标准的目的是为了让我们的世界变得更好;而标准的定制还有一部分是具有一定盈利性质的,当你需要使用这项技术时就会收取部分专利费,此时就能将曾经做的技术投入进行变现。
所以在1977年国际标准化组织提出了OSI七层网络模型,那为什么要进行分层呢?
因为在网络数据传输的过程中,需要面临很多方面的问题,比如物理层,驱动层,软件层,用户层等等都有各自需要解决的网络传输问题,而分层其实就是进行解耦,每一层都是功能比较集中,高内聚的模块,用于处理该层面临的网络传输问题,层与层之间是低耦合的。
并且每一层都有自己匹配的协议,每一层协议都用于处理当前层的传输问题。
虽然是七层模型,但实际使用时,将上三层压为一层,统称为应用层,所以我们平常所说的都是TCP/IP四层或五层模型,物理层我们不考虑。
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇。TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的WiFi无线网使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)就是工作在物理层的。
- 数据链路层: 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。数据链路层底层的网络通信标准有很多,如以太网、令牌环网、无线LAN等。交换机(Switch)就是工作在数据链路层的。
- **网络层:**负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间数据传输的线路(路由)。路由器(Router)就是工作在网络层的。
- 传输层: 负责两台主机之间的数据传输。例如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
- 应用层: 负责应用程序间沟通。比如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层的。
可以看到,它们的下面几层几乎是没有区别的,操作系统对应的是传输层和网络层,数据链路层和物理层都是对应在驱动层的,而TCP/IP协议当中的应用层就对应到OSI七层协议当中的应用层、表示层和会话层。
一般而言:
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容。
- 对于一台路由器,它实现了从网络层到物理层的内容。
- 对于一台交换机,它实现了从数据链路层到物理层的内容。
- 对于集线器,它只实现了物理层的内容。
其实现在的网络各层设备早已突破了先前TCP/IP五层模型的限制。
二、认识MAC地址和IP地址
先来看看什么是报头?
一般数据在实际发送的时候都会多发一部分数据,这部分数据称为协议报头,由于模型的每层都有自己的协议,而数据在向下传递时必须携带上该层的协议报头,以便于数据流向到最底层的物理层之后,将数据传输给对方主机,对方主机将数据向上交付时,对方主机的每层都能看懂我的协议,所以数据在发送的时候一定是需要报头的,而具体的数据内容我们喜欢叫做报文。就相当于报纸,报头是该报刊社的协议规定,例如剧中排版,新华社报刊什么的类似协议,这些东西一般都会放在报纸的第一行而且是字体放大的那种,很醒目也就是报头。
同时协议报头阐述了该层协议的内容。
认识MAC地址
在局域网中的两台主机是可以直接通信的,因为每一台主机都有自己的"名字",每一台主机都有自己的网卡,而网卡都有自己的地址,这个地址就是MAC地址。MAC地址是48位的二进制数据,也就是6字节大小的数,可以用16进制来解释该MAC地址。例如我的网卡物理地址就是16进制表示的。
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)。
- 在网卡出厂时就确定了,不能修改。MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突,也有些网卡支持用户配置MAC地址)。
所以说MAC地址是数据链路层的地址,用于在同一网络中的主机之间进行通信。如果目标主机和发送主机在同一个网络中,那么数据包就可以直接发送到目标主机的MAC地址,所以MAC地址是在本地网络中分配的。不同的网络可能使用相同的MAC地址。
认识IP地址
IP地址是网络层的地址,用于在不同的网络之间进行路由和寻址,以便于不同网络之间的数据传输。
如果目标主机和发送主机不在同一个网络中,那么发送主机需要先将数据包发送到一个特定的路由器,路由器会通过路由表以及发送主机的ip地址确定出数据包的下一跳位置在哪里,路由表中记录了不同网络和主机的ip地址以及如何到达这些ip地址的信息。
那么ip地址在哪里呢?ip地址实际就在数据报的报头中,报头中的第三层网络层协议中包含了该数据报的ip地址位置,而路由器的核心工作位置也是在网络层,所以路由器可以看懂网络层的IP协议,确定发送主机的数据报下一跳应该发送到哪个网络当中。
传输层以上的协议都使用IP地址来标识主机的位置,IP地址是因特网上分配给主机的标识符,他是全球唯一的,可以在全球范围内进行路由寻址。而MAC地址是在本地网络中分配的,并且不同的网络可能使用相同的MAC地址,因此在跨网络的通信场景下,无法使用MAC地址,另外由于MAC地址是48比特位的,比32位比特位的IP地址长2个字节,这是不利于在通信协议中进行使用的,所以传输层向上的协议通常都使用IP地址来标识主机的位置,因为IP地址是跨网络的,而MAC地址仅仅是本地网络分配的。常见使用IP地址标识主机位置的协议有HTTP、FTP、SMTP、SSH等,在这些协议中,app之间通过IP地址来建立连接和交换数据,路由器使用IP地址进行数据报的转发和路由,以此来实现跨网络的通信。
上面说了这么多跨网路,不同的网络等等概念,那什么是不同的网络呢?该怎么分辨呢?
IP地址由网络地址和主机地址两部分构成,如果两个主机的ip地址中的网络地址相同,那么这两个主机就是在同一网络中,否则就不在同一网络中。子网掩码是一个与IP地址配对的掩码,用于将IP地址分为上述两部分,如果两个主机的IP地址和子网掩码进行按位与之后的结果相同,则两个主机就是在同一网络中。需要注意的是不同的网络有不同的子网掩码,和IP地址配对使用。
认识以太网和互联网
1.以太网是什么?
以太是古希腊神话中的宇宙空间,它常被认为是一切事物存在的基础。
以太网是使用电磁信号在以太中传播的数据链路层协议,它使用MAC地址来标识本地网络上的各个设备,每一块以太网卡在出厂时都会被assigned一个唯一的MAC地址,作为该以太网卡的永久标识。
以太网的数据传输依靠空气和电缆作为传输介质,这两种介质统称为以太。以太网线缆包括黑频线缆和同轴电缆这两种电缆。这些线缆可以将计算机和其他网络设备连接起来,如交换机和路由器,以此实现局域网内的互联。例如使用UTP(未纠错双绞线)将计算机与交换机连接,然后交换机再相互连接,形成局域网。
在局域网中,如果是需要高自由移动性和easier部署的环境中,还可以选择使用WIFI技术,无线信号通过空气(以太)作为传输媒介,将数据映射到高频电磁波上传播。例如WiFi IEEE 802.11a等标准,以及BlueTooth,ZigBee紫峰(与蓝牙类似)
有线以太通过电缆实现稳定高速的连接,无线以太可提供高自由和便捷性。
以太网是互联网的物理基础,互联网是由许多的局域网和广域网互连而成的,局域网中最常见的连接技术就是以太网。以太网定义了物理层和数据链路层的标准,通过以太电缆或以太无线信号为互联网提供高效的本地数据传输,也就是局域网内的数据传输。互联网在以太网建立好的局域网基础之上通过路由器等设备实现不同局域网之间的互联。而TCP/IP提供了网络层和传输层,以太网和TCP/IP协同工作实现了互联网。互联网使用IP地址标识网络设备,以太网使用MAC地址标识设备,两者通过ARP(Address Resolution Protocol)协议进行对应,实现互联网(因特网)的通信。
认识本地环回地址
127.0.0.1是一个类IP的特殊地址,叫做本地环回地址。他是IPV4地址段保留的特殊IP地址,只能用于当前计算机本身,其他计算机无法访问此地址。所以127.0.0.1就是计算机自己,对于访问该地址的请求,数据包会从发送主机走一圈协议栈然后又返回到主机自己本身。一般用于本地测试网络代码,或本地访问apache Web服务器软件。
三、数据包封装和解包分用(数据段,数据报,数据帧)
在传输层一般将数据包叫做数据段,网络层叫数据报,数据链路层叫数据帧,应用层叫请求与响应。数据在向下经过协议栈封装成帧之后会通过传输介质网线(很多种类)发送到目标主机,目标主机会剥离层层协议的报头,根据报头的信息再将有效载荷发送到上层指定的协议进行处理。
下图是封装和解包分用的示意图,尤其是解包分用的示意图,很形象的体现出协议报头的作用,即数据包向上该如何交付,交付给哪个协议。
实际上每个协议都要提供一种方法,让我们获取到报头的大小,这样我们才能在解包时将报头与有效载荷进行分离。
四、局域网和广域网的通信
局域网通信
首先需要明确的是,同一个局域网内的主机是能够直接进行通信的,因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信。
当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:
- 文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。
- 传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
- 网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层。
- 链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:
- 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
- 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。
- 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
- 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包与分用。
也就是说,任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,在这个过程中,每一层协议都会将对应的报头信息提取出来。
深入了解
下面是简易的一个局域网内部的主机通信图,例如MAC1主机问MAC7吃了没,只有MAC7才会收到对应的消息并作出响应,而其他的主机虽然收得到消息,但他们并不会做出响应,这是为什么呢?是因为MAC1发出的数据包中的以太网协议报头信息中包含了目标主机的MAC地址,其他收到该数据报的主机都会甄别自己的MAC地址是否与协议报头的地址相同,如果相同则会进行数据包的解包分用,如果不相同则什么都不会做。
- 局域网内传输数据时,该局域网内的所有主机都能收到
实际当主机1想要发数据给主机7的时候,该局域网内的其他主机也都收到了该数据,只不过除了主机7B以外,其他主机识别到该数据并不是发给自己的,此时其他主机就把收到的数据丢弃了。
也就是说,在局域网(以太网)通信时,该局域网内所有的主机在底层其实都收到了任何数据,只不过经过筛选后只提交上来了发给自己的数据。
-
什么是数据碰撞?
当主机1在向主机7发送数据时,其他主机彼此之间可能也正在进行通信,甚至主机1在和主机7通信的同时也在和其他主机进行通信。
但同一局域网中的所有主机在通信时,使用的都是一个共同的通信信道,因此如果局域网内的多台主机同时进行通信,此时这些数据之间就可能会相互干扰。
每一个局域网都可以看作是一个碰撞域,如果某个主机发送出去的数据与其他主机发送的数据之间产生了干扰,我们就称这两台主机在该碰撞域中发生了碰撞。 -
如何判断发送出去的数据是否发生了碰撞?如何避免?
因为发送到局域网当中的数据是所有主机都能够收到的,因此当一个主机将数据发送出去后,该主机本身也是能够收到这个数据的。当该主机收到该数据后就可以将其与之前发送出去的数据进行对比,如果发现收到的数据与之前发送出去的数据不相同,则说明在发送过程中发生了碰撞。
也就是说,主机实际是能够通过某种方式,知道曾经发送出去的数据是否发生了碰撞的。
当一个主机发现自己发送出去的数据产生了碰撞,此时该主机就要执行“碰撞避免”算法。“碰撞避免”算法实际很简单(具体实现其实蛮复杂的,我们就不深入学习了):当一个主机发送出去的数据产生了碰撞,那么该主机可以选择等一段时间后,再重新发送该数据。这就像现实生活中的两个人同时想要说话,此时对方就都会说“你先说吧”,这实际上就是一种碰撞避免。
需要注意的是,实际在网络通信压力不大的时候发生碰撞的概率是不大的,我们不要太小瞧计算机的处理速度,也不要太小瞧网线传播数据的速度。
- 那每个主机如何判断该数据是否是发送给自己的?
在局域网中发送的数据实际叫做MAC数据帧,在这个MAC数据帧的报头当中会包含两个字段,分别叫做源MAC地址和目的MAC地址。
每一台计算机都至少配有一张网卡,而每一张网卡在出厂时就已经内置了一个48位的序列号,我们将这个序列号称之为“MAC地址”,这个MAC地址是全球唯一的。
在局域网中进行通信的时候,每一个主机在收到一个MAC数据帧后,都会提取该MAC数据帧的报头,找到对应的目的MAC地址与自己的MAC地址进行比对。如果该MAC地址与自己的MAC地址不匹配,则直接将该MAC数据帧丢弃,只有MAC地址匹配时,该主机才会将该数据帧的有效载荷继续向上进行交付处理。
扩展一下:
- 单向数据发送: 主机发送数据帧时,将数据帧当中的目的MAC地址指定为某一台主机,此时每台主机对数据帧进行识别后,最终只有那台指定的主机会将该数据帧向上交付进行处理。
- 局域网内进行数据广播: 主机发送数据帧时,将数据帧当中的目的MAC地址设置为全1,此时所有主机收到该数据帧后都会对该数据帧进行处理。
跨网络通信
那跨局域网的两台主机之间是如何进行通信的呢?
其实每个局域网之间都是通过路由器连接起来的,因此一个路由器至少能够横跨两个局域网。而这些被路由器级联局域网都认为,该路由器就是本局域网内的一台主机,因此路由器可以和这些局域网内的任意一台主机进行直接通信。
比如局域网1当中的主机A想要和局域网2当中的主机H进行通信,那么主机A可以先将数据发送给路由器,然后路由器再将数据转发给局域网2当中的主机H。
那路由器为什么能够“认路”呢?
一个路由器可能会级联多个局域网,当路由器需要将一个局域网的数据转发到另一个局域网时,路由器如何知道该数据应该转发到哪一个局域网的呢?
路由器其实是通过IP地址来确定数据的转发方向的,因特网上的每台计算机都有一个唯一的IP地址,而在数据向下进行封装时,在网络层封装的报头当中就会包含两个字段,分别是源IP地址和目的IP地址。
当路由器需要将一个局域网的数据转发到另一个局域网时,在路由器的链路层会先将数据的在当前局域网对应的底层报头去掉,然后将剩下的数据向上交付给网络层,此时在网络层就可以获取到该数据对应的目的IP地址,然后路由器就可以根据该IP地址在路由表当中进行查找,最终就能够确认该数据应该发送到哪一个局域网。
下面是需要通过路由器参与进行ip地址路由的网络通信示意图,你可以暂时将其理解为广域网通信,但实际这是不准确的,后面的文章会详细解释这个地方,或者你可以理解为局域网和局域网之间进行通信的示意图。
网络层之上的传输层和应用层与同一局域网内的通信过程相同,与其不同的是,发送主机的数据包在到达数据链路层时,无法将数据包直接交付给目标主机的以太网协议,因为发送主机和目标主机并不在同一个网段内,无法通过MAC地址确认出数据包的下一跳位置,所以数据包首先要进行以太网协议层的解包分用,将数据包交付给网络层的路由器,路由器会通过自己的路由表确定出数据包要发送的主机的ip地址,然后再向下进行封装,将数据包向下交付给指定ip地址的目标主机的数据链路层令牌环驱动程序,之后的工作还是进行数据包向上的解包分用,直到数据包传输到应用层,目标主机拿到对应的数据。
网络层的路由器进行了数据包的解包分用和重新封装,目的就是屏蔽不同局域网的底层的网络差异,为用户提供更为快速稳定健康的网络通信。例如在下面的通信过程中,发送主机和目标主机底层使用的协议分别是以太网协议和令牌环网协议,但路由器可以在网络层屏蔽掉下层不同协议之间的差异,怎么屏蔽呢?通过ip地址确定不同网段的主机位置来屏蔽。(值得注意的是,目前令牌环网已经使用的很少了,数据链路层通常使用的都是Ethernet)
比如像平常生活中的同一个wifi下的几个设备进行聊天时,是不会经过路由器的,仅仅通过以太网协议MAC地址就可以确定不同设备的位置。
本节完