第二章 Linux网络编程
2.1客户——服务器模型
目前大多数网络应用程序在编写时都采用客户—服务器模型,假设一端是客户,另一端是服务器,让服务器提供给客户一定的服务内容。它要求有一方(服务器方)在启动执行程序后(无限期地)等待其他客户端程序与之通信。这里可以再分为两种具体类型:并发型交互与重复型交互。
(1)并发型交互。在并发型交互模式下,程序的主要运作步骤如下:
·等待一个客户请求的到来;
·生成一个新的进程或者任务来处理这个客户请求,同时这里还可以接收其他客户的请求,处理结束后,终止这个进程;
·反馈客户端;
·等待新的客户请求的到来并进行下一次服务,如此循环运作。
(2) 重复型交互。重复型交互模式下,程序的主要运作步骤如下:
·等待一个客户请求的到来;
·处理客户的请求,对客户进行服务;
·给客户反馈信息,服务结束;
·等待下一个请求到来,如此循环。
这里重复型交互的缺点就是在服务器给一个客户处理请求服务的时候,不能接收和处理其他客户的请求;而并发型交互就可以解决这个问题,但要多线程操作系统的支持。一般来说,UDP 服务器采用重复型交互,TCP 服务器采用并发型交互。 客户/服务器模式要求每个应用程序由两个部分组成:一个部分负责启动通信,另一个部分负责对它进行应答。它们通常是运行在不同的主机上,分别被称为客户机和服务器。服务器并不特定指网络上的一台机器,它可以是网络上可提供服务的任何程序,同样,客户机也是指用户为了得到某种服务所需要运行的应用程序。由于客户端和服务器端在网络通信中表现出来的不同的功能,对它们编程要采用不同的算法。
2.2面向连接和无连接的客户—服务器
在设计客户—服务器软件时,必须在两种类型的交互中做出选择:无连接的风格或面向连接的风格。这两种风格的交互直接对应于 TCP/IP 协议族所提供的两个主要的传输协议。如果客户和服务器使用用户数据报(UDP)进行通信,那么交互就是无连接的;如果使用传输控制协议(TCP),则交互就是面向连接的。由于面向连接风格的交互协议使编程更简单,程序更可靠,因此采用TCP协议的客户—服务器模型是我们的首选。
2.3 TCP 连接通讯过程
TCP是一种面向连接的、可靠的字节流传输协议,通讯之前,双方之间必须建立一条连接,通讯结束后再释放。
为了建立一条可靠的连接,TCP采用三次握手的方式:
(1)客户机(请求端)向服务器发出同步段(SYN),请求接入。
(2)服务器向客户机发出同步—应答段(SYN—ACK)。一方面作为对客户请求接入的响应,另一方面要求客户端也进行接入。
(3)客户机向服务器再发出应答段(ACK)。作为对服务器所发请求接入的响应。
终止一个TCP连接共要经过4次握手:
(1)客户机向服务器发出关闭段(FIN)。此时,客户机不能再向远方服务器发送数据,但是可以继续接收数据。
(2)服务器向客户机发出关闭—应答段。此时服务器还可以向客户机发送数据,即接入处于“半关闭”状态。
(3)服务器向客户机发出关闭段(FIN),关闭本侧的接入,仍可接收数据。一方面作为客户关闭接入的响应,另一方面要求客户端也须关闭接入。此时,服务器不能再发送数据。
(4)客户机为响应服务器的关闭,向服务器发出关闭—应答段。
2.4 TCP协议的socket编程
socket编程简单的说就是使两台或多台联网的计算机相互交换数据。
2.4.1 TCP 套接口连接中的主要函数的调用
TCP 套接口连接中的主要调用的函数有socket,bind,connect,write,listen,close等。TCP/IP协议的客户/服务器机制工作过程如下图所示:
2.4.2 Linux 中套接口的数据结构
套接口数据结构同时与使用它的网络有关。在Linux中,每一种协议都有自己的网络地址数据结构,这些结构以sockaddr_开头,不同的后缀表示不同的协议,如IPv4对应的是sockaddr_in。
2.5编程算法实现
2.5.1客户端的算法
客户可以按照以下算法构造与某个服务器的连接并与该服务器通信。
(1)找到与其通信的服务器的IP地址和协议端口号;
(2)分配套接字;
(3) 指明此连接需要在本地机器中的、任意的、未使用的协议端口,并允许TCP选择一个这样的端口;
(4)将这个套接字连接到服务器;
(5)使用应用级协议与服务器进行通信(此常包含发送请求和等待应答);
(6)关闭连接。
2.5.2 服务端的算法
(1)并发服务器
服务器在一个时刻可以处理多个请求的服务器,称为并发服务器。我们采用并发的、面向连接服务器的算法,下面给出了并发服务器使用面向连接协议的算法步骤:
主 1.创建套接字并将其绑定到所提供服务的设定的地址上。该套接字保持
非连接的。
主2.将该端口设置为被动模式,使其准备为服务器所用。
主3.反复调用accept以便接收来自客户的下一个连接请求,并创建新的从
线程或进程来处理响应。
从1.由主线程传递来得连接请求(即针对连接的套接字开始)。
从2.用该连接与客户进行交互:读取请求并发回响应。
从3.关闭连接并退出。在处理完来自客户的所有请求后,从线程就退出。
(2)多线程与多进程并发服务器
Linux提供了两种形式的并发性——进程和线程,所以有两种常见的主—从模式实现:一种是服务器创建多个进程,每个进程都有一个执行线程。另一种实现是,服务器在一个进程中创建多个执行线程。
(3)依赖单线程和异步I/O处理多个连接的服务器
在单线程实现中,一个执行线程管理多个连接。它通过使用异步I/O来达到表面上的并发性。服务器反复地在它所打开的连接上等待I/O,收到请求便进行处理。由于单个线程处理所有的连接,它就可以在多个连接之间共享数据。然而因为服务器只有一个线程,即使在一个具有多个处理器的计算机上,它处理请求的速度不会比循环服务器更快。应用程序必须共享数据或者对每个请求的处理时间必须很短,只要在这种情况下这种服务器实现方案才是可取的。
原文:http://www.cnblogs.com/boyiliushui/p/4472703.html