前言
hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
从这篇博客开始进入到网络通信部分的解析,这部分知识内容是非常多的,
这篇博客会解析一些网络通信的基础内容,包括:计算机网络的发展背景、网络通信中的术语、TCP/IP五层模型的基础解析
🎆个人主页:洋不写bug的博客
🎆所属专栏:JavaEE学习
🎆铁汁们对于JavaEE的各种常用核心语法,都可以在上面的前端专栏学习,专栏正在持续更新中🏀,有问题可以写在评论区或者私信我哦~
1,网络发展背景
网络的发展过程还是比较有趣的,这部分铁汁们可以当成小故事来看
在19世纪末到二战结束这段时间,最先进的通信方式基本上就是电话和电报60年代初美苏冷战持续升级,美国军方开始推进世界上第一个计算机网络------阿帕网(APRA)的研发

当时搭建的网络,节点(设备)和节点之间的连接关系是错综复杂的,有很多的冗余路径,这样设计的好处就是一个节点要跟另一个节点通信,有多条路径能走(可以用其他节点作为数据中转站),这样能够在遭受核打击时,就算部分节点损坏,网络整体的通信功能不至于瘫痪

冷战结束前后,计算机开始快速的发展,大概是2000年,国内计算机开始大规模出现,但是此时的计算机大多是没有网络的,玩游戏也只能玩单机游戏

在2003年之前,在网吧中玩游戏,如果想要跟真人玩家对抗,需要通过局域网,基本上只能跟同网吧的玩家联机对战,原理就是通过网线把要联机对战的计算机连接到一台交换机上,交换机传输交换数据,让两台计算机能够联机

比如网吧中的六台机子想要联机PK一下,就把这六台机子通过网线连到交换机上,六台机子可以相互传输数据,整体就构成了一个局域网

2003年之后,网吧开始逐渐接入互联网,越来越多的游戏能够全国联机,但是初期网络可能时常有卡顿
前面提到通过交换机将设备连接起来,组成一个局域网,就可以通过路由器将这些局域网连接起来,构成一个更大的网络;再通过一个更大的路由器,把这些大的网络再连接起来,这样以此类推,就构成了广域网,如下图

这个广域网和局域网只是相对的概念,一般一个机房,或者一栋楼中搭建的网络就是局域网;连通一座城市、或者连通一个省,就是广域网
最大的广域网就是互联网,互联网是把世界上无数个局域网连接在一起,进行全球通信
2007年,乔布斯发布初代iPhone,是移动互联网时代的标志性起点,移动互联网的核心特征:互联网不再绑定台式电脑,而是随时随地,由随身便携智能终端(手机)接入网络。

2010年,乔布斯发布iPhone4,把智能手机带入成熟时代,相比之前的手机可以说是全面升级

此后安卓系统也开始崛起,三星、华为、小米手机接踵而至,手机开始蓬勃发展,也进入了程序员的黄金时代,因为很多app都需要程序员来开发
2,网络基础
1,IP
在JDBC连接mysql数据库时(代码如下),jdbc:mysql://127.0.0.1中的127.0.0.1就属于是IP地址
java
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3308/first_database?characterEncoding=utf8" +
"&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");
IP地址作用就是区分网络上的设备,原则上是希望每个设备都有唯一的IP地址(实际会复杂一些,这个具体会在后面网络通信部分博客详细解析),铁汁们可以用下面的这个链接查询下自己的IP地址,IP跟上网地区是强相关的,通过IP大概就能知道在哪个地区,但肯定是没法精确定位的
IP地址是用32位二进制来表示的,为了方便显示,一般把32位IP地址划分成4个部分,每个部分8位,显示的时候用十进制显示的,8位二进制,十进制的范围就是0 - 255
IP地址就类似于网购时的收货地址,例如河南省 洛阳市 洛龙区 河南科技大学
2,端口号
端口号是为了区分设备上的不同应用程序,因为设备之间传输数据,要搞清楚是哪个程序要接收的
在jdbc编程中,连接mysql数据库时,3308就是博主计算机mysql的端口号
IP地址就是收件地址,就像快递,单凭收件地址,不一定能保证送到接收方手中,还要有电话号,快递员送到附近时打电话联系下接收方这个端口号就和电话号的功能类似,保证数据精准的送到接收方手中
3,协议
网络传输数据有三种方式:
- 光信号,通过光纤传播,在光纤中传播激光,通过调节光的幅度、相位、偏振,来表示0/1
- 电信号,通过网线传播,通过高低电平表示0/1,电平是人为规定的电压区间代表的逻辑状态,用来表示 0 或者 1
例如3.3V单片机,规定2.0V ~ 3.3V为高电平(逻辑 1),0V ~ 0.8V → 低电平(逻辑 0) - 电磁波,连接WiFi传输信息就是通过电磁波,通过调节电磁波的频率、幅度、相位来表示0/1
那在传播时要提前制定好一些规定,比如怎样表示0,怎样表示1(例如2.0V ~ 3.3V为表示1,0V ~ 0.8V表示0),这些规定就是协议(协议涵盖的内容非常多,包括01串里面哪部分是数据,哪部分是IP地址等等,还是比较复杂的)
4,五元组
进行一次通信,需要5个信息:源IP、源端口、目标IP、目标端口、协议类型,这5个信息就称为五元组
这个还是可以类比快递来理解:发件人地址(源IP)、发件人电话(源端口)
收件人地址(目标IP)、收件人电话(目标端口)
走的快递类型,例如圆通/顺丰/申通(协议类型)
3,分层管理
由于网络通信是一个很复杂的过程,所以如果只用一个协议来描述,这个协议就会特别复杂,因此就把网络通信拆分为多层,每层有每层的协议(数据传输规则),每层负责特定的内容,每层不需要关心其他层的协议
这样做还可以解耦合,灵活的对协议进行替换
拿电话机类比下,分为语言层和通信设备层,语言层有汉语协议,通信设备层有电话机协议

对于通信设备层来说,是不关心语言层的协议,不管语言层是汉语协议,还是英语协议,都无所谓,通信设备层只需要通过电话机协议传播语音信号即可

同时,语言层也无需关注通信设备层的协议,假如通信设备换成了对讲机,采用无线电协议,对语言层来说,这个语音信号靠什么协议传播是无所谓的,只需要确保对方能听懂我的语言即可

如下图,对于分层,比较经典的就是OSI参考模型,分成了7层,这个分层特别详细,但是OSI因为分层过于繁琐,以及协议设计复杂原因,在实际使用上已经基本上被淘汰了,现在主要在教学上使用
在实际开发中,使用的是TCP/IP模型,更加简化

对于TCP/IP模型来说,很多时候为了教学方便,会将底层的网络接口层拆分为物理层和数据链路层,拆分成5层的体系结构
从下到上依次是物理层、数据链路层、网络层(网际层)、传输层(运输层)、应用层
这里解析TCP/IP模型,也是按照拆分为5层来解析,在解析时也会类比快递运输:
- 物理层:也就是网络通信中依赖的硬件设施,例如网线、光纤、天线(这些东西和程序员关系不大,通信专业的铁汁可能会比较了解这部分内容🐵)
- 数据链路层:负责两个相邻节点(前面画的广域网的图中,各局域网和路由器的通信,局域网路由器和大路由器的通信,都属于两个相邻节点的通信)之间的通信,通过网线/光纤/无线信号/直接相连两个设备
- 网络层:负责两个节点之间的路径规划
- 传输层:不关心中间的传输过程,只关心传输的起点和终点
- 应用层:也就是数据到了应用程序中,数据如何处理,需要程序员来写代码
这个用网购快递的过程来类比,就很好理解,从应用层开始:
- 例如在网上买了一个本子,那这个本子买回来怎么用,用来记东西或者用来垫桌子,这是我们自己决定的,卖家和快递公司是不关心这些东西的,如何使用就是应用层
- 传输层就相当于是我们和卖家,我们关心这个本子是从哪里发过来的,来推断物流时间;卖家只关心我们的地址,要在发货单上打出来
- 网络层就相当于快递公司通过发货地址和收获地址来规划运送路线,例如从北京到洛阳,那就可以拆分为北京 -> 郑州 -> 洛阳
- 数据链路层负责相邻两个节点的通信,例如从北京到郑州,用火车运输,从郑州到洛阳,用货车运输
- 物理层就相当于是快递运输中,公路/铁路这些基础设施
- 对于计算机的主机而言,它的操作系统实现了从传输层到物理层的内容,也就是TCP/IP五层结构的下四层
- 对于路由器,它实现了从网络层到物理层,也就是TCP/IP五层模型的下三层
- 对于交换机,它实现了从数据链路层到物理层,也就是TCP/IP五层模型的下两层
在实际情况中,路由器和交换机的界限越来越模糊了,一些路由器的功能,交换机也有,交换机的功能,路由器也有。
就拿5层的TCP/IP结构来看,分析下发送信息时,这5层是如何运转的,假设是在QQ中发送信息
-
用户在聊天对话窗口的打字栏中输入hello,并点击发送,QQ程序就能获取到这个要发送的"hello"字符串,把这个"hello"按照一定的协议构造成应用层数据包(不同软件构造应用层数据包的协议可能不一样的,这个是程序员自己定义的)
假设QQ的应用层数据包格式为:发送者id + 接收者id + 消息的发送时间 + 消息的正文,假设发送者id是1234,接收者id是5678,如下图,接着通过系统的API(函数式接口),把这个数据包交给下一层(传输层)

-
传输层接收到来自应用层的数据包,按照传输层的协议,构造出传输层数据包,传输层的协议主要为TCP和UDP(后续博客详细解析)
假设这里采用的是UDP协议,那就在应用层数据包的前面加个UDP报头即可,报头中的内容主要是源端口号和目的端口号,应用层数据包部分作为UDP的载荷,UDP数据包由报头 + 载荷组成(如下图),传输层把构造好的传输层数据包,调用对应的API,交给网络层

- 网络层最主要的协议就是"IP协议",IP协议会在传输层数据报的基础上,加上IP报头(如下图),接着把数据包传输给数据链路层,网络层是总领整个通信的,源/目的IP就是起点和终点

- 对于不同的联网方式来说,数据链路层的协议是不同的,如果是插网线,就是以太网 Ethernet协议;如果是连接WiFi,就是802.11协议;像手机的5G网络通信,就用到了不只一个协议
假设是以太网 Ethernet协议,就是在IP数据报的基础上拼接上以太网帧头和帧尾,数据链路层只负责相邻节点的数据传输,帧头中的内容是源/目的MAC地址,作用是在局域网内部寻址,找下一跳设备,每经过一台设备,链路层帧拆除重封装,目的 MAC 就会改变
数据链路层再把数据包传输给物理层

- 到物理层,就把数据包转化为0101这样的二进制数据,转换成光信号/电信号/电磁波,通过物理介质,传输出去
发送方这个过程是封装数据,接收方就是拆除数据,接收方拆除数据过程如下:
- 物理层收到光电信号,把光信号转换成0101数字信号,交给数据链路层
- 数据链路层,就拿以太网协议来说,就会去掉帧头和帧尾,取出载荷,进一步交给网路层
- 网络层取出IP报头,对IP进行解析,把剩下的数据交给传输层
- 传输层,取出UDP报头,进行解析,把剩下的数据交给应用层
- 应用层,QQ应用层对数据报进行解析,按照约定好的协议读取发送时间,内容,以及发送方,在接收方的QQ弹窗中显示消息,显示发送时间,发送方,发送内容
4,丢包
丢包就是数据在传输过程中丢失了,那数据为什么会丢失呢?
发送方发送数据给接收方时,数据会经过中间的很多节点(交换机、路由器),这些节点作为数据的中转站
就类似于快递公司把快递送到下一个中转站,到了中转站,需要卸货,再重新打上标签,发往下个中转站(或直接发到用户手中)

这些中间的路由器/交换机是给很多主机提供服务的,但是主机使用网络的时间是具有随机性的,可能有个时间段,中间的某个节点需要传输的数据量特别大,超出了设备传输数据速度的上限,这时候就会出现丢包的情况
在不同情况下,对于丢包的处理也不同
- 传输文件时出现了丢包,那就要重新传输丢包的数据
- 看直播时,出现了丢包,画面会卡顿下,这时候丢包的数据是不需要重传的,因为直播是实时的,这2s画面卡顿了,后面尽量不丢包就行,总不能用户又看了一会了,前面丢包的数据重新传过来了,让用户再看一遍😅
结语💕💕
- 这部分内容可能很多铁汁在学校开设的计算机网络中都已经学习过了,属于是最基础的内容,但是在408,就业面试中都会考到,还是比较重要的
- 前面提到了传输层的主要协议就是TCP/UDP协议,这两个协议有什么区别,分别如何写代码来实现网络编程,会在后面博客中进行详细的解析
以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

🎆个人主页: