> For the complete documentation index, see [llms.txt](https://xiaoxiami.gitbook.io/linux-server/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaoxiami.gitbook.io/linux-server/socket/tcpke-hu-7aef-fu-wu-qi-mo-xing.md).

# TCP客户端/服务器模型

在TCP/IP网络应用中，通信的两个进程间相互作用的主要模式是客户/服务器模式（Client/Server model），即客户向服务器发出服务请求，服务器接收到请求后，提供相应的服务。

## 原理图

![](/files/-LfnTJFWZGZz7St1lnBt)

## 过程描述：

**TCP服务端**

(1)启动一个TCP服务器端(也就是一个socket),

(2)bind()绑定端口,绑定服务器地址,绑定ip

(3)listen()监听端口,可监听多个

(4)进入accept状态(阻塞),这是一个`while(true)`死循环(但是这个死循环会做优化,消化的资源会很少),等待客户端连接

**TCP客户端**

(1)建立一个socket

(2)connect() 地址 ip 端口,成功连接到服务端,服务端则fork一个子进程来处理

(3)客户端写入数据,服务端就会去读.处理,然后写回客户端

(4)客户端再去读,完成close结束连接

(5)服务端read到客户端已关闭,服务端close关闭.

## 简单理解：

类比成打电话的过程

### 对服务器端来说

socket函数：要创建一个套接字（调用socket函数），安装一个电话机

bind函数：为电话机绑定一个号码

listen函数：处于监听的状态

accept函数：等待对方的连接，也就是说等待对方电话拨打过来；如果没有电话拨打过来，就一直阻塞，直到客户端连接到达

read函数：接受客户的请求，并对请求进行处理

write函数：将处理的客户端请求结果返回给客户端，进行数据应答

以上的 read函数 write函数 会因为客户端的循环请求，服务端进行循环的接收处理请求，数据应答过程。

close：服务端read函数读取到了EOF文件描述符，表示对方关闭了连接，也要把自己的一个套接字给关闭掉。

### 对于客户端来说：

socket函数：要创建一个套接字（调用socket函数），安装一个电话机

connect函数：类似于是拨打对方的电话号码，拨通之后就建立连接，一旦连接建立之后，双方开始就开始进行通信（一问一答的通信）

write函数：向服务端发起请求

read函数：客户端接收服务端的数据应答，紧接着，有可能会再一次的发起另外一个请求（write函数），如图为一个循环

close函数：客户端发起终止（这是一个文件结束的通知），相当于是发送了一个EOF文件描述符，会导致服务端read函数等于0

**后续会对函数详细解释。**
