目录
1. 网络通信原理
1.1 IP地址
概念:IP 地址简单的来说就是 用于定位主机的网络地址。
就比如:在网络上进行购物的时候,需要购买者的地址,进行准确的发货一样的道理。这里的 购买者地址就相当于是 IP地址
格式:IP 地址的格式是一个32位的二进制,通常被分割成4个 “8位二进制”(4字节)。
通常使用 “点分十进制” 的方式表示,即 a.b.c.d (a,b,c,d都是0~255之间的十进制整数)
1.2 端口号
概念:在网络通信中,端口号可以表示主机中发送数据、接收数据的进程。
简单来说:端口号用于定位主机中的进程。
类似进行网络购物的时候的,需要填写的收货人似的,这个收货人就相当于是 端口号
格式: 端口号是 0~65535 范围的数字。
1.3 认识协议
概念:协议即是网络协议的简称,网络协议就是网络通信经过的所有网络设备都必须遵从的 一组约定、规则。比如怎样建立连接、怎样互相识别等等。只有遵循这个约定,计算 机之间才能进行通信交互。
协议: 最终体现为网络上传输的数据包的格式。
简单来说就是: 网络协议就是通信双方对于发送或接收 数据格式的约定。
为什么需要协议?
这就像使用的那个插排一样,制作插排的商家有许多,如果每一个商家制作的插排接口不一样的话,那么就很麻烦了,无法进行统一,使用上就存在很多的麻烦。像现在插排大多数都是2口或者3口的,那么使用起来就方便许多,那么这个就是协议,也是定义协议的好处。
那么在计算机的 网络通信中协议就非常重要了,通常是多个主机设备进行通信的,所以只有当多个主机设备都能认同并且遵守同一套协议,此时通信才是有意义的。
1.4 五原组
在TCP/IP协议中,使用五元组来标识一个网络协议:
1. 源IP:表示源主机
2. 源端口号:表示源主机中该次通信发送数据的进程
3. 目的IP:表示目的主机
4. 目的端口号:标识目的主机中该次通信接收数据的进程
5. 协议号:表示发送进程和接收进程双方约定的数据格式
这个五元组非常像发送和签收快递的过程。
收件地址就是目的IP;收件人就是目的端口号。
寄件地址就是源IP;寄件人就是源端口号。
而最后的协议号就像是寄快递的顺丰或者圆通等快递。
1.5 协议分层
对于网络协议是非常复杂的。如果设计一个协议,来完成网络通信中所有的问题,那么势必会使这个协议非常庞大,这时候就可以将这个协议进行拆分操作。
把一个大的协议,拆成若干个小的,功能单一的协议。
但是又存在一个问题,小的协议太多了,甚至几百个,那么就非常麻烦了,这时候就可以将这些小的协议进行归类处理,达到一个分层的效果。
1.5.1 分层的作用
分层最大的好处,类似于面向接口编程: 定义好两层间的接口协议,让双方遵循这个规范来对接。
分层之后,只有相邻的两层协议之间可以进行交互。
上层协议可以调用下层协议,下层协议可以给上层提供服务。
注意的是: 协议之间的交互,不能夸层进行。
对于上层来说,并不关心提供方是如何实现的,只需要使用接口即可。
对于下层来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。
尤其是: 分层之后,可以灵活的替换其中的某一层。对于整体的工作过程呢影响非常小。(解耦合)
1.5.2 OSI七层模型
这里只是一个简单的介绍:
分层名称 | 功能 | |
7 | 应用层 | 针对特定应用的协议 |
6 | 表示层 | 设备固有数据格式和网络标准数据式的转换 |
5 | 会话层 | 通信管理。负责建立和断开通信连接。管理传输层以下的分层 |
4 | 传输层 | 管理两个节点之间的数据传输。负责可靠的传输。 |
3 | 网络层 | 地址管理和路由选择 |
2 | 数据链路层 | 互联设备之间传送和识别数据帧 |
1 | 物理层 | 以0,1代表电压的高低,灯管的闪灭,界定连接器和网络的规格 |
这个OSI七层模型在网络上来说是一个非常复杂的一个结构,在真实的互联网中,不使用这个模型使用 TCP/IP五层(或四层)模型,这个模型在下面进行介绍。
1.5.3 TCP/IP五层(或四层)模型
TCP/IP 通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
分层名称 | 功能 | |
5 | 应用层 | 负责应用程序间沟通,如简单电子邮件传输、文件传输协议、网络远程访问协议等。网络编程主要就是针对应⽤层。简单来说就是对于从传输层拿到的数据怎样进行使用。 |
4 | 传输层 | 也是两个任意设备之间的通信,但是不考虑中间过程,只考虑起点和终点。 |
3 | 网络层 | 完成两个任意设备之间如何进行通信,这两个设备之间可能隔着很多的交换机和路由器。(就像是上课将纸条转给教室中的另一个同学,中间可能隔着很多人。) 这两个设备之间,可能隔着很多的交换机和路由器,考虑通讯的中间过程 网络层传输的时候,基于数据链路层的 |
2 | 数据链路层 | 完成两个相邻的设备之间如何进行通信的。(就像是上课和同桌传纸条。) 数据链路层是基于物理层的 |
1 | 物理层 | 物理层规定了网络协议中的一些硬件设施符合的要求。比如网线、wifi、光纤的约定要求。 |
这个五层模型就像是在网上购物一样,在淘宝买了个物品。
客户拿到物品只是关心物品买到之后,要如何使用 -> 应用层
卖家只关心,买家所输入的信息,也就是收件人信息 -> 传输层
物流公司则关心,包裹是怎样路径传输的 -> 网络层
快递小哥/货车司机,考虑的是相邻节点的传输过程 -> 数据链路层
但是通常来说物理层考虑的比较少。因此很多时候也可以称为TCP/IP四层模型。
使用图片进行详细了解:
1.5.4 网络设备所在分层
主机:工作过程涉及到 从物理层 -> 应用层 (通过应用程序满足网络通信的需求)
路由器:工作过程涉及到 从物理层 -> 网络层 (组建局域网,进行网络数据包的转发)
交换机:工作过程涉及到 从物理层 -> 数据链路层 (对路由器的接口的扩展不需要考虑组网的问题)
1.6 网络数据通信的基本流程
使用 qq 发送信息来进行举例,通过qq 发送一个 hello 信息
1.6.1 封装(从上层往下层)
1、应用程序 获取到用户输入。构造一个应用层的数据包。(网络传输的数据本质上是"字符串"或者"二进制的 bit 流")
这个应用层数据包 就会遵守 应用层协议(这个往往是程序员自己定义的)
假设约定的格式为 发送者的qq号,接受者的qq,消息的时间,消息正文。
2、应用程序调用 传输层 提供的接口(API),把数据交给传输层。
传输层拿到数据之后,构造出"传输层数据包"。传输层的协议,主要是两个: TCP、UDP
3、传输层构造好数据之后,继续调用网络层的api,把传输层的数据包交给网络层。
网络层继续处理,网络层最主要的协议为IP 协议,继续对其传输层的数据包进行加工。
4、IP协议继续调用 数据链路层的 api,把IP数据包交给数据链路层。会变成二进制数据
数据链路层中,核心协议 "以太网",以太网这个协议,也是网络层数据包的基础上进一步加工
5、以太网继续这样的数据交给硬件设备(网卡)
网卡会把上述二进制数据,最终以 光信号/电信号/电磁波信号 传播出去了(这样数据终于发出了)
正常来说 网络传输的基本数据单位设计到多个术语。
网络数据包 IP使用的。网络数据段 TCP使用的。网络数据报 UDP使用的。网络数据帧数据链路层 以太网数据帧。
数据传输的中间部分就不讨论了,直接看接收到数据之后进行的处理。
1.6.2 分用(从下层到上层)
1、数据到达接收方的网卡,光电信号,将其数据还原成二进制
把二进制数据交给上层数据链路层。
2、数据链路层按照以太网协议进行解析
把报头和报尾取出来,剩下的载荷,往上传递给网络层。
以太网的帧头中就有专门的属性,描述了网络层使用哪个协议。
3、网络层拿到这个数据之后,按照IP协议的格式解析。在把载荷数据交给传输层。
IP 报头中也有专门的属性,描述了传输层使用哪个协议
4、传输层拿到数据之后,也有类似,按照TCP协议来解析,取出载荷,交给应用层
传输层报头中,通过目的端口号,告知数据交给哪个应用报告程序。
5、qq应用程序,解析应用层数据,拿到关键信息,展示到界面上,给出提示
不同的应用程序,自然使用不同的应用层协议来解析
这就是分用的过程了。
2. Socket套接字
2.1 概念
Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。Socket就是传输层给应用层提供的API接口
2.2 分类
Socket套接字主要针对传输层协议划分为三类:
2.2.1 原始套接字
原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。这个不需要学习。
2.2.2 流套接字
这个 流套接字 是使用于传输层TCP协议。
TCP为传输层协议的特点为:
● 有连接
● 可靠传输
● 面向字节流
● 全双工
对于字节流来说,可以简单的理解为传输数据是基于IO流的,流式数据的特征就是IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。
2.2.3 数据报套接字
这个 数据报套接字 是使用于 传输层UDP协议。
UDP为传输层协议的特点为:
● 无连接
● 不可靠传输
● 面向数据报
● 全双工
对于数据报来说,可以简单的理解为,传输数据是一快一块的,发送一块数据假如100字节,必须一次发送。接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。
2.3 区别
在上面的分类汇总已经了解到了对于 TCP 和 UDP 的对应的区别了,这里详细介绍一下其区别:
2.3.1 有连接 vs 无连接
有连接/无连接 抽象的概念就是,虚拟的/逻辑上的连接。
比如对于TCP来说,TCP协议中,就保存了对端的信息。如A和B通信,A和B先建立连接,让A保存B的信息,B保存A的信息(彼此之间知道,谁是和他建立连接的那个)这就是——有连接
比如UDP来说,UDP协议本身,不保存对方的信息,就是——无连接。
2.3.2 可靠传输 vs 不可靠传输
在网络上,数据是非常容易出现丢失的情况的,光信号、电信号都可能受到外界的干扰。
可靠传输就是不保证数据包100%到达,而是尽可能的提高传输成功的概率。如果出现丢包了,能够感知到。
不可靠传输只是把数据发送了,就不管了。
2.3.3 面向字节流 vs 面向数据报
面向字节流 读写数据的时候,是以自己为单位的。支持任意长度,但是会出现粘包问题
买你想数据报 读写数据的时候,以一个数据报为单位(不是字符),一次必须读写一个UDP数据报,不能是半个。
2.3.4 全双工 vs 半双工
全双工:一个通信链路,支持双向通信(能写,也能读)
半双工:一个通信链路,只支持单项通信 (要么写,要么读)
本次的分享就到这里了,下一篇就进行分享对于套接字中那两个类的详细代码介绍。
感觉文章不错的话,期待你的一键三连哦,你的鼓励就是我的动力,让我们一起加油,顶峰相见。拜拜喽~~我们下次再见💓💓💓💓💓💓💓💓💓💓💓💓