之前提到的信号,管道,信号量,共享内存,消息队列这些进程间通信方式,都是为了实现本机内进程间进行通信。如果需要不同主机之间的进程进行通信,这就涉及网络编程。而套接字就是为了实现网络主机之间进程通信而提供的一种通信机制。

11.1 网络编程基本概念

11.1.1 软件体系结构

1. C/S模式

C/S模式即客户机/服务器模式(Client/Server),通过将任务合理分配到客户端和服务器端,降低系统的通信开销。
C/S模式的软件系统至少包含服务器端和客户端两个程序,分别运行在两台计算机上,客户端向服务器端发出请求,服务器端收到后进行响应并作出相应处理,然后反馈给客户端。这样就完成了一次网络通信过程。
比较典型的C/S模式软件是腾讯QQ。
优点:充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器端,因此客户端响应速度快。
缺点:客户端需要安装专用的客户端软件,对软件的安装升级维护的工作量很大;不同操作系统的兼容性很差。(胖客户)

image.png

image.png

2. B/S模式

B/S即浏览器/服务器模式(Browser/Server),用通用浏览器实现原来需要复杂专用软件才能实现的强大功能,节省开发成本。
在此模式下,客户机只需要安装一个浏览器,服务器安装一个书记哭,浏览器通过Web Server同数据库进行数据交互;而用户界面完全由WWW浏览器实现,一部分事务逻辑在浏览器实现,但主要事务逻辑是在服务器端实现。
image.png
优点:客户机只需要有浏览器,且可以上网,就能满足要求(瘦客户)
缺点:绝大部分工作由服务器承担,这使得服务器的负担很重,会导致数据查询等速度较慢。因为所有数据处理都依赖于服务器,因此不适用于大数据量分析,实时控制等应用。

11.1.2 IP地址和端口

IP地址用于标记网络中的一个通信实体,这个通信实体可以是一台主机,一台打印机,或者路由器的一个端口。每个被传输的数据包都包含一个源IP地址和一个目的IP地址,且运输过程中保持不变,以便将数据包从源通信实体发送到指定的目的通信实体。
IP地址可以唯一的确定网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,因此还需要使用端口。端口是一个16位整数,用于表示数据交给哪个通信程序处理。因此端口就是应用程序和外界交流的出入口,是一种抽象的软件结构。
image.png

11.1.3 字节顺序

字节顺序是指大于1字节的数据在内存中的存放顺序。不同的计算机结构可能使用不同的字节顺序存储数据,包括Big-Endian和Little-Endian。
Big-Endian:低位字节保存在内存的高地址端
Little-Endian:低位字节保存在内存的低地址端。
对于Big-Endian处理器,将字节放入内存是从最低位地址开始,首先放入最重要的字节;对于Little-Endian处理器(Intel),首先放入的是最不重要的字节。
目前网络上采用的是Big-Endian,例如在调用bind时,IP地址(4字节整型)和端口(2字节整型)就需要进行字节顺序交换。
image.png
image.png

11.1.4 TCP和UDP协议

image.png

11.2 套接字编程基础

image.png
image.png
image.png
套接字主要分为以下3种类型。
(1)字节流套接字(流式套接字)
这是最常用的套接字类型,TCP/IP 协议簇中的TCP协议使用此类接口,它提供面向连接的(建立虚电路)、无差错的、发送先后顺序一致的、 包长度不限和非重复的网络数据包传输。
(2)数据报套接字
TCP/IP协议簇中的UDP协议使用此类接口,它是无连接的服务,以独立的数据包进行网络传输,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。
(3)原始套接字
提供对网络下层通信协议(如IP协议)的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。

image.png
image.png

11.2.1 面向连接套接字通信过程

基于TCP协议进行通信的方式就是面向连接的通信过程,通信进程双方之间在通信之前必须要建立连接,从而通过此连接进行数据通信,通信结束后释放连接,这是可靠传输。流式套接字就是使用TCP协议进行网络进程间通信的套接字方式。
image.png
image.png
image.png