本章开始我们进入Linux网络编程阶段的学习,本章我们将来认识一下网络,学习一下网络原理。
对网络整体有个大概的认识,要了解网络传输数据的基本流程,并了解封装和解包的过程,目标已经明确,搬好板凳准备开讲了……
计算机内部有很多设备,那么设备和设备之间的交流是通过什么方式呢?在设备和设备间一定要有“线”
连接起来。
这样,这些硬件之间,设备与设备之间才能进行通信,如数据总线,地址总线等…
此时设备与设备之间就被用物理上的线
连接起来了,那么就可以通过这些线来进行设备间的通信。
计算机内部的交互主要是通过总线系统实现的,包括数据交互、地址寻址、控制信号传递、中断处理以及与外部设备的连接等。这些交互过程协同工作,使得计算机能够完成各种任务和操作。
网络互联:多台计算机连接在一起,完成数据共享。
要想多台计算机之间进行交流,就要将多台计算机通过线
连接起来。
网络的本质:就是因为线变长了!
体系结构上有网络,络也可以构建体系结构。
也可以使用多主机互相联通,构建宏观的冯诺依曼(集群)。
两台主机之间的通信本质上可以理解成体系结构的延展,也是通过线连起来的。
体系内能通信,体系外也能通信。
协议是一种约定:
在我们之前的学习中,我们知道软件是可以分层的,例如进程地址空间就是一层软件层。
为什么要分层?分层的优势:
网络的分层结构是由软件的分层来决定的。网络本身的代码,就是层状结构!同层之间,一定都要有自己的协议!
这样做的好处:
为什么同层之间,一定都要有自己的协议:
当两个人用座机打电话交流时,他们只会认为自己是和对方直接通信, 而不会认为自己是和座机电话在交流。
可以把系统理分成三层,分别是:人与人之间的语言沟通协议,座机与座机之间的数据交互协议,以及最底层的信号传输通信协议。
不同层次的设备可以将自己视为直接与对方进行交流,而不必关心其他层使用的具体协议。每个层次的设备都有自己的功能和责任,只需确保将数据传递给上一层或下一层即可。
这样做的好处:
OSI(Open Systems Interconnection)是一个通信系统互联协议的参考模型,由国际标准化组织(ISO)在20世纪80年代提出。该模型将计算机网络通信划分为七个层次,每个层次都负责特定的功能和任务,从而将复杂的通信过程简化为各个独立的层次。
OSI层级 | 层名 | 功能描述 |
---|---|---|
第7层 | 应用层(Application Layer) | 提供网络服务和应用程序之间的接口 |
第6层 | 表示层(Presentation Layer) | 处理数据格式化、加密、解密和压缩,确保数据能被正确解释 |
第5层 | 会话层(Session Layer) | 建立、管理和终止会话连接 |
第4层 | 传输层(Transport Layer) | 提供端到端的可靠传输和错误恢复 |
第3层 | 网络层(Network Layer) | 处理分组在网络中的路由和转发 |
第2层 | 数据链路层(Data Link Layer) | 负责物理地址寻址、错误检测和纠正 |
第1层 | 物理层(Physical Layer) | 处理与物理介质的传输相关的细节 |
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输。
OSI 标准在定的时候是特别好的,每一层该做什么工作都做的特别好,只不过,实际在实施的时候,
里面有些东西是不可能在标准当中定好的,尤其是会话、表示、应用这三层是不好去处理的。
TCP/IP 协议是在OSI的基础上发展起来的。
TCP IP 是一种网络通信协议集合,它由两个部分组成:传输控制协议(TCP)和互联网协议(IP)。TCP/IP 是互联网的核心协议套件,广泛应用于全球范围的计算机网络中。
为了使用户的网络请求成功发送给目标设备,需要经过网卡这个硬件,并且网卡的访问需要通过操作系统来进行。
在网络当中对应的主机相互通信,一定是由用户发起,使用应用层协议,贯穿对应的协议栈,到对应的物理层,经过网络路由转发,被对方的物理层收到,然后再提交到对方的数据链路层,依次向上提交,最后就到达了对方的用户。
体系结构直接决定,数据包在主机内进行流动的时候,一定是要进行自顶向下或者自底向上,进行流动的。以前的所有的IO都是这样的!!这是由体系结构决定的,这就是计算机本身的工作方式。
网络的实现从软件上讲分了四层,顶层是应用层,用户去实现的,底层是驱动去实现的,中间两层传输和网络层是内核去实现的,也属于操作系统的一部分。
网络未来的数据流向,一定是自动向下,或者自底向上的。
TCP/IP 协议和操作系统之间的关系是:
在我们平时网购的时候,买的东西一定是商家给你打包好了的。为了明确快递的出发地和发往地的信息,快递员一定会给快递上贴一个快递单。而这个快递单就很好的维护了出发地与发往地
的信息。
在网络通信中,数据包或消息通常由两部分组成:报头(Header)和有效载荷(Payload)。
在网络通信中,为了维护和控制协议的正常运行,通常需要在被传输的数据上新增其他数据,也就是所谓的协议数据。
报头:
我们把每一层要交付给下一层的数据,给他添加上本层的 “多出来的协议数据”
拼接在原始数据的开头,就是报头。
解包:
报头通常位于数据包或消息的起始位置,其长度和结构由所使用的协议规定。报头中包含了各种字段和参数,用于描述和控制数据包的属性、类型、源地址、目标地址、校验和等信息。
站在系统角度,以太网可以看作是两台主机之间的临界资源。
数据包添加报头的时候,也要考虑未来解包的时候,将自己的有效载荷,交付给上层的哪一个协议!
数据包被以太网驱动程序收到之后:
有效载荷的分用的过程:
报头中的分用属性(例如TCP协议中的端口号、IP协议中的源IP地址和目标IP地址等)都是公共的,这些属性可以被网络中的所有设备所识别和使用。
分用属性通常用于标识数据包中传输的应用程序或服务,以便接收方设备能够正确地处理和响应这些数据。在TCP/IP协议族中,不同的协议会使用不同的分用属性。
如果两台主机,处于同一个局域网,那么这两台主机,能够直接通信吗?答案是肯定的,可以!
有一种局域网称之为以太网,至于名字怎么来的百度去~(剧透和物理有关哦)。
MAC地址(Media Access Control address)是指网络设备在物理层上的唯一标识符。它由48位二进制数表示,通常以十六进制表示法呈现。每一台主机都要有唯一的标识,该主机对应的MAC地址!
通过MAC地址在局域网找一台主机,就像是在一间教室里找人,只需要通过座位号来确定位置就好了。
MAC地址叫做网卡地址,网卡已经内嵌了网卡地址,主要用作在局域网标定主机的唯一性。
局域网碰撞的概念:
IP地址(Internet Protocol Address,简称IP地址)是互联网上用于标识和定位设备的一组数字,用于在网络中进行数据包传递和通信。
它是一个由32位或128位二进制数字构成的标识符,分为IPv4和IPv6两种格式。
对于IPv4来讲,IP地址是一个4字节,32个bit位的整数。通常使用 “点分十进制”
的字符串表示IP地址, 例如 “xx.yy.zz.aaa”,用点分割的每一个数字表示一个字节,范围是 0~255
。
在大多数情况下,数据经过路由器后会进入下一个局域网。路由器是连接不同局域网之间的设备,它通过查找目标IP地址来确定下一跳,并将数据包转发到正确的网络中。
IP协议有一个非常大的亮点:所有的IP向,上的协议发送和接受主机看到的数据是是一模一样的!屏蔽了底层网络的差异!!
路由器可以分别当做两个局域网各自的主机。是横跨两个局域网的,身处两个局域网当中,才可能完成数据的路由转换。
走到局域网时套上局域网的报头,在经过路由器时,就会去掉局域网的报头,在路由器内重新转到下一个路由的时候,重新会封装mac地址。
所以当一个IP报文在不断流动的时候,目的IP一直都不变,但是原mac地址和目的mac地址一定是在变的。
源IP对应的就是标定通信主机的源主机。目的IP对应的就是标定通信主机的目的主机。
通信过程:
在广域网通信中,每个数据包都需要提供源IP地址和目标IP地址来确定数据包应该从哪个源节点传输到哪个目标节点,还需要提供源MAC地址和目标MAC地址来进行标识。
IP的意义:
常识告诉我们,一般我们在进行路线选择的时候,我们一般有两套地址:
IP规定了一个宏大的目标,未来要去哪里,而Mac地址则是告诉我们当下,这一阶段要做什么事情。
IP地址将底层Mac地址的差异屏蔽掉。
自顶向下发送到局域网,发送到路由器,解包,再封包,然后重新再转发,最后数据经过路由器的路径选择,到达了目标主机。
我们在网络通信的时候,只要让两台主机能够通信就可以了吗??答案是否定的!
主机间通信的本质是:
IP地址和端口号的组合被称为Socket(套接字):
网络通信的本质:也是进程间通信!!
为什么不去把PID来标识进程的唯一性:
操作系统维护了一张哈希表,存着进程ID,通过进程ID来查找进程的PCB。
同样的类似的原理,在操作系统内,也存在着一张端口号的哈希表,可以通过端口号,快速找到目标进程。
一个进程可以绑定多个端口号,而一个端口号只能被一个进程占用。