网络通信概述
网络通信本质上是一种进程间通信,是位于网络中不同主机上的进程之间的通信,属于 IPC 的一种, 通常称为 socket IPC,如图中所示。所以网络通信是为了解决在网络环境中,不同主机上的应用程序之间的通信问题。 大概可以分为三个层次,如下所示:
- 硬件层:网卡设备,收发网络数据
- 驱动层:网卡驱动(Linux 内核网卡驱动代码)
- 应用层:上层应用程序(调用 socket 接口或更高级别接口实现网络相关应用程序)
在硬件上,两台主机都提供了网卡设备,也就满足了进行网络通信最基本的要求,网卡设备是实现网络数据收发的硬件基础。并且通信的两台主机之间需要建立网络连接,这样两台主机之间才可以进行数据传输,譬如通过网线进行数据传输。网络数据的传输媒介有很多种,大体上分为有线传输(譬如双绞线网线、 光纤等)和无线传输(譬如 WIFI、蓝牙、ZigBee、4G/5G/GPRS 等),PC 机通常使用有线网络,而手机等移动设备通常使用无线网络。
在内核层,提供网卡驱动程序,驱动底层网卡硬件设备,同时向应用层提供 socket 接口。
在应用层,应用程序基于内核提供的 socket 接口进行应用编程,实现自己的网络应用程序。需要注意的是,socket 接口是内核向应用层提供的一套网络编程接口,所以我们学习网络编程其实就是学习 socket 编程,如何基于 socket 接口编写应用程序。
除了socket 接口之外,在应用层通常还会使用一些更为高级的编程接口,譬如 http、网络控件等,那么这些接口实际上是对 socket 接口的一种更高级别的封装。在正式学习 socket 编程之前,我们需要先了解一些网络基础知识,为后面的学习打下一个理论基础。
网络通信知识庞大,其中涉及到一大堆的网络协议(TCP/IP 协议族) ,笔者不可能把这些内容给大家介绍清楚,本文仅仅只是进行简单介绍,以了解为目的。
网络互连模型:OSI 七层模型
七层模型,亦称 OSI(Open System Interconnection)。OSI 七层参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间网络互联的标准体系,一般称为 OSI 参考模型或七层模型。OSI 七层模型是一个网络互连模型,从上到下依次是:
从上可知,网络通信的模型分了很多层,为什么需要分为这么多层次?原因就在于网络是一种非常复杂的通信,需要进行分层,每一层需要去实现不同的功能。下面我们来详细看下 OSI 参考模型中每一层的作用。
应用层
应用层(Application Layer)是 OSI 参考模型中的最高层,是最靠近用户的一层,为上层用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP、FTP、TFTP、SMTP、 SNMP、DNS、TELNET、HTTPS、POP3、DHCP。
表示层
表示层(Presentation Layer)提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩/解压缩和加密/解密(提供网络的安全性)也是表示层可提供的功能之一。
会话层
会话层(Session Layer)对应主机进程,指本地主机与远程主机正在进行的会话。会话层就是负责建立、 管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。 将不同实体之间表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。
传输层
传输层(Transport Layer)定义传输数据的协议端口号,以及端到端的流控和差错校验。该层建立了主机端到端的连接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括差错校验处理和流控等问题。我们通常说的,TCP、UDP 协议就工作在这一层,端口号既是这里的“端”。
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。本层通过 IP 寻址来建立两个节点之间的连接,为源端发送的数据包选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。网络层 (Network Layer)也就是通常说的 IP 层。该层包含的协议有:IP(Ipv4、Ipv6)、ICMP、IGMP 等。
数据链路层
数据链路层(Data Link Layer)是 OSI 参考模型中的第二层,负责建立和管理节点间逻辑连接、进行硬件地址寻址、差错检测等功能。将比特组合成字节进而组合成帧,用 MAC 地址访问介质,错误发现但不能纠正。
数据链路层又分为 2 个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。MAC 子层的主要任务是解决共享型网络中多用户对信道竞争的问题,完成网络介质的访问控制;LLC 子层的主要任务是建立和维护网络连接,执行差错校验、流量控制和链路控制。
数据链路层的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息, 以便提供可靠的数据传输。
物理层
物理层(Physical Layer)是 OSI 参考模型的最低层,物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使数据链路层不必考虑网络的具体传输介质是什么。“透明传 送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见 的。
实际上,网络数据信号的传输是通过物理层实现的,通过物理介质传输比特流。物理层规定了物理设备标准、电平、传输速率等。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆等,这些都是物理层的传输介质。
以上便是对 OSI 参考模型中的各个层进行的简单介绍,网上也有很多文章对 OSI 参考模型做过详细地介绍。除了 OSI 七层模型之外,大家可能还听过 TCP/IP 四层模型、TCP/IP 五层模型,那么这些又是什么呢?接下来将向大家介绍。
TCP/IP 四层/五层模型
事实上,TCP/IP 模型是 OSI 模型的简化版本,我们来看看 OSI 七层模型和 TCP/IP 五层模型之间的对应的关系:
所以由上图可知,TCP/IP 五层模型中,将 OSI 七层模型的最上三层(应用层、表示层和会话层)合并为一个层,即应用层,所以 TCP/IP 五层模型包括:应用层、传输层、网络层、数据链路层以及物理层。除了 TCP/IP 五层模型外,还有 TCP/IP 四层模型,与五层模型唯一不同的就是将数据链路层和物理层合并为网络接口层,如下图所示:
由上图可知,四层模型包括:应用层、传输层、网络层以及网络接口层。而在实际的应用中还是使用 TCP/IP 四层模型,五层模型是专门为介绍网络原理而设计的。
数据的封装与拆封
网络通信中,数据从上层到下层交付时,要进行封装;同理,当目标主机接收到数据时,数据由下层传递给上层时需要进行拆封。这就是数据的封装与拆封。 数据的封装过程如下图所示:
当用户发送数据时,将数据向下交给传输层,但是在交给传输层之前,应用层相关协议会对用户数据进行封装,譬如 MQTT、HTTP 等协议,其实就是在用户数据前添加一个应用程序头部,这是处于应用层的操作,最后应用层通过调用传输层接口来将封装好的数据交给传输层。
传输层会在数据前面加上传输层首部(此处以 TCP 协议为例,图中的传输层首部为 TCP 首部,也可以是UDP 首部),然后向下交给网络层。
同样地,网络层会在数据前面加上网络层首部(IP 首部),然后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路层首部(此处使用以太网接口为例,对应以太网首部),然后将数据交给网卡。
最后,由网卡硬件设备将数据转换成物理链路上的电平信号,数据就这样被发送到了网络中。这就是网络数据的发送过程,从图中可以看到,各层协议均会对数据进行相应的封装,可以概括为 TCP/IP 模型中的 各层协议对数据进行封装的过程。
以上便是网络数据的封装过程,当数据被目标主机接收到之后,会进行相反的拆封过程,将每一层的首部进行拆解最终得到用户数据。所以,数据的接收过程与发送过程正好相反,可以概括为 TCP/IP 模型中的各层协议对数据进行解析的过程。