OSI模型、TCP/IP模型、五层模型 ?
刚开始学习的小伙伴一定会被这些搞懵逼的,傻傻分不清哦。
这个所谓的七层模型,实际上那帮搞学术的弄出来的,但是很可惜,并没有流行开了,主要原因就是搭建这样的体系架构网络很复杂。(了解一下就行了)
TCP/IP网络模型是目前最流行的网络协议模型。在我们的实际生活中被广泛的使用。
最后这个五层协议,主要是为了教学需要而设计的,了解一下即可,但是我还是会简单介绍的。
TCP/IP模型每一层的作用?
应用层
这是我们大部分开发最为熟悉的一层,应用层对于我们来说,是相对可控的,因为传输层及以下是操作系统的网络协议栈接管,用户态的我怎么敢触碰内核态的你。
你所熟知的各种协议,比如 HTTP、HTTPS、DNS等,都属于应用层协议。
传输层
这一层的协议就少了,就两个:TCP和UDP
之后的文章会做详细的讲解,这里简单说一下两个协议的特点。
TCP提供面向连接的、可靠的传输服务;UDP提供无连接、尽最大努力交付的传输服务。
网络层
IP协议起了至关重要的作用,想一下,现在的网络体系,离得开IP嘛?
网络接口层
对于上层的协议来说,这一层就是数据的发送层,实际上,并不是,后面会说。
数据发送的大致流程?
应用层将需要发送的数据交给传输层,传输层拿到后加上TCP头部,向下交给网络层,网络层又加上IP头部,交给网络接口层,加上帧头和帧尾,然后发出去。
(上层协议委托的数据对于下层协议来说是透明的,比如说对于网络层来说,它是不知道有TCP头部和应用数据之分的,只会认为是一个整体)
网络接口层简介
物理层没有什么好说的,这里主要说一下数据链路层。
数据链路层的协议很多,但是他们都面临着三个问题:封装成帧、透明传输和差错检测
封装成帧
数据链路层会将网络层交付的数据添加首部和尾部,这就封装成了一个帧,首部和尾部就标识了该帧的开始与结束。
帧长 = 首部长度 + 数据段长度 + 尾部长度。
MTU(最大传输单元) —— 数据部分长度限制,看图:
帧定界符:就是表示一个帧的开始与结束的标志。=> 有个场景,如果发送端发送的时候,突然“掉线”了,那么接收端就永远不会收到帧结束符。等到下一个帧的帧开始符到达时,接收端就知道上一个帧不完整了,就会把它丢弃。
透明传输
这个问题与数据链路层的机制有关系。数据链路层奉行一种“来者不拒”的理念,“只要给我的,我都要”,对于帧的隔离,识别比特流中的定界符就好了。也就是说,数据链路层并不知道你传的内容是些什么玩意儿,它只负责去“截断”(找到帧开始符合帧结束符)。所以,什么样的比特组合都能通过该层。对于这些比特流而言,数据链路层就好像不存在一样。
但是这样会引发一个什么样的问题呢?对于文本数据还好说,里面的内容都是键盘上录入进去的,帧开始符和帧结束符找两个用户录入不进去的字符就好了。可是,如果是一些音视频或者其他的比特流,很难保证里面其中一个字节的比特组合不会与帧开始符和帧结束符不同(毕竟对于数据链路层来说,它唯一能做的就是扫描字节,找到帧定界符)。
如果数据段中出现了“帧开始”符,那么前面的数据就会被丢弃;如果数据段中出现了“帧结束符”,那么后面的数据就会被丢弃。
为了解决该问题,发送端在数据链路层封装成帧的时候,如果数据内容里面出现了帧定界符,那么就在对应的字节前面添加一个转义字符,如果转义字符也重复了,那么就再添加一个转移字符。=> 该过程称作字节填充或者字节填充。
差错检测
比特差错 => 世界上没有完美无暇的东西,总会出问题的。数据在传输的过程中,可能会出现0变成1,或者1变成0的情况。
泼出去的水无法改变,那就只能在收到的时候,利用各种手段去检测数据是否完整了。
在数据链路层,广泛采用循环冗余检验CRC检错技术 => 其实就是数据段后添加一个冗余码(帧检验序列FCS) => 发送端根据一定的算法生成,接收端根据一定的算法检测(别问,问就是了解就行了,难道我还要把算法的逻辑说出来嘛,呜呜呜)。
值得一提的是,FCS的生成和CRC的运用,都是在硬件层面进行的,非常之快。
数据链路层只能以一种无限接近1的概率向上抛出帧,保障帧无差错。
但是依然会出现这三个问题:帧丢失、帧失序、帧重复 => 不能提供可靠的传输服务
关于MAC地址
相信大家都听过一个词,叫做“MAC地址”,到底是一个什么东西呢? 它就是一个硬件地址,网卡(或者说网络适配器)厂商在生产的时候,写死在硬件里面的,全球唯一的。 网络适配器有过滤功能。每收到一个MAC帧,先用硬件检测一下MAC帧中的硬件地址,看一下是不是发往本站的。是,则收下;不是,则丢弃。 (所以,MAC地址也叫做硬件地址)
2024.10.22
writeBy kaiven