目录
1. 💋IP地址
1.1 🍟IP地址的格式
1.2 🎁特殊IP地址
2. ✨端口号
2.1 🎃端口号的格式
3. 😘网络协议
3.1 🎨为什么需要网络协议?
3.2 💛网络协议的概念与组成
3.3 🍉知名协议的默认端口
3.4 🐷五元组
4. 🍳网络协议分层
4.1 🍭协议分层的好处
4.2 🎩网络协议的分层模型一——OSI七层网络协议
4.3 🏓网络协议的分层模型二——TCP/IP 五层网络协议
4.4 💪封装与分用
网络互连的目的是进行网络通信,也即是网络数据传输。(更多关于网络是如何互联的内容,请点开网络原理系列的网络原理之网络发展史)
1. IP地址
IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。
简单说,IP地址用于定位主机的网络地址,就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。
1.1 IP地址的格式
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),如: 01100100.00000100.00000101.00000110。
通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如: 100.4.5.6。
1.2 特殊IP地址
127.* 的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。
本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
IP地址解决了网络通信时,定位网络主机的问题,但是还存在一个问题,传输到目的主机后,由哪个进程来接收这个数据呢?这就需要端口号来标识。
2. 端口号
在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单说:端口号用于定位主机中的进程。类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)。
2.1 端口号的格式
端口号是 0 ~ 65535 范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。 注意事项两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号。
注意事项:程序代码中,进行网络编程时,需要绑定端口号(收发数据的端口)来发送、接收数据。进程绑定一个端口号后,fork一个子进程,可以实现多个进程绑定一个端口号,但不同的进程不能绑定同一个端口号。
PS:一个进程A启动之后,调用了fork函数,其作用是创建一个几乎与A一样的新进程,而这个新进程就是A的子进程,而A是这个新进程的夫进程,此时两个进程的端口号一样。
有了IP地址和端口号,可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制 0 / 1 数据来传输,如何告诉对方发送的数据是什么样的呢? 网络通信传输的数据类型可能有多种:图片,视频,文本等。同一个类型的数据,格式可能也不同,如发送一个文本字符串 “ 你好!” 。如何标识发送的数据是文本类型,及文本的编码格式呢? 基于网络数据传输,需要使用协议来规定双方的数据格式。
3. 网络协议
3.1 为什么需要网络协议?
众多计算机生产厂商,生产了各种各样的计算机和手机。这些设备操作系统还不一定都一样,比如Microsoft Windows、Android、IOS、Linux、HUAWEI Harmony OS等等;这些设备的硬件设备也不一样。这时候问题就来了,如何让这些不同厂商生产的计算机能够互相通信呢?这就需要制定统一的标准,方便大家一起遵守,好互相通信。而这个标准就是网络协议。
3.2 网络协议的概念与组成
网络传输的本质是通过网线或者光纤或者无线这些电信号或光信号来进行传输的。比如网线,传输一系列高电平和低电平,就可以使用高电平和低电平来分别表示二进制中的 1 和 0 。而对于光纤来说,传输的是光信号,不同的波长产生不同频率的光,利用不同频率的光来表示 1 和 0 。既然传输的数据都是 1 和 0 ,那这些到底表示了什么意思呢?这就需要发送方和接收方事先约定好每一组 1 和 0 都是什么意思。而这种约定就是协议。
网络协议,简称协议(protocol),是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。
网络协议通常由三要素组成:
1. 语法:即数据与控制信息的结构或格式以及编码;就像各个国家说各个国家的语言,只有说相同语言的人,才能彼此进行沟通。
2. 语义:即需要发出何种控制信息,完成何种动作以及做出何种响应; 语义主要用来说明通信双方应当怎么做。用于协调与差错处理的控制信息。 类似打电话时,说话的内容。一方道:你瞅啥?另一方就得有对应的响应:瞅你咋的!
3. 时序,即事件实现顺序的详细说明。 时序定义了何时进行通信,先讲什么,后讲什么,讲话的速度等。比如是采用同步传输还是异步传输。 女生和男生的通话,总是由男生主动发起通话,而总是在男生恋恋不舍的时候,由女生要求结束通话。
协议最终体现为网络上传输的数据包的格式。
3.3 知名协议的默认端口
系统端口号范围为 0 ~ 65535,其中:0 ~ 1023 为知名端口号,这些端口预留给服务端程序绑定广泛使用的应用层协议,如:
22端口:预留给SSH服务器绑定SSH协议
21端口:预留给FTP服务器绑定FTP协议
23端口:预留给Telnet服务器绑定Telnet协议
80端口:预留给HTTP服务器绑定HTTP协议
443端口:预留给HTTPS服务器绑定HTTPS协议
需要补充的是: 以上只是说明 0 ~ 1023 范围的知名端口号用于绑定知名协议,但某个服务器也可以使用其他 1024 ~ 65535 范围内的端口来绑定知名协议,就好比餐厅的VIP包房是给会员使用,但会员也可以不坐包房,坐其他普通座位。
3.4 五元组
在TCP/IP协议中,用五元组来标识一个网络通信:
1. 源IP:标识源主机
2. 源端口号:标识源主机中该次通信发送数据的进程
3. 目的IP:标识目的主机
4. 目的端口号:标识目的主机中该次通信接收数据的进程
5. 协议号:标识发送进程和接收进程双方约定的数据格式
五元组在在网络通信中的作用,类似于发送快递:
4. 网络协议分层
实现整个网络通信需要的协议其实是非常复杂的,这就需要人们将复杂协议拆分成多个协议。对这些多个“小的”协议进行分类的同时,对其进行分层。
4.1 协议分层的好处
网络协议到底是怎么样进行分层的呢?——分层其实就是定义好两层间的接口规范,让双方遵循这个规范来对接。在代码中,类似于定义好一个接口,一方为接口的实现类(发送方,提供服务),一方为接口的使用类 (接收方,使用服务)。
那这样的分层有什么好处呢?
1.对于接收方来说,并不关心发送方是如何实现的,只需要使用接口即可;对于发送发来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。
2. 方便对某一层的协议进行替换。
综上,分层之后,层次间的耦合程度降低,方便后续的扩展与维护。
4.2 网络协议的分层模型一——OSI七层网络协议
OSI:Open System Interconnection,开放系统互连
OSI 七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了7层,从下到上依次为:
物理层 -> 数据链路层 -> 网络层 -> 传输层 -> 会话层 -> 表示层 -> 应用层。
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输; 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通 过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
OSI 七层模型既复杂又不实用,只存在于教科书中。 实际组建网络时,只是以 OSI 七层模型设计中的部分分层,也即是以下 TCP/IP 五层(或四层)模型来实现。
4.3 网络协议的分层模型二——TCP/IP 五层网络协议
TCP/IP是一系列协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
应用层:聚焦在传输过来的数据内容,关注数据的用途,负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
传输层:不考虑这两个遥远节点中间的路径如何,只关注起点和终点节点,负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
网络层:主要负责两个遥远节点的路径规划,即地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
数据链路层:两个相邻节点之间的传输,即通过网线、光纤以及无线直接连接的设备,负责这些设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。 有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
物理层:网络通讯的基础设施:网线、光纤以及网络接口等,负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
程序员进行网络编程主要针对的是应用层,其他的四层操作系统内部已经封装好。
物理层我们考虑的比较少。因此很多时候也可以称为 TCP/IP四层模型。
4.4 封装与分用
在网络协议分层的背景下,数据到底是如何网络传输的呢?
回答这个问题,就需要了解以下两个概念:封装与分用。
封装:发送方发送数据,要把数据从上到下,依次交给对应层的协议进行封装。
分用:接收方接收数据,要把数据从下到上,依次交给对应层的协议进行分用。
具体过程如下:不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame)。 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装 (Encapsulation)。 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理。
以一方发送一条微信消息到另一方为例子(只是一个简单的例子而已,真实情况并非如此):
发送发:
1. 应用层:
在编辑框输入信息”( ๑ ᴖ ᴈ ᴖ)ᴖ ᴑ ᴖ๑)“,点击发送之后,微信应用程序拿到了上述数据,并将其封装成应用程序数据包:
上述应用程序数据包本质上是字符串的拼接,如:123456;654321;2023-04-23 15:51:00;( ๑ ᴖ ᴈ ᴖ)ᴖ ᴑ ᴖ๑),为了分割上述字段,会利用分割符或是长度信息,真实情况可能更为复杂。
2. 传输层:
应用层调用传输层提供的API(Application Programming Interface),于是传输层拿到了这个数据包。传输层里有许多协议,其中最典型的就是 TCP 与 UDP ,下面以 UDP 为例。UDP会针对上述数据包进行封装,即在这个数据包加上数据头部,两者共同组成一个 UDP 数据报。
传输层协议,最关键的属性就是源端口与目的端口了。
3. 网络层:
网络层利用 IP协议(网络层不仅只有这么一个协议,还有其他的协议)对 UDP 数据报进行封装,再加上一个抱头,两者构成一个 IP 数据报。
上述的源 IP 地址与目的 IP 地址描述了此次传输中的起点与终点。
4. 数据链路层:
这一层中,最典型的协议叫以太网
mac 地址,也叫物理地址,描述一个主机在网络上的位置,与网卡绑定,每张网卡都有自己唯一的 mac 地址。它的用途与 IP 地址非常类似,但是人们将这两种地址用作不同用途,IP 地址是网络层用来路径规划的,而 mac 地址是数据链路层记录两个即将进行数据传输的数据节点地址的。
5. 物理层:
物理层将上述的以太网帧转换成二进制,再转换成光信号或电信号或者电磁波信号传输出去。
接收方:
接收过程跟上述的发送过程正好相反,接收是从下到上,依次分用,去掉报头,这里简单叙述一下:
1. 物理层,网卡接收到了电信号或是光信号或是电磁波信号,并将这些信号转换成二进制序列,最后把这些二进制序列当成是以太网数据帧传给了数据链路层去处理。
2. 数据链路层,将帧头、帧尾去掉,再上交给网络层。这是因为在帧头中会存储其上层是什么类型以及其使用的协议的相关信息。
后面依次分用,便不再赘述。一直到接收者的应用层,他的微信应用程序会解析应用数据包,取出一开始放入的字段( ๑ ᴖ ᴈ ᴖ)ᴖ ᴑ ᴖ๑),放入程序的界面中。
在真实的网络环境中,数据的传输可能要经过很多节点的转发:
交换机会进行分用,从物理层到数据链路层。交换机会对这个数据进行重新封装,修改源 mac 与目的 mac 的值,从数据链路层到物理层,再把数据进行转发。
而路由器会把接收的数据从物理层分用到网络层,根据当前得到的目的 IP 进行下一阶段的寻路操作(IP 协议在一边传输的过程中,一边规划路径)。之后路由器又重新对数据包进行封装,从网络层到物理层,经过数据链路层的时候,也会调整 mac 的地址。
只有到达目的主机时,目的主机才会对数据包完成从物理层到应用层的分用过程。
上述过程便是一次完整的网络通讯过程。