网络通信与Socket套接字详解
目录
1. 网络通信原理
1.1 IP地址
1.2 端口号
1.3 认识协议
1.4 五原组
1.5 协议分层
1.5.1 分层的作用
1.5.2 OSI七层模型
1.5.3 TCP/IP五层(或四层)模型
1.5.4 网络设备所在分层
1.6 网络数据通信的基本流程
1.6.1 封装(从上层往下层)
1.6.2 分用(从下层到上层)
2. Socket套接字
2.1 概念
2.2 分类
2.2.1 原始套接字
2.2.2 流套接字
2.2.3 数据报套接字
2.3 区别
2.3.1 有连接 vs 无连接
2.3.2 可靠传输 vs 不可靠传输
2.3.3 面向字节流 vs 面向数据报
2.3.4 全双工 vs 半双工
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 半双工
全双工:一个通信链路,支持双向通信(能写,也能读)
半双工:一个通信链路,只支持单项通信 (要么写,要么读)
本次的分享就到这里了,下一篇就进行分享对于套接字中那两个类的详细代码介绍。
感觉文章不错的话,期待你的一键三连哦,你的鼓励就是我的动力,让我们一起加油,顶峰相见。拜拜喽~~我们下次再见💓💓💓💓💓💓💓💓💓💓💓💓