# Socket原理

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

> 资料：[PHP SOCKET编程](http://blog.csdn.net/hguisu/article/details/7448528)

## TCP Socket原理图

![](https://3149448975-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT31GMG1d9KiXwANW%2F-LfnT7UNILQRAFnaeTSW%2F-LfnTFxdG4eq6x1v6g4P%2F1.png?generation=1558862965849920\&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关闭.

解释图：

![](https://3149448975-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT31GMG1d9KiXwANW%2F-LfnT7UNILQRAFnaeTSW%2F-LfnTFxfBLBdYVO-9PkH%2F2.png?generation=1558862960405558\&alt=media)

## UDP Socket原理图

![](https://3149448975-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT31GMG1d9KiXwANW%2F-LfnT7UNILQRAFnaeTSW%2F-LfnTFxhrYbqjAAfKhZl%2F3.png?generation=1558862976422814\&alt=media)

解释图：

![](https://3149448975-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT31GMG1d9KiXwANW%2F-LfnT7UNILQRAFnaeTSW%2F-LfnTFxjwnXlPOKy-COu%2F4.png?generation=1558862971419152\&alt=media)
