编辑
哈喽,大家好~我是你们的老朋友: 保护小周ღ,本期为大家带来的是 网络基础原理中的 TCP / IP 五层网络模型,主要从协议的概念,网络模型,数据分层传输的流程,几个方面讲解,看完之后可以轻松的理解数据是如何在网络中传输的,确定不来看看嘛~~更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘
一、协议的概念
为了使数据在网络上传输(从源头到达目的),数据所经过的所有网络设备都必须遵循相同的规则,如:怎么样建立连接、怎么样传输数据、怎么样互相解析信息等。只有遵守这个约定,计算机之间才能相互通信交流。这样的规则就被称之为协议(protocol),它最终体现为在网络上传输的数据包的格式。
通信三要素是指通信过程中必须满足的基本条件,即语法、语义、时序。
1. 语法是指通信双方使用的符号及其组合方式,也就是所谓的通信协议。在通信过程中,通信双方需要遵守相同的语法规则,才能够正确地理解对方的信息。
使用一些特殊的分隔符举个应用层例子:
编辑
这只是一种应用层协议约定的策略,是可以自定义的,前提是通信双方都采用该协议。
2. 语义是指通信信息的含义及其解释,也就是所谓的消息格式。在通信过程中,消息的发送方需要确保其含义与接收方相同,以便接收方能够正确地理解并作出相应的响应。
3. 时序是指通信信息的时序关系,也就是所谓的时间协议。在通信过程中,通信双方需要遵守相同的时序规则,确保消息能够按照正确的时间顺序传递,从而保证通信的可靠性和正确性。
通俗来讲就是我们嘎嘎发一大堆消息给对方,如何保证这些信息在在网络传输到对方主机时保持有序,不会发送消息错乱的情况。
例如:
我qq发送消息 :“早上好兄弟 ” ,“今天有空吗?出来玩啊”。
对方qq接受消息:“今天有空吗?出来玩啊”。 “早上好兄弟 ” , 这种情况明显的不合适,这就是时序作用的体现,博主以前使用qq 发送消息就遇到过这种情况,通过好友截图才得知。
综上所述,通信三要素是通信过程中必不可少的基本条件,只有满足了这些要素,通信才能够进行顺利,实现信息交流。
1.1 网络通信为什么需要使用协议
网络通信需要协议是因为协议规定了网络中数据传输的标准化方法,确保不同设备之间能够正确而无误地交换信息。没有协议的话,网络中的设备无法准确理解彼此发送的数据,也无法确定如何响应(解析并回应)这些数据,这样就会导致网络通信的失败。
具体来说,协议定义了数据传输时所需的格式、参数、序列化方式(下文讲述)、异常检测和重传机制等一系列细节内容。
网络通信需要协议是因为它提供了一个标准的框架,使得在大量不同的设备和复杂的网络环境下,数据能够被有效地传输、组织和管理。
二、网络模型
在网络通信中,需要约定协议,一个应用层的数据(软件),被指定的另一个应用层接收,中间传输是非常的复杂的,设想一下,中国人给一个外国人发电子邮件,不论距离有多远,不论你在何方,给一个合法的接收地址,信息就能来到你的身旁,接下来,博主就来带大家领略一下信息是如何从这里到那里的。
面对复杂的网络通信环境,就需要复杂的协议来约束,一种协议肯定是无法胜任所有的应用场景,即使可以那也是相当的复杂,所以协议有很多,每个协议都有自己的独特的功能,就可以针对这些协议分类,同时针对这些不同的类别,将协议进行分层,并约定层级和层级之间的调用关系,只允许上层协议调用下层协议,下层协议给上层协议提供支持,不允许跨层调用协议。
协议分层的好处:
协议分层后,后续就比较容易针对某一层的协议进行替换,举个例子:应用层的协议,qq 能发消息,也只能被 qq 这个应用接收并解析吧(只有qq认识),微信也能发消息,抖音,支付宝……都可以发消息,只是以上这些应用软件使用的是不同的应用层协议,对信息是怎么传输的没有任何影响吧?站在程序员的角度,真正操作的只是传输层和应用层,你可以先理解传输层能保证将你的信息从你的电脑送到指定接收人的电脑(这其实是网络层干的活),并且会根据端口号(下文讲)将这些信息交给某个应用,至于应用程序怎么解析这些信息那就是各个应用的事情了。
以上事例就是为了告诉大家,协议分层之后,层次之间,“耦合程度比较低 ”,也就是说每层协议负责干自己的活,流水线作业,中间有道工序的员工摸鱼去了,对前面的员工来讲没有任何影响,依旧可以干活,对于后面的员工来讲,没货上来,等于没事干~~,领导查看当日的货物清单,woc,经过层层排查发现中间那货,效率这么低,这不赶紧换人(第二个优势就是方便对某一层协议进行替换),“换人” 这个操作对于前面的员工、后面的员工没有任何影响,只会有效率的问题,后面的员工直夸:这个猛~~
编辑
站在程序的角度看待协议分层:
调用服务:不需要关心接口具体是如何实现的,只关心通过那些接口能做什么事就行了。
提供服务:封装隐藏功能实现的细节,提供开放接口给别人使用
2.1 OSI 七层模型
OSI (Open System Interconnection) ,开放系统互连 , 它由国际标准化组织(ISO)制定并发布。该模型将计算机网络通信划分为7个不同的层次,以帮助不同的网络设备和软件之间的交互和协作。
OSI 七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了7层。
它的最大优点是将服务、接口和协议这三个概念明确地区分开,概念清楚,理论也比较完整。通
过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
- 应用层(Application Layer):应用层定义了协议、接口和数据格式,以支持特定应用程序的数据交换。
- 表示层(Presentation Layer):表示层负责将数据呈现给应用程序,以便应用程序可以理解和使用数据。如何编码和解码数据,以及如何加密、压缩和转换数据格式等问题。
- 会话层(Session Layer):会话层提供了一种机制,使得在不同计算机之间的数据交换成为可能。此层负责建立、维护和结束会话,并对会话中出现的错误进行处理。会话层还可以支持多个应用程序之间的通信。
- 传输层(Transport Layer) :管理两个节点之间的数据传输,负责可靠的传输,确保数据被可靠的传送到目标地址。
- 网络层(Network Layer) :地址管理:记录源目标主机的ip 和 目的主机ip , 路由转发:负责给两个节点选择一条可靠的高效的传输路径。
- 数据链路层(Data Link Layer) :负责连接设备之间传输数据帧,例如:网卡,交换机
- 物理层(Physical Layer):物理层处理传输介质上的原始比特流,物理层设备:网络、光纤等一系列传输介质。
理论虽好: 但是 OSI 七层网络模型仅仅只存在于教科书上,并没有实质上的实现,真实的网络,实际上只是采用了七层中的 四层 或 五层,当前使用最广泛的网络模型是 TCP / IP 五层网络模型。
三、TCP / IP 五层网络模型
TCP / IP五层模型是一个网络协议集合,涵盖了计算机通过互联网进行通信所需的所有协议。这个模型被设计出来是为了解决不同计算机之间互联的问题,并且能够保证数据在传输过程中的可靠性。接下来通俗易懂的讲讲每层协议对应的功能,具体可以参考 IOS 参考模型。
- 应用层:只关注传输过来的数据,我们要干什么,一个程序在开发过程中,程序员通过一系列的技术手段(在Java中,可以通过Socket类的InputStream和OutputStream来实现对传输层数据的读取和写入)可以获取到这些数据,我们应用层拿到这些数据后如何按照约定的格式处理,那就是不管传输层的事情了。
- 传输层 :管理两个节点之间的数据传输,负责可靠的传输,传输层不关注中间传输的路径,只关注起点和终点并确保数据被可靠的传送到目标地址。
- 网络层 :地址管理:记录源目标主机的ip 和 目的主机ip , 路由转发:负责给两个节点选择一条可靠的高效的传输路径——路径规划。
- 数据链路层:负责连接设备之间传输数据帧,主要关注两个相邻设备节点之间的传输,例如通过网线 / 光纤 / 网络接口,连接的交换机、网卡之间的数据传输。
- 物理层:网路通信的基础设施设备:网络、光纤等一系列传输介质。
作为一个普通的程序猿,我们关注的实际上就是应用层,因为应用层才真正关心数据的用途,但是传输层给应用层提供服务,所以也需要重点学习一下传输层,进行网络编程主要还是围绕着应用层展开。
除了应用层之外,另外的四层是由操作系统内部封装好了,就相当于系统直接给应用层提供了操作传输层的接口,可以直接使用(在Java中,可以通过Socket类的InputStream和OutputStream来实现对传输层数据的读取和写入),注意!!只允许上层协议调用下层协议,下层协议给上层协议提供支持,不允许跨层调用协议,所以应用层只能直接操作传输层。
四、协议分层的背景下,数据如何通过网络传输?
按照TCP / IP五层网络模型协议有五层:应用层、传输层、网络层、数据链路层、物理层。传输层为应用层提供服务,网络编程主要就是学习传输层和应用层交互。
4.1 再谈协议
对于客户端及服务器应用程序,请求(给服务器发送信息)和响应(服务器给予回应)需要约定一样的数据格式,方便(封装和分用,下文讲述)。
- 客户端发送请求和服务端解析请求要求使用相同的数据格式。
- 服务端返回响应和客户端解析响应请求要使用相同的数据格式。
- 请求格式和响应格式可以相同,也可以是不同的约定,保证发出请求的格式和解析请求的格式一样、响应的格式和解析响应的的格式一样即可,约定相同的数据格式,主要目的是为了让接收端在解析的时候明确如何解析数据。
- 可以使用知名协议,也可以自己约定数据格式,属于自定义协议。
例如:上文博主讲述通信三要素时举应用层数据报的例子。
4.2 封装 / 分用 vs 序列化 / 反序列化
协议(protocol),最终体现为在网络上传输的数据包的格式。
粗略的画个草图让大家先理解一下客户端服务器这种的通信流程:
编辑
我们每个人在使用qq 的时候,首先会联网,这样才能跟朋友愉快的聊天,其实这个联网的过程就是与腾讯qq 的服务器建立连接,当然腾讯有很多服务器,服务器之间可以进行信息交互,大家都连接上腾讯的服务器之后,这是qq 通信的基础,此时我们如果向好友qq发送信息,qq 应用层会生成一个应用层的数据报,里面的信息必然包括,你的qq ,对方的qq ,还有时间,信息体等信息,之后将数据交给传输层,传输层按照标准的网络协议保证将数据安全无误送给服务器,服务器读到你的请求之后,就会分析这个信息,看看是发给谁的,里面有 IP 地址(确认通信设备在互联网上的位置),端口号(相当于告诉这个信息是qq 发来的),以及qq 号, 腾讯的服务器依据对方qq 看看好友的 IP 设备连接上腾讯的服务器没有,如果没有就等待好友设备上线,如果刚好你朋友qq 上线了,就把消息根据拥有该账号设备的 IP地址,发给好友(同一时刻只允许一台通信设备-手机登录该qq,电脑是另一套逻辑),当然这是一串二进制数据,好友的设备接受到数据后,操作系统按照标准的网络通信协议解析,数据解析到达传输层的时候发现端口号描述的是 qq, 于是就将信息交给 qq 处理,qq 拿到信息之后按照 qq 这个应用开发者设计的消息约定,解析数据,最后消息就展现到好友的设备中了,由你发给好友的信息。
在以上流程中,传输的数据是以数据包的格式传输。
如果信息从应用层到物理层,层层协议会将程序中的对象层层打包,最终转化为二进制数,如果转化的过程中使用的是知名协议,例如 : 传输层的 UDP, TCP ,协议 网络层的 IP 协议,这个转化的过程被称之为封装,如果是使用的小众协议(包括自定义协议),这个转化过程就被称之为序列化。
接收端应用程序,接收数据时的数据转换,即对原始的二进制数进行解析,数据从物理层到应用层
如果是使用知名协议解析,这个解析也称为分用,如果是使用小众协议(包括自定义协议),这个动作也称为反序列化。
4.3 什么是端口号
端口号是计算机网络中用于标识应用程序的的数字。在一个主机上可以同时运行多个网络应用程序,每个应用程序都会分配一个唯一的端口号,以便于其他计算机通过网络访问该应用程序。
比如说我电脑qq 给 你发了一条消息,这个条消息通过网络发送到你的电脑,进入你的电脑后,这条消息怎么能知道要给那个应用程序呢(进程)?微信也是腾讯的,也没见着能接收qq 发的消息啊,关键的就是应用程序在启动时会绑定了一个端口号(端口号在一定范围内可以随机使用),一台主机中的端口号不可重复,所以消息在进入主机后就会根据端口号将信息发送到指定应用程序,应用程序就根据应用层的数据报协议(这个可以是通信双方约定的协议,qq自己的协议)解析信息。
端口号只占两个字节,可以描述的数据范围是 [0, 65535] ,也就是我们可以使用的端口号只有这么多,对于小于 1024 的端口号被称之为“知名端口号”,是提供给一些名气比较大的服务器使用,例如:http 服务器的端口号位 80, ssh 的端口号为:22, ftp 服务器的端口号是 21。所以我们要在程序设计中尽量避免使用这部分端口。
4.4 什么是 IP 地址
IP地址(Internet Protocol Address)的缩写,也就是互联网协议地址属于网络层的协议。它是用于在网络中唯一标识设备的一组数字,类似于门牌号码。IP地址的作用是让数据包能够在网络上正确地传输和路由到目的地。在互联网中,每个连接到网络上的设备都需要有一个唯一的IP地址,这样其他设备才可以通过该地址与其进行通信。IP地址由32位或128位二进制数字组成,可分为IPv4和IPv6两种格式。IPv4是目前广泛使用的版本,但随着网络连接设备的增多,IPv6逐渐取代IPv4成为新型的IP地址标准。
知道了地址才能找的到人家嘛,当前这是片面的理解,真实的理解是绑定了一个身份证号,在整个互联网中遍历寻找,找到你之后,网络层选择一条可靠的路径连接你。
4.5 一条信息的封装
发送方发送数据,要把数据从上到下(TCP / IP 网络模型),从应用层到物理层以此交给对应层次的协议进行封装。
以qq 发送消息为例:
张三使用qq 给 李四 发了一句 “早安” ;
1. 应用层(qq应用程序)拿到张三发送的信息 “早安”, 根据发送方和接收方的用户数据进行封装,封装成应用层数据包。
编辑
应用层数据报可以理解为就是一串字符串连在一起,可以使用一些特殊的符号区分,是可以自定义的协议。
2. 应用层到传输层 :使用 UDP 协议
传输层使用那种协议可以是应用层选择的,此处使用 UDP 协议举例:
应用层要调用传输层提供的接口来处理数据,在Java中,可以使用Java的原生套接字(Socket)API来操作UDP(用户数据报协议)。
//创建DatagramSocket对象来表示套接字: DatagramSocket socket = new DatagramSocket();
今天主要讲概念哦,网络编程是后续内容,尽请期待~~
UDP 协议会根据上述数据报进行封装——添加 UDP 报头。
编辑
传输层协议最重要的就是给应用层数据报添加源端口和目的端口,此时端口可以认为是代表qq,添加报头本质上还是字符串的拼接。
关于UDP 协议的详细介绍可以参考博主的另一篇博客:站在程序猿的角度理解:UDP 协议_保护小周ღ的博客-CSDN博客
3. 传输层到网络层
网络层获取到 UDP 数据报后,会将其进行二次封装,添加 IP 协议报头,网络层最常见的协议就是 IP 协议。
编辑
源 IP 和 源端口号都是描述数据从哪里来。
目的 IP 和 目的端口号都是描述数据到哪里去。
4. 网络层到数据链路层
最典型的协议是——以太网 (数据链路层 + 物理层),同样也是会网络层数据报进行封装,也是字符串的拼接。 添加 以太网帧头,帧尾。
编辑
MAC地址是指 Media Access Control Address的缩写,又称为物理地址。它也是唯一的,可以理解为网卡的身份证。MAC地址是由6字节,48个二进制数表示的,通常用12个十六进制数表示。
MAC 地址诞生的原因跟 IP 地址一样,用于在计算机网络中识别设备,每个网络接口都有一个唯一的MAC地址,当年 IP 地址的创作者跟 MAC 地址的创作者是各自设计的,他们的目的是相同的,数据包能够在网络上正确地传输和路由到目的地。
MAC地址可以由网络设备生产商分配或者随机生成。在局域网中,当数据包从一个设备发送到另一个设备时,目标设备的MAC地址被用来确定数据包应该发送到哪个接口。
以太网数据帧尾(Ethernet frame trailer)是以太网数据帧的最后部分,它标志着该数据帧的结束。这个字段的长度是4个字节。数据帧尾包含两个字段:CRC和帧尾定界符(FCS)。CRC表示循环冗余校验码,用于检测数据帧是否受损;帧尾定界符是一个由16个1组成的特殊序列,用于告诉接收方数据帧的结束。
以太网数据帧尾是一个重要的组成部分,用于确保以太网数据帧能够正确地被发送和接收。
5. 数据链路层到物理层
到这里物理层要把从数据链路层传输过来的二进制数据转换成,光信号——光纤,电信号,电磁波信号等等进行传输。
上述过程除应用层以外,操作系统会自动帮我们封装好,封装好之后,自然是传输到各大运营商(移动联通啥的)的服务器上,我们联网的过程就是连接他们的服务器,访问服务器中的数据,服务器会根据我们请求的数据进行二次转发,以服务器为基准向目的主机发送(响应)信息,我们各个设备之间不属于网络直连的。
4.6 一条信息的分用
发送方发送数据,要把数据从下到上(TCP / IP 网络模型),从物理层到应用层以此交给对应层次的协议进行分用——解析。
设备接收信息刚好于上文反着来~~
1. 物理层设备、网卡接收到高低电平的信号
会接收到的信号进行解析,还原成二进制序列。
2. 物理层到数据链路层
当数据链路层接收到来自物理层的数据时,它会进行以下操作:
- 检查数据的完整性:数据链路层会检查数据是否有误码(parities)或差错,以确保数据传输过程中没有出现错误。
- 分帧:数据链路层会将接收到的比特流划分成数据帧,以便更好地进行管理和控制。
- 数据帧的序号确认:对于可靠传输的协议,数据链路层会确认已经正确接收到的数据帧的顺序和编号。
- 进行地址识别和转发:数据链路层会检查目标设备的地址,然后转发数据到目标设备或下一个跳点。
- 控制流量:如果必要的话,数据链路层会使用流量控制方法来限制数据的发送速率,以确保网络的稳定性和可靠性。
数据链路层负责管理和控制物理层传输的数据,确保成功的数据传输。
编辑
然后将数据帧提交给网络层。
3. 从数据链路层到网络层
当网络层从数据链路层接收到数据包时,会执行几个任务:
解封装:网络层将删除数据链路层头部和尾部,只留下IP头和有效载荷。
编辑
校验和验证:网络层将验证IP头的校验和,以确保头部没有错误。
路由:网络层检查IP头部的目标IP地址,并使用 IP 确定通过网络到达目标主机的最佳路径。
数据的传输不是单单直接从点 - 点的机制,而是中间有许多中转的设备。
完成这些任务后,网络层将数据包转发到适当的中转设备,以便将其传输到网络路由中的下一转发点,直到数据到达目标主机。
此时由网络层的 IP 协议对网络层数据报进行解析,去掉 IP 报头。
4. 从网络层到传输层
传输层在接收到网络层传递过来的数据时,会根据协议规定对数据进行相应的处理。其中最常见的是针对传输控制协议(TCP)和用户数据报协议(UDP)。因为数据报是由 UDP 协议封装的数据,所以解析的时候也应当使用 UDP 协议解析(分用)。
此时 UDP协议解析处理,凭借目的端口号来区分具体的应用程序(qq),每个联网的应用程序都需要关联一个端口号,然后去掉UDP 报头,取出荷载把数据交给应用层。
编辑
5. 传输层到应用层
数据在传输层的时候凭借端口号确定是那个应用程序接收(qq),所以此时由qq 这个应用程序解析数据。
编辑
此时如果这是一个字符串,相信大家有许多种方法能将字符串中的字段按照某种格式提取出来,有发送方,有接收方,有时间,有消息体,此时qq 就可以将解析的数据展示给用户界面。接收方qq的作用看似没用,实际在网络传输中用来确定,qq 服务器需要根据接收方的qq 找到入网登录的设备,这一点也是上文实例提到过的。
五、总结
两设备之间相互通信,发送方:层层封装,接收方:层层分用。
真实的网络环境中,数据的传输是非常复杂的,首先在整个互联网中确定主机IP 的位置就如同大海捞针,即使找到了,不见得有路线可以直达,所以数据的传输中间可能要经历很多节点的转发。
一台电脑入网,其入网设备会随机分配一个端口号,如果该电脑需要在网络上获取信息或发送信息,就需要使用一个外网 IP 地址,作为主机的“唯一”标识,在数据分层传输的时候会常常会使用中转的设备,例如:集线器,交换机,路由器,中继器等。
交换机:网络层设备
1. 将物理层的数据分用到数据链路层,过程中需要判断一下目的 MAC 是否准确,以及数据帧是否完整。
2. 交换机对数据链路层的数据进行封装,封装到物理层,继续转发数据。
路由器:网络层设备
1. 收到数据后会将数据直接从物理层分用(解析)到网络层,路由器属于网络层的设备,数据报在网络层会提供目的 IP 地址;,然后路由器根据目的 IP 进行下一阶段的寻址操作,IP 地址在一边传输的过程中,一边规划路径,此时源 IP 会被替换成该路由器的 IP 的地址,而原先的源 IP 地址会被路由器存储,新旧、源IP 之间形成映射关系,如果路由器进行下一阶段的寻址操作中发现前方道路无法到达目的 IP, 就会回头到 父节点,换一条路继续寻址。
2. 将拿到的传输层数据报从网络层封装到物理层,经过数据链路层的时候,也会调整 MAC 地址,数据到达这个目标主机,才会从物理层分用到应用层。
在网络通信中 ,以上叙述:二层和三层转发是两种不同路由的方式。
二层转发基于物理地址进行转发,也被称为MAC地址转发。当计算机在局域网内发送数据时,数据包会被发送到目标计算机的MAC地址上。这个过程不需要路由器的帮助,因为所有的设备都连接在同一个子网内。
三层转发则基于网络层协议,如IP地址,对数据包进行路由。当计算机发送数据包时,路由器根据目标地址将数据包传输到适当的网络。如果数据包需要跨越多个网络,则路由器将选择最佳路径进行转发。这个过程需要路由器的帮助,因为路由器可以为不同的网络提供连接。
二层转发适用于局域网内部的通信,而三层转发适用于不同网络之间的通信。
到这里,网络编程中的 TCP / IP 五层网络模型博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。
编辑
本期收录于博主的专栏——JavaEE,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“JavaEE基础知识”。
下期预告:UDP 协议
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
遇见你,所有的星星都落在我的头上……
注:本篇博客主要为基础概念知识,多有借鉴之处,如有不妥请联系修正。