目录
一、网络的起源:
二、认识协议:
三、网络分层:
理解:
TCP/IP五层(或四层)模型:
网络协议栈和OS:
封装与解包:
四、以太网:
五、网络通信:
令牌环网:
IP地址:
网络通信基本脉络示意图:
六、ifconfig:
一、网络的起源:
在之前的学习中,我们进行编程都是单机编程的,就是每一台机器都是独立的,如果此时要多个计算机共同完成一个任务,那么就需要从一台机器依次拷贝到另一台机器中,这个过程很消耗时间,效率也很低
在多个计算机共同完成一个任务中,必定会存在将多台计算机连接起来,就必定会形成网络,所以网络的出现是历史的必然
所以就需要需要设法将多台计算机组合在一起,于是就有人就搞了一台机器作为服务器,然后将多台机器之间和这台服务器之间用线连接起来,当需要输入或者输出数据的时候直接送到那个服务器中或者直接从服务器中进行读取
在网络刚产生的时候,是一个个实验室或者各高校自己中的计算机进行通信的,但是各实验室之间,各大高校之间也要有合作,这样这些实验室,这些高校之间也需要进行网络的连接,所以就必须让一个区域的网络和另一个区域的网络连接起来,进而构成更大的网络,这就有了局域网和广域网的概念
- 局域网(LAN):覆盖较小地理区域(通常方圆几千米内),由同一区域(如办公室、学校、家庭)的多台计算机互联组成,具有封闭性和资源共享功能(如文件管理、打印机共享等)
- 广域网(WAN):将远隔千里的计算机都连在一起,跨越省,国家或洲际的远程网络,连接分散的局域网或城域网,形成国际性网络(如互联网)
构成了更大的网络后,也会引发一系列问题,
如距离的问题:当进行远距离传输的时候,因为距离很长,这里存在成本很高和信号衰减等问题,如定位的问题:有这么多计算机,在进行传输的时候怎么知道是传到哪台计算机上的呢?----- 这就需要有定位各台主机的能力,也就有了地址如mac地址,ip地址等等
随着网络的发展越来越复杂,也就有了交换机,路由器这样的硬件产生了
其中局域网中的计算机之间可以通过交换机进行交换数据,局域网和局域网之间就需要交换机和路由器进行帮助交换数据,局域网和局域网之间用路由器进行连接
这样通过路由器,交换机将一个个计算机连接起来就形成了神奇的网络世界
二、认识协议:
协议本质上就是一种多方共同认可的约定,其作用是降低成本,提高效率
在之前的接触中,编程后的错误码就可以看做是一种协议:错误码为0时是成功的,错误码为1时是超时错误,错误码为2时是内存分配失败等等
这样因为协议的存在,就能够降低沟通成本,提高沟通效率
关于协议有很多种类,每一个协议都是要解决对应的问题的,那么计算机在通信的时候有哪些问题
- 怎么保证数据能够准确的到达下一个设备?属于技术问题,对应数据链路层所解决的
- 怎么定位传输数据的主机问题?属于技术问题,这是网络层所解决的,比如IP协议,帮我们定位主机,所以IP协议中一定存在原主机的IP,目的主机的IP,没有IP的主机是无法进行通信的
- 怎么解决长距离传输的数据丢失,信号减弱等问题?属于技术问题,解决这类问题的有TCP协议
- 如何处理收到的数据?属于应用问题,在我们的网络通信中,传输数据不是目的,处理数据才是目的,解决这类问题的协议有许多,如http/https,smtp,ftp等协议
在这里插入一个概念:什么是报文
报文是计算机网络和通信领域中最基本的数据传输单位,指主机一次性发送的完整数据块
在我们网购的时候,到手的不仅仅是商品,还有的是包装盒以及上面的发票,在网络通信中,当发送的数据中,也不仅仅是只有数据,在原本的数据中还多了些其他的东西,也就是报头,报头其实是一个结构体,在这个结构体中要把想增加的数据规定好,然后将想发送的数据拷贝到结构体后面,报头后面就是有效载荷,这个有效载荷不一定是我们所发送的数据,还可能包含上一层的报头这样有效载荷+报头=报文
所以协议这种双方的约定,最终的表现形式是结构体对象,也就是说看到协议就想到结构体
三、网络分层:
网络通信的过程中,也会存在各种个样的问题,在定制协议的时候问题比较错综复杂,所以问题得一个个解决,所以网络协议是分层的
网络协议为什么要分层:
1、网络通信软件项目的规模太大了,所以要想办法把模块之间要解构出来
2、协议本事是要解决问题的,问题有很多,刚好问题是层状的,所以协议定制出来也就是层状的
分层是为了好维护,倘若某一层出现问题了,只会影响当前层,对这一层进行维护即可,当如果想换某一层的协议也只需对这一层进行维护即可,不需要修改其他层
对于分层的理解举个例子:
在我们日常打电话的场景中:
在如上的例子中,就是分层的,我们和对方进行打电话的时候,是不需要管下层是如何进行传输的,在逻辑上,认为人与人在进行沟通,电话与电话在进行沟通,电话之间的协议我们是不需要关心的,即使后来将电话之间的通信方式进行修改,我们上层也不需要改变通信方式,该怎么说就怎么说
理解:
网络分层的标准是由OSI来定义的,OSI将网络定义为七层,这七层自上而下是:应用层,表示层 会话层,传输层,网络层,数据链路层,物理层
层编号 | 层名称 | 核心功能 | 典型设备/协议 | 备注 |
---|---|---|---|---|
第1层 | 物理层 | 传输原始比特流,定义电气/机械特性(电压、电缆、速率) | 中继器、集线器、光纤、双绞线 | 直接与物理介质交互(如光信号、电信号) |
第2层 | 数据链路层 | 组织比特流为帧,节点到节点的可靠传输(MAC地址、CRC校验、流量控制) | 交换机、网桥、以太网、PPP | 通过MAC地址实现局域网通信 |
第3层 | 网络层 | 跨网络逻辑寻址(IP地址)、路由选择(最佳路径) | 路由器、IP协议、ICMP、OSPF | 处理不同网络间的互联(如Internet路由) |
第4层 | 传输层 | 端到端可靠传输,分段(TCP)/数据报(UDP)、流量控制、错误恢复、端口寻址 | TCP UDP 端口号 | 区分应用程序(通过端口号),确保数据完整性 |
第5层 | 会话层 | 会话管理(建立/维护/终止)、同步检查点(如断点续传)、对话控制(全双工/半双工) | NetBIOS、RPC、SSH会话管理 | 负责应用间的会话逻辑,较少直接实现具体协议 |
第6层 | 表示层 | 数据格式转换(编码/解码)、加密(SSL/TLS)、压缩 | ASCII、JPEG、加密算法 | 确保应用层数据格式兼容性,如翻译二进制到文本 |
第7层 | 应用层 | 用户应用程序的网络服务接口(文件传输、邮件收发等) | HTTP、FTP、SMTP、DNS | 直接面向用户(如浏览器使用HTTP访问网页) |
TCP/IP五层(或四层)模型:
但是在工程实践中,更多的是使用5层而非7层,其中会话层,表示层被应用层协议吸收,能够减少分层带来的处理延迟,这种分层方式既保留了OSI的理论清晰性,又适应了TCP/IP的工程实践,成为现代网络设计的通用标准
OSI 7层 | TCP/IP 4层 | 工程实践5层 |
---|---|---|
应用层、表示层、会话层 | 应用层 | 应用层 |
传输层 | 传输层 | 传输层 |
网络层 | 网络层(IP层) | 网络层 |
数据链路层、物理层 | 网络接口层 | 数据链路层+物理层 |
其中,最重要的两层协议是传输层和网络层,其中传输层最具代表性的协议是TCP协议,网络层最具代表性的协议是IP协议
物理层:主要负责光电信号的传递,如现在的WiFi无线使用的电磁波,早期的光纤,物理层的能力决定了最大传输速率,传输距离等等
数据链路层:主要是解决同一个局域网当中,两台设备之间的数据之间的传递和识别
网络层:互联网是由无数个子网构成的,子网和子网之间由路由器连接起来的,那么我怎么知道要将数据发送到哪个子网下的主机呢,这就是由网络层来解决的,主要负责地址管理和路由器的选择
传输层:负责两台主机之间的数据传输,解决数据通信的可靠性问题和数据安全的问题
应用层:负责应用程序间沟通
集线器
电磁信号在长距离传输过程中信号是会衰减的,而集线器的主要功能就是对接收到的信号进行再生整形放大,以扩大网络的传输距离
网络协议栈和OS:
网络和我们之前学习的系统是存在关系的
在我们之前学习OS的时候,有着如下的图:
网络和OS是有关系的,具体如下图:
对于上述图的理解:
我们将用户和用户操作接口统称为用户,这里的用户不仅仅指广义上的用户,还有程序猿,开发者在这里我们将系统调用和操作系统统称为操作系统,将驱动程序和底层硬件成为设备和驱动
左边是OS的分层结构,右边是网络协议栈的分层结构
在右边的物理层中,其对应的硬件就是网卡
数据链路层是软件,是在各种软件驱动内部实现的
网络层和传输层是最重要的两层,其中的协议最经典的就是TCP/IP协议,这两层也就在Linux内核中实现了,所以网络层和传输层就是OS的一部分
应用层,我们进行看视频,刷抖音就是用户通过网卡设备把请求,把远端传来的数据拉去到本地,本质就是用户访问硬件,就像刷抖音就是通过网卡拿取数据,然后在交给用户,用户就能够看到了,所以网络通信根本也是在访问硬件
并且在传输层必须给我们用户提供系统调用,因为用户想要访问硬件必须贯穿OS,但是OS不允许用户直接访问,所以就需要给用户提供系统调用接口来让用户访问(这在系统的学习中有讲到)
所以有了系统调用,那些开发者就能够写出各种协议来供用户使用
对于所有的操作系统,在其内核的实现是不一样的,有许多如Linux,Windows,鸿蒙,但是他们的网络协议栈是一样的,不然就没办法入网
在两台不同的设备中,不用管他们的OS是怎么实现的,因为他们的网络协议栈一定是一样的,那么两台设备在通信的时候是需要贯穿网络协议栈的
在网络协议栈中定义的各种协议代码字段,左边和右边都是能够认识的,这就做好了计算机上的约定,所以左边添加了一个报文或者字段,在同层的时候认为在逻辑上和对方的层在直接通信
所以在网络通信的时候用户必须贯穿硬件
网络通信的本质是贯穿协议栈的过程(从上往下或者从下往上)
封装与解包:
对于上述图的背景如下:
- 上述两个是两台设备在进行通信的,看做两台主机,是上面手机和电脑那张图的简略版
- 这两设备是通过以太网来进行通信的
- 随着时代的更迭,时代选择了两种协议,分别是以太网和无线LAN
这两个主机在同一个以太网下进行通信
接下来好好聊聊上述的图:
当用户1向用户2发送消息如你好的时候,并不是你好这条消息贯穿网络协议栈的,而是还有许多增加的消息
在网络协议的层状结构中,每一层都要解决对应的问题所以每一层都需要有协议
所以这些增加的消息就是所谓的报头,在左边的每一层都增加其对应的报头,就是一个双方都约定好的结构体,当信息发送后,右边收到了,在右边的对应层就能够进行解析对应的报文,进行报头和有效载荷的分离,然后将有效载荷继续向上层传输
当一层的报头进行添加好了,就需要将这一层的报文继续向下进行传输,并且每一层都有自己的协议,将每一层的协议对应的结构体作为报头都进行增添到对应的报文中
------------------------------------------------------------------------------------------
- 在应用层,一款软件一定会存在新老版本同时存在的情况,所以服务器必须能够同时接收新老版本的请求,所以一款软件就需要定好协议来表名自己是哪一个版本,方便服务端对客户端版本进行甄别,所以一款软件就需要在应用层中定义好将版本的字段添加到这层的报头中,这样在服务端就能够知道当前是哪一个版本
- 在传输层,可以对发送的信息增加序号,保证数据的有序性,所以在传输层也需要增加自己的协议,添加对应的报头
- 在网络层,可以增加当前主机的IP和发送到对应主机的IP,这样当别的主机拿到数据进行IP的比对后就能够知道这份数据是不是发送给当前主机的
- 在数据链路层也需要增加对应的协议了
上述往下传输的过程中,边传输,边增加对应层的协议作为报头,这个操作就是封装,每层都要添加报头,一个报文去掉报头后剩下的传输部分就是有效载荷,每一层只关心自己的报头
报头才是发送给对方的对应层的,对这句话的理解:就是当发送报文的时候,对方对应层就会对当前报文进行解析,将当前层的报头和有效载荷进行分离,此时的报头就是就是对应层需要的,有效载荷就继续向上进行传输,在目标主机中进行解析的操作就是解包
毕竟是同层协议,所以他们的结构体是一样的,也就能够认识对应层的结构体,也就能够认识对应层的报头,就能够达到解包的操作
依次向上,在经过所有的层到达用户后就能够拿到想要发送的信息了
所以网络通信就是不断进行封装和解包的过程的
--------------------------------------------------------
当数据链路层通过网卡拿到数据后,因为冯诺依曼体系的规定,所以就必须将拿到的数据先交到操作系统中,也就是内存中,这样才能够被CPU进行处理
最后有两句话会贯穿我们的网络通信,这两句话的重要性就像系统中的先描述在组织
- 每一层协议在封装的时候,需要在后来方便解包,所以几乎任何一层协议都要提供将报头和有效载荷进行分离的能力
- 几乎任何层的协议都是在其对应的报头中进行提供的,接着就需要将分离后的有效载荷交给上层的哪一个协议的能力,这也叫报文的分用能力
四、以太网:
每台主机在局域网上都要有自己唯一的一个标识
以太网通信原理和我们上课通信差不多
当老师在讲台上进行讲话的时候,对下面的人说:张三,你怎么没交作业,此时是所有人都会听到这个信息,拿到这个报文,然后进行报头的比对发现说的不是我,就将整个报文的丢弃,但是张三进行报文解析的时候发现讲的就是我,那么就会做出反应,就会对老师说:我昨天给你了啊,那么之后老师就会给予回应而不是别人,但是别人会听到张三的回答,但是并不会对其进行反应,因为张三是对老师进行回答的
如上这种向当前局域网所有主机发送消息,但是会进行比对主机这种局域网通信就是以太网通信
每一台主机为了更好的进行通信,就需要有对应的Mac地址,当进行数据传输的过程中的时候,就会有一个如下的数据帧记录了从哪台主机到哪台主机的Mac地址,这个Mac地址在局域网都是唯一
当将上述的数据发送到局域网中,所有主机都会在网卡,硬件层面上收到,接着就需要在数据链路层进行分析处理,将dst的Mac地址和自己的Mac进行比较,如果此时不匹配就将所有的报文丢弃,此时在上层看来就像没有收到报文似得,如果匹配成功就在当前层进行报头和有效载荷的分离,然后将有效载荷向上进行传输
如上就是以太网的通信原理
数据碰撞
如果在一个局域网中有多个主机在进行发送数据,那么就会在这个局域网中进行数据碰撞,这样其中的光电信号,波信号就会混乱了,就会导致接收的数据出现问题
但是一个主机怎么知道什么时候会发生数据碰撞呢?当在一个教室里面进行讲话,我自己也会听到我自己的声音的,所以一个主机将数据发出了后也会收到自己的数据的,那么就能够知道当前局域网有没有发生数据碰撞
在系统中有发送主机都要执行的碰撞避免的算法,这个算法是由以太网的驱动程序自己定的,当发生了数据碰撞后,就延迟发送,错峰发送
正确看待局域网:
局域网内的数据是能够直接通信的
任何主机都可以向局域网里发消息,但任何一时刻只允许一台主机向一个局域网中发送消息,所以局域网是所有主机的共享资源,所以要保证所有主机在使用这个共享资源的互斥访问,这个操作并不是通过加锁完成的,是一旦发生错误,就重新发送资源,相当于这个主机在发送资源的时候没有其他主机使用这个网络资源,出问题再说,所以局域网可以看做多台主机共享的临界资源
五、网络通信:
令牌环网:
和以太网不一样,令牌环网只允许在一个局域网中始终只有一台主机向局域网中发消息,在一个局域网中的所有主机,只有当拿到特定的标识符的时候才能够进行发送消息,这部分就比较像我们以前在系统中学习的锁的概念了
令牌环网,以太网都属于数据链路层的,在层状结构的网络协议栈中,这两个网也是可以进行通信的,只是协议不一样,各玩各的,并且将局域网中的一个以太网协议转化成令牌环网协议,上层是不受影响的
IP地址:
IP地址能够表示一台特定主机在全网中的唯一性,与Mac地址不一样,Mac地址是保证局域网中的唯一性的,有了IP地址才能够知道我们的数据通过网络能够准确的送到对应主机
接下来通过一个故事来理解IP地址:
我家在湖北,想要去一个叫做威海的地方去看海,那么在一个没有智能导航的时代中,我要怎么走呢? ----- 我会首先在湖北当地问路,我要去威海,要怎么走呢?别人回答我:你先去合肥,然后我到了合肥,问当地人说:我从湖北来的,我要去威海,要怎么走呢?别人回答我:你先去南京,然后我到了南京,问当地人说:我从合肥来,要去威海,要怎么走呢?别人回答我:你先去济南,我到了济南,问当地人说:我从南京来,要去威海,要怎么走呢?别人回答我:向东就是了,你直接走就行
在如上的故事中,我有两个地址:一个是目标地址,这个就是我本次旅行的目的地,这就是对应的IP地址,这是一成不变的,还有一个就是我从哪来的地址,这就对应这在局域网之间通信的时候从哪来的Mac地址
IP地址的作用
有了IP地址,我们才能够有目标,向这个IP地址的方向进行前进,其作用就是引导数据到达目标主机,进行定位
IP vs Mac
假如我们要去武汉玩,那么我们就不会走很远,而是在当前直接到达目的地的
所以在网络通信中,为什么要把数据交给路由器 ----- 因为我们的目标主机是别的局域网中的主机,不在同一个局域网,所以必须要经过路由器,这个是由网络自己判断出来的
所以把数据交给路由器的本质就是局域网通信
IP地址,尤其是目的IP,一般都是不会改变的,协助我们进行路径选择
Mac地址,在出局域网之后,源Mac地址和目标Mac地址都要被丢去,让路由器重新封装
对上图的理解:
当用户发送数据的时候,每一层都会对其进行报头的封装,这个在前面有讲过,在以太驱动程序中,在这封装的报头就是从Mac_c到路由器的Mac_R,那么其就会往以太网中进行发送,那么这个以太网中的所有主机都收到了这条消息,但是其会和Mac_R所在的报头进行比较,发现不是发给当前主机的,就会丢弃,然后当路由器拿到这串数据了后,进行报头中的Mac_R的比较分析,发现就是给路由器的,那么就会到路由器的网络层,接着通过网络层的IP定位到哪一个局域网或者离目标局域网近的局域网,那么就会重新封装报头,然后传输给别的局域网,最后到达目标主机,接着向上解包即可
- 在传输层的报文我们称为数据段,数据报
- 在网络层的报文我们称为数据报
- 在链路层的报文我们称为数据帧
网络通信基本脉络示意图:
在网络通信中,想要想远端传送数据就需要经过多个路由器这样的设备,数据通过局域网从路由器的一端网卡进入,然后经过路由器转化mac地址,由另一端网卡送出到另一个局域网,反复中转到达目标主机
六、ifconfig:
inet就是IP地址,其中每一个数字的取值范围都是0~255,为4字节
ether是以太的意思,后面的数据为十六进制,这是Mac地址
在Windows下也能够使用ipconfig命令来进行查看地址: