前言
本篇博客将详细初步介绍网络通信
🖥 文章专栏
若有问题 评论区见
🎉欢迎大家点赞👍收藏⭐文章
一.网络通信基础
网络互联的目的是进行网络通信,也就是网络数据传输,更具体⼀点,是⽹络主机中的不同进程间,基于⽹络传输数据。那么,在组建的⽹络中,如何判断到底是从哪台主机,将数据传输到那台主机呢?这就需要使⽤IP地址来标识。
1.1 IP地址
IP地址用于定位主机的网络地址
在生活中:山西省,运城市...
在计算机中:使用一个32位,4字节数字,来表示地址
一般来说,IP地址会表示成4个0-255之间的十进制数字,并使用3个点进行分隔
比如:192.168.2.102
1.2 端口号
端口号用于定位主机中的进程(也就是主机中的软件),说白了就是区分一个主机上不同的应用程序的。
端口号是一个整数(2个字节,相对较小的数字),值得注意的是,不同的程序可以绑定到不同的端口号,要求同一个主机上的不同应用程序不能绑定到同一个端口号
(一个端口号只能被一个被一个程序绑定,但是一个程序可以绑定多个端口)
注意!:
2字节=>0~65535
0一般不使用
1~1023这个范围的端口号,系统留作特殊用途,咱们自己写的程序不应该占用此范围的端口号
还有一些知名的端口号,留改一些常见的服务器程序进行使用
22=>ssh
80=>http
443=>https
23=>teInet
在实际的通信过程中,IP和端口号往往是“一对”
像我们在购物软件上购买/贩卖商品,有两个最重要的信息要填写收件人地址/收件人电话,发件人地址/发件人电话
1.3 协议
网络协议是网络通信所经过的所有网络设备都必须遵守的一组约定,规则,最终体现为在网络上传输的数据包的形式.
为什么需要协议呢?就好⽐⻅⽹友,彼此协商胸⼝插⽀玫瑰花⻅⾯(避免见错网友),这就是⼀种提前的约定,也可以称之为协议。
1.4 五元组
一次通信过程中必不可少的信息~
1. 源IP:标识源主机
2. 源端⼝号:标识源主机中该次通信发送数据的进程
3. ⽬的IP:标识⽬的主机
4. ⽬的端⼝号:标识⽬的主机中该次通信接收数据的进程
5. 协议号:标识发送进程和接收进程双⽅约定的数据格式
1.5 协议分层
在阅读代码时,如果这个代码比较多比较长,脑子阅读起来就会更加吃力,但是如果把代码拆分成多个方法,同一时刻,你只需要关注一个方法,不需要考虑其他的方法,此时我们脑子里维护的信息减少了,就能更容易看懂代码了.
在网络通信中也是这样,网络通信实在是太复杂了,拆分就拆出来太多的小的协议,这么多的协议也就不好管理,就需要对协议进行分层管理了。
并且按照协议的定价/作用进行分类,约定了不同层次之间的“调用关系”,“上层协议,调用下层协议”“下层协议给上层协议提供支持”
在公司中就有这样的协议:
在我们的网络通信中:
在协议分层后,还有一些其他的好处
1.协议分层后,上层和下层彼此之间就进行了封装,使用上层协议,不必过多关注下层,使用下层协议,也不必过多关注上层
2.每一层协议都可以根据需要灵活变更
1.6 OSI七层模型
OSI 七层模型既复杂⼜不实⽤:所以 OSI 七层模型没有落地、实现。实际组建⽹络时,只是以 OSI 七层模型设计中的部分分层,也即是以下 TCP/IP 五层(或四层)模型来实现。
大多出现在学校的课本上,所以我们只进行一些简单的了解
1.7 TCP/IP5层协议
TCP/IP5层协议也就是 OSI七层模型的简化版本
1.物理层:描述的是网络通信的硬件设备
描述的是网络通信的硬件设备,好比基础设施,公路,铁路...,比如使用的网线,光纤应该是什么规模的
2.数据链路层:两个相邻节点的数据传输情况
如果我从黑龙江省哈尔滨市去山西省运城市,我把路线确定了——哈尔滨=>石家庄=>太原=>运城,接下来就需要考虑每一步怎么走,也就是相邻节点如何传输
哈尔滨=>石家庄 :绿皮火车
石家庄=>太原 :复兴号高铁
太原=>运城 :和谐号高铁
3.网络层:进行路径规划
我从黑龙江省哈尔滨市去山西省运城市,可以有多种路径选择
哈尔滨=>运城
哈尔滨=>石家庄=>运城
哈尔滨=>石家庄=>太原=>运城
4.传输层:关注起点和终点
在网上买了件衣服,站在我的角度,我只关心发货地址与收件地址
5.应用层:如何使用数据(程序员最需要关注的一点)
我买了一个床刷子,可以刷床,可以刷沙发......
1.8⽹络设备所在分层
• 对于⼀台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四
层;
• 对于⼀台路由器,它实现了从⽹络层到物理层,也即是TCP/IP五层模型的下三层;
• 对于⼀台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
交换机的作用:是针对路由器的端口进行扩展,路由器上的端口是有限的
• 对于集线器,它只实现了物理层;
集线器:把网线一分为二了
1.9 封装与分用
封装与分用描述了网络通信过程中,基本的数据传输流程
举个栗子:用户A通过QQ把一个hello发送给用户B
发送方:
1.应用层
QQ应用程序会把输入的hello给打包成一个应用层的数据报,假设是按照这样的格式(我自己瞎写的)
四个字段使用来分割,这里就构成了一个简单的应用层数据报(字符串拼接),上述描述的规则就是此处我们约定的应用层协议,具体使用几个字段,字段的顺序,使用什么分隔符,都是可以灵活调整的(应用层协议,往往是根据具体的场景,具体的需要,由程序员自主决定的)
最后把应用层数据包通过操作系统的api,把数据交给传输层。
2.传输层
要对应用层传来的数据报在进行打包,变成数据层的数据报~~
这里的打包过程,本质上还是“字符串拼接“,把应用层数据再拼接上传输层的报头,
传输层典型的协议有,TCP,UDP,在传输层中一个数据报=报头+载荷,报头中最关键的信息就是“源端口”和“目的端口”
传输层数据报完成后,这个数据就会交给网络层。
3.网络层
网络层的最主要的协议就是IP协议
在IP报头中最重要的就是源IP和目的IP
网络层的数据打包好了之后,继续把数据交给“数据链路层”再进一步的打包
4.数据链路层
在以太网的报头中最重要的信息就是源mac地址,目的mac地址
(mac地址:用来描述一个设备在网络上的地址)
再把这个数据交给物理层
5.物理层
把接收到的数据,转换成2进制的0 1序列,通过光电信号进行传播
从上层协议到下层协议层层给数据报添加报头,这个过程称为“封装”
数据发送出去之后,就会经过一系列的交换机和路由器进行转发,A和B一般来说不是直接网线连接的,中间还要经过很多交换机/路由设备进行转发
当数据到达B之后,B就要对上述数据进行“分用”(针对上述数据进行层层解析)
接收方:
1.物理层
拿到的光电信号 =>转换成二进制数据=>得到以太网数据报,这个数据要交给数据链路层对应的协议处理
2.数据链路层
通过以太网协议,针对以太网数据报进行解析
这个解析过程就会解析出 报头 和 报尾. 以及中间的载荷把载荷部分,进一步的再交给网络层的协议来处理
3.网络层
IP 协议,再进一步的针对网络层数据报进行解析.去掉报头,拿到载荷,再进一步把载荷数据交给上层 (传输层)
4.传输层
此处使用 UDP 协议,针对这个数据报进行解析,拿到载荷,去掉报头,把载荷数据进一步的交给上层 (应用层了)
根据端口号来区分把数据交给哪个应用程序
5.应用层
QQ 这个程序就要进一步解析这里的数据,这个解析过程也就是按照前面程序员自定义的应用层协议来展开的,
数据报在网络中间还会经历一定的转发过程
如果经过路由器: 就会封装分用到网络层,路由器解析到网络层,拿到 IP 地址,决定进一步如何传输.下一步传输的时候,又会重新经过网络层,数据链路层和物理层的封装
如果经过交换机: 就会封装分用到数据链路层。