个人主页:兜里有颗棉花糖
欢迎 点赞 收藏✨ 留言✉ 加关注本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】【Java系列】
本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论
ip地址简单来说就是用来描述网络上一个设备的所在位置。
端口号用于区分一个主机上不同的应用程序。
一个网络程序在启动的时候都需要绑定一个或多个端口号,后续的通信过程都需依赖端口来进行展开的。
网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则(协议就只是表示一种约定,然而这种约定可以是任意的),之所以有统一的协议标准以便大家可以相互通信。
网络通信是一个非常庞大的工作,其中会涉及到一系列非常繁琐,非常细节的工作,靠一个协议解决所有问题说明这个协议非常庞大。因此我们就需要对协议进行分类
(把功能差不多的协议放到一起)、分层
(上层协议调用下层协议,下次协议为上层协议提供支持,以避免跨层级所引起的混乱);另外上层协议不需要了解下层协议的细节(封装),我们可以灵活的调整替换某层协议。
协议分层就是为这些协议明确层级关系,避免跨层之间的交互,降低耦合,提高整个系统的稳定性。
协议分层有两种主要的方式:一种方式是OSI七层网络模型(目前只是在教科书中提到,在真实世界并没有对其进行应用),另一种是TCP/IP五层网络模型。
网络数据传输的基本流程总结起来就是:封装和分用。
我们现在通过QQ发送消息为例来描述网络数据传输的基本流程。即主机A通过QQ把消息发送给主机B:
应用层方面:首先QQ这个应用程序先从输入框中获取到输入的信息,并将其构成应用层数据报
(当然这里是根据应用层协议去进行数据报构造的,构建的应用层数据报的过程是按照一定的格式进行字符串拼接的)。这里我们要知道不同的应用程序使用的应用层协议是不同的,而其中很多一部分的应用程序会自定义应用层协议。当应用层数据报准备好之后,应用程序就会调用传输层提供的接口,然后把上述的数据报交给传输层去进行处理。
传输层方面:传输层的协议有很多,最主要的协议就是TCP和UDP。此处我们这里假设使用的协议是UDP。当应用层把应用层的数据传到了传输层之后,并交给UDP,UDP会把应用层数据当作一个字符串,并构造出UDP数据报,然后把UDP数据报进一步的交给网络层。
网络层方面:网络层最主要的协议就是IP协议。IP协议会根据自己的格式来构造出IP数据报。IP协议并不关心IP数据报的载荷是啥,只是单纯的把IP数据报载荷当作一个字符串,在这个基础上拼接一个IP报头以获取更大的字符串。
注意,源ip和目的ip都是在ip报头中,而源端口和目的端口都是在UDP报头中
一次通信往往包括这5个信息:源IP、目的IP、源端口、目的端口、协议类型。此五点称为网络通信的五元组
。
之后对数据进一步传输,即把数据传输到数据链路层。
数据链路层
:数据链路层比较重要的协议就是以太网协议。以太网(平时上网插入的一个网线,这根网线就遵守以太网协议)又会针对IP数据报进行进一步的封装,即在IP数据报的基础上加上数据头
和数据尾
。以太网依然不关心载荷是什么,以太网只是把载荷当作字符串,进一步的拼接上枕帧头帧尾以构造成以太网数据帧
。至此,上述的数据还需要交给物理层。物理层
:物理层这里就涉及到硬件设备了(比如网卡)。之前的以太网数据帧本质上是二进制的数据,这个时候硬件设备就需要对上述的数据进行转换(由物理层的这些设备把上述的数据转换称光信号、电信号、电磁波等)
至此,主机A就完成了发送过程。即上述的过程是主机A,即发送消息方的情况。
现在来看接收方(即主机B)的情况:
物理层
:硬件设备(如网卡)接收到光信号、电信号、电磁波。需要把接收到的信号解调(调制:就是把我们要传输的信息放到光电信号中
;解调:就是把光电信号中的信息提取出来
;还有一个叫做调制解调器【俗称猫】,调制解调器就是负责调制和解调的硬件设备:光猫就是针对光信号进行调制解调的
),解调之后我们就可以得到0101这样的二进制数据序列,这个序列就是以太网数据帧。此时我们经过解调得到的信息就会交给上一层,即交给数据链路层。好了,下面来看数据链路层的方面。数据链路层
:数据链路层得到来自硬件设备解调出来的信息之后,数据链路层的以太网协议就会按照以太网数据帧的格式对信息进行解析。解析之后,就来到了网络层。下面来看网络层。网络层
:ip协议会对从数据链路层那里得到的数据报进行解析(去掉ip报头,取出载荷部分的信息并将其交给传输层),好了现在就来到了传输层。传输层
:传输层会根据ip报头中的字段就知道当前这个载荷是一个UDP数据报,并将该数据报交给UDP处理。然后UDP也会针对这个数据报进行解析(即去掉报头,取出载荷),然后进一步交给应用程序。好了,现在来到了应用程序层。应用程序层
:UDP报头中有一个字段是目的端口,然后根据目的端口找到关联的应用程序,然后把数据交给应用程序即可。此时QQ程序就会按照QQ的应用层协议对数据进行解析,进一步把这里的数据显示到界面上。更进一步的此时我们的QQ头像就一直进行闪烁。至此,主机A从上到下依次添加报头的过程称为封装。主机B从下到上依次解析报头的过程称之为分用。每次网络数据的传输都会经过封装和分用这样的过程。
我们可以简单理解:封装就是在打包快递,而分用就是在拆快递
。封装和分用相互配合,就可以完成数据的传输。上面的描述是针对消息发送方和消息接收方的进行分析的。
然后主机A和主机B之间还会有很多交换机和路由器进行转发。
消息转发到某个设备(即中间过程的交换机和路由器)时,每个设备的处理流程和上面封装分用是一样的
。如果是交换机的话,交换机封装和分用到数据链路层即可。交换机解析出以太网数据帧之后,就会进一步获取到帧头中的mac地址(交换机通过在以太网数据帧中查找目标MAC地址来实现数据的转发),然后根据mac地址查询到交换机内部的转发表,然后接下来决定数据从哪个网口发出,在发送之前又会把以太网数据帧封装好。
(我们举个栗子来更好的理解交换机这里,比如我们拿到一个快递之后,打开快递盒子并查看其中的标签以便我们可以知道这个快递发往哪里,之后我们得知快递发往哪里之后我们把这个快递盒子重新封装起来即可)
路由器则是封装分用到网络层即可。即先从物理层中解析出以太网数据帧(以太网数据帧是计算机网络中物理层和数据链路层之间的数据传输单位;计算机设备之间的通信都是通过以太网数据帧进行的),然后再去交给网络层(即交给ip协议)解析出ip数据包,进一步获取到ip报头,然后根据ip报头来进一步规划接下来的路线(不要忘记网络层的任务就是规划路线,而数据链路层的任务就是当路线确定好了之后再来确定我们应该怎么走;由此可以看到数据链路层和网络层是相互配合的),确定好路线之后,接下来又会把数据进行重新封装然后转发。
注意
:上述的交换机路由器只是经典的交换机路由器,而现在的交换机路由器可以做到更多的事情,比如有的现代的交换机路由器很有可能封装分用到应用层
。