# TCP客户端/服务器模型

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

## 原理图

![](https://313308022-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT30T9rtIVtc5eWQf%2F-LfnT9dAhhstiSPRKKVD%2F-LfnTJFWZGZz7St1lnBt%2Ftcpsocket.jpg?generation=1558862981987352\&alt=media)

## 过程描述：

**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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xiaoxiami.gitbook.io/linux-server/socket/tcpke-hu-7aef-fu-wu-qi-mo-xing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
