• 计算机网络基础知识


    什么是网络

    计算机刚出现时虽然具备很强的计算能力,但是每个计算机都是相互独立的,那计算机的使用者就只能计算自己的数据,而如果使用者之间想互相协作,把数据交付给彼此时,只有独立计算机是不够的(成本非常高),所以我们就需要把多台计算机之间连接起来,这样在数据传导交互上成本就会低了非常多,这就是计算机网络。
    在这里插入图片描述

    网络诞生之后,随着使用的人数增加,就可能会出现更大,更多的网络,不同的网络之间可以通过路由器连接起来,形成一个由交换机和路由器连接在一起的网络—局域网(LAN)
    在这里插入图片描述
    多个局域网之间用路由器彼此相连构成了一个可以直接或间接互相通信的大的网络,这个整体的网络叫做广域网(WAN)
    在这里插入图片描述
    局域网和广域网只是一个相对的概念,主要是为了区分彼此,比如某个地区的网络在我们全国来看就可以当作局域网,而全国的网络就可以看作广域网,而在全世界来看,我们国家的网络又可以当作是一个局域网,和所有国家的网络合起来称为一个广域网。


    网络在计算机中的哪里呢?
    在这里插入图片描述
    网络指的是网络协议栈,它是一个软件,贯穿体系结构。
    其中的TCP/IP协议栈属于操作系统的一部分,所有的操作系统都会遵守,这也就是为什么电脑和手机之间可以互相通信的原因。


    计算机协议

    计算机之间是通过光、电信号的“频率”和“强弱”来表示0和1这样的信息的。
    想要传递各种不同的信息,就需要约定好双方的数据格式——即计算机协议
    所谓计算机协议,其本质就是一种约定,这个约定是由编码的程序员自己根据标准文档或者自己的喜好定义的协议。
    即使我们定义好了协议,如果实现上有差别也无法完成通信,所有从协议到协议的实现,全部都要是标准化的,大家都要遵守一个共同的标准——网络协议

    协议分层

    为什么要分层?
    以现实中两个人打电话为例
    在这里插入图片描述
    这就是一个简单的分层结构,一共分为两层,语言层和通讯设备层,假设我们两个人都是中国人,都用汉语交流,这表示我们之间使用的语言协议都是汉语,如果我们两个今天不想用电话,想用无线电,表示我们改变了设备协议,但是我们两个还是可以交流的,那如果我们还是用电话,但是我两都会英语,我们用英语交流,还是可以交流的,这就是分层结构

    上面的例子协议只有两层,但实际的网络通信会更复杂,需要分更多的层次。

    在软件设计上层状构造的好处:通过分层完成了解耦,任何一层进行替换不会影响其他层


    如何分层?
    不同的软件实现方案很大。

    协议也是软件的一种,协议分层就是软件分层
    软件:代码和数据,代码:函数和各种调用逻辑,数据:各种变量个结构以及各种结构建好的数据结构,各种对象。
    软件分层:在代码层面进行逻辑分层,数据在不同层之间进行流动
    操作系统在管理硬件时通过驱动层,把所有的硬件都看作文件进行统一的管理,这也是一种分层


    OSI的七层模型

    网络协议是一个层状结构,谁来规定这个层状结构?——OSI组织
    
    • 1

    OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,
    是一个逻辑上的定义和规范;

    逻辑上:没有真实存在,而是用代码或者某种抽象的方式模拟出来的(如进程的虚拟地址空间)
    硬件上不实现,由软件上实现,具体方法是增加一些软件层帮助实现逻辑上的定义和规范
    
    • 1
    • 2

    把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备(),比如路由器,交换机;

    OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;

    它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;

    但是, 它既复杂又不实用,所以实际上只实现了一部分,所以我先按照TCP/IP四层模型来讲解.


    TCP/IP四层(或五层)模型

    TCP/IP是软件协议,理论上是四层,但是由于网络与硬件由强相关,所以加上物理层就是五层
    
    • 1

    TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
    TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。自底向上分别为:

    物理层: 负责光/电信号的传递方式(纯硬件,频率,波形等)。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤。现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等.。集线器(Hub,把数据放大)工作在物理层。

    数据链路层: 负责设备之间的数据帧的传送和识别(可以理解为硬件所匹配的驱动模块)。 例如网卡设备的驱动、帧同步(就是说从网线上检测 到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准。交换机(Switch)工作在数据链路层.
    网络层: 负责地址管理和路由选择.。例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
    传输层: 负责两台主机之间的数据传输.。如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机。
    应用层: 负责应用程序间沟通。如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层。

    在这里插入图片描述

    越靠近上层的设备,实现的层级越高。

    四层协议各自的作用?

    以买快递为例:
    假设一个买家在网上买了一个手机,那买家从买手机到拿到手机开始用可以大致分为以下几步:
    (1)卖家收到订单,要把手机打包,在网络里叫做封装。
    (2)卖家要填快递单,然后就可以把东西交给快递公司了,剩下的卖家就不用管了。
    (3)快递公司拿到包裹,就要规划我从哪条路径把东西运到目的地,这就是网络层做的事——路径规划
    (4)路径规划好了,那就需要把包裹按照路径运输过去,这就是数据链路层做的事。
    (5)而包裹在运送的时候可能发生各种各样的意外,比如包裹丢了或者东西损坏了,我们会要求卖家再重新给我们发一份,卖家给我们重新发一份这个动作就是传输层做的事——保证可靠性
    (6)通过上面的过程,买家终于拿到了包裹,但是还没有结束,因为我们把包裹送给用户的目的是让用户能够使用这个东西,所以我们还要告诉用户如何去使用这个手机,这就是应用层的工作——分析和使用数据


    网络传输的基本流程

    在这里插入图片描述
    如果我的设备A想要给设备B发送一条消息,这条消息不能从应用层直接传递过去,必须要从应用层一层一层的向下,通过以太网在物理层上被传输,再自底向上的交付,传递到设备B的应用层,无论是局域网还是广域网,必须贯穿整个协议栈。就好比我和我的朋友在两栋楼里,虽然我们都在4楼,但是如果我要去找他我还是待先下楼,然后走到他的楼下再上楼去找他。

    数据包封装和分用

    数据向下传输时,每一层都会添加自己的报头,最终包文会带着所有的报头通过物理层被传输到另一台设备,每一层协议向上交付报文时会去掉当前层的协议报头,然后交付给上层。
    给原始数据不断添加报头的过程叫做封装。
    自底向上把报头的部分一个一个解析出来只保留他的有效部分的过程叫做解包&。
    在这里插入图片描述

    最终用户可以看到的现象时同等的层在逻辑上会得到同样的报头加报文,也就意味着在每一层看来,如果忽略底层细节的话,我每一层都认为我发什么对方就会收什么,叫做同层协议,好像都认为自己在和对方直接通信,就比如用户会认为自己在和另一个用户直接通信(应用层的同层沟通)。


    什么是报头?
    还是以发快递为例,所有的快递盒子上都有快递单,格式+数据。
    我买的东西的时候,我只需要我的手机,为啥要给我这张单子?这个这个快递单就类似与快递的报头
    如果我没有快递单,快递员就不知道这个包裹是谁发的,也不知道该发给谁,导致快递公司就无法得知如何派发。所以报头最大的意义指导我们进行派发。
    在网络中,需要报头中的数据来指导当前层进行某种协议决策(如何处理报文)。

    在生活的角度来看,当我们收到快递时,我们又不需要快递单,所以我把快递拆出来把盒子扔了,这就是解包的过程。而在寄东西的时候除了要把你寄的东西给快递公司,还要填一个快递单,这叫做封装的过程。


    OS中如何理解报头和数据?
    首先明确一个概念:在当前层,把报文分为报头报文的有效载荷

    Linux系统是C语言写的,语言角度如何理解封装和解包?

    struct my_hdr(为了讲解自定义的包头,没有任何意义)
    {
    	unsigned int src:16;
    	unsigned int dst:16;
    	unsigned int type:8;
    	unsigned int len:24;
    }
    
    struct my_hdr my;
    my.src=0x1;
    my.dst=0x2;
    my.type=0x2;
    my.len=0x9;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上面的代码在语言角度:定义了一个位段变量。而网络角度:定义了一个报头

    所以包头就是一个结构化的变量

    在操作系统的角度来看,所谓封装就是把一个位段拷贝进一段缓冲区,再把有效载荷也拷贝进去(使用的一定时二进制拷贝)。解包就是把包文前面的位段去除出去,取出后面的有效载荷。


    几乎每一层协议的包头中,都要包含两种字段:
    1.当前报文的有效载荷要交付给上层的哪一个协议。(分用
    2.几乎每个报头都有一个属性,明确报头和有效载荷的边界。(解包
    这是报文所有的协议的共性


    网络中的地址管理

    Linux中可以用命令查看网络地址

    ifconfig
    inet后面的内容是内网IP
    ether后面的内容是Mac地址
    
    • 1
    • 2
    • 3

    Mac地址

    首先我们来了解一下局域网的通信原理,为什么局域网内的的主机之间可以通信
    在这里插入图片描述

    假设现在在一个局域网中有A,B,C,D,E五台主机,A主机现在想给D主机发一个消息,那A主机就要先对数据封装,然后传输到以太网上,但是网线上传递的都是光电信号,并不能指定这个数据就传递到网线的哪个位置,哪个主机上,但是为什么我给主机D发送的数据不会被其他主机收到呢?因为在我们发送的报文的报头里面携带了一个Mac地址局域网内所有的主机都有唯一的Mac地址,所以A主机发消息的时候只要填上主机D的Mac地址,这样发消息的时候虽然所有的主机都可以收到,但是他们在做报文解析对比的时候发现这不是给自己的报文,就会直接对报文进行丢弃,最终就只有D接收了消息,所以最终看起来就像是我们单向的把数据从A发给了D。就好比有好几个人都在一个房间里,我这时候想给其中一个人说一句话,那我就要先叫一声他的名字,他才知道我是在给他说话,而别人虽然可以听见,但是别人知道这不是给自己说的,就会忽略这句话。

    Mac地址:全球唯一的,可以烧进网卡的序列号,长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)。实际上的Mac地址大部分情况下用于作局域网的标识全球范围的标识用的是IP地址

    但是我们在想网络里发送消息时并不能保证我在传递信息的时候别人没有在用网络(网络资源是被大家共享的),就相当于我在房间里说话,那我又不能规定这个房间只有我能说话,别人都闭嘴,那我说话的时候别人也在说,谁说的话都听不清,这种情况在网络里叫做数据碰撞。
    如果所有主机同时发消息,可能发生数据碰撞的问题,这种情况虽然不能避免,但是我们可以检测到有没有发生碰撞,所以每台主机都要有碰撞检测的能力每台主机都要有碰撞避免算法

    这些所有的动作都在以太网驱动程序数据链路层完成

    总结:局域网中任何一个时刻都只能有一台主机在向局域网中发送消息

    那么站在操作系统的角度:
    这根网线就是局域网的一个公共资源,一份公共资源可以被多个执行流(主机)访问,这部分网络资源叫就可以看作进程间通信中的临界资源,而这里面的多台主机可以看作不同的执行流,在任何时刻保证只能有一个执行流向里面输入数据,这就是互斥。

    上面的这种有资源碰撞的局域网叫做以太网,还有一种局域网叫做令牌环
    令牌环发送消息时,相当于有一个令牌,只有具有令牌的主机才可以发消息,发完消息就继续把令牌交给下一个人,有点类似于互斥锁。


    IP地址

    上面的内容讲解的都是局域网之间的数据传输,跨网络传输呢?

    在这里插入图片描述

    A和B不在同一个网段,因为他们不属于局域网,是用路由器连接的,但是主机A和路由器与主机B和路由器就属于同一个网段,路由器就类似于A于B之间的话事人,A可以和路由器沟通,路由器可以和B沟通,这样就可以让A和B沟通。

    而每个传输的数据包身上都有两套地址
    1,一个是目的IP,在传输过程中几乎一直不变
    2,还有一个是目的Mac,这个是一直在变化的

    他们两个之间的关系就好比假如一个人从小就有一个想法是成为人上人,哪这时候这个成为人上人的这个目的就是他的目的IP,然后他从小开始上学,先要完成小学的学业,这个完成小学学业的目的就是他的目的Mac,小学毕业后,他又想完成中学学业,这时候目的Mac又变成了完成中学学业,中学毕业有要上大学,大学上万参加工作,在这个过程中他一直不忘初心,最终成为了人上人,这里他成为人上人的最终目的是一直没有变的,但是他在成为人上人这个过程中每一个阶段的目的是一直在改变的,但是这些目的改变也是围绕他最终的目的进行的,这就是目的Mac与目的IP的关系。

    在上图进行数据包转发时,数据包从顶层一直不断的封装,到了以太网,这时报头里会包含很多字段,其中就包含当前栈和下一栈的Mac地址,然后数据被发送到以太网中,以太网的所有主机都可以收到这个数据包,但是因为Mac第地址不是给他们的,所以他们会丢弃报文,只有路由器会收到这个报文,然后进行解包和分用,路由器向上交付给IP层,这时候发现要路由交给主机B,但是不能同层之间直接交过去,所有要再次封装,封装一遍令牌环的报头,然后在令牌环里被B主机收到,解析报头,向上交付,最终完成通信。

    所以为什么Mac地址一直在变化:在数据链路层,经过路由器,一直在进行解包和封装(目的Mac地址一直在重新封装)

    在IP层,因为有路由器的存在,IP层及其以上的所有协议都看不到底层网络的任何差异,屏蔽了底层网络的差异,所以互联网底层最核心的协议叫IP,IP的存在可以把所有的不同网络进行统一。

    IP协议分为两个版本,IPv4和IPv6,一般没有特别说明时IP协议默认是指IPv4
    对于IPv4,IP地址可以用4个字节,32位的整数表示
    通常也使用“点分十进制”的字符串表示IP地址,如192.162.0.1,用点分割的每一个数字表示一个字节,范围是0-255(8个bit位)。


    最后总结一下报文传输的流程

    在这里插入图片描述
    报文从主机A发送到主机B,首先要经过层层的封装,来到物理层,然后被传输到路由器,在路由器进行解包,然后路由转发,最终传送到目的主机,经过一些列的解包分用,完成转发,而相同层之间是无法进行直接通信的,必须经过物理层。

    以上就是本篇的全部内容。

  • 相关阅读:
    Golang 面向对象深入理解
    SQL语句查询关键字
    如何快速实现直播美颜功能 - 接入美颜SDK详解
    mysql指令
    python代码规范PEP 8——常见的规范错误与解决办法
    web:[护网杯 2018]easy_tornado
    unity中方向的两种表示:欧拉角和四元数
    nginx反向代理.NetCore开发的基于WebApi创建的gRPC服务
    C/C++指针之提高篇详解(二)
    QFileInfo 类【官翻】
  • 原文地址:https://blog.csdn.net/qq_45967533/article/details/125572418