如何理解php socket

  什么是socket?

  Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,进程间通信就被冠名为文件描述符(file descriptor),Socket 是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

  如图为Socket所在位置:

  Socket 通信过程

  Socket 保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个 Socket 对象,然后通过 Socket 对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。

  相关学习视频教程分享:php视频教程

  下图是面向连接的 TCP 时序图:

  客户端过程:

  客户端的过程比较简单,创建 Socket,连接服务器,将 Socket 与远程主机连接(注意:只有 TCP 才有“连接”的概念,一些 Socket 比如 UDP、ICMP 和 ARP 没有“连接”的概念),发送数据,读取响应数据,直到数据交换完毕,关闭连接,结束 TCP 对话。

  这里也可用 send() 方法:不同在于 sendall() 在返回前会尝试发送所有数据,并且成功时返回 None,而 send()则返回发送的字节数量,失败时都抛出异常。

  服务端过程:

  咱再来聊聊服务端的过程,服务端先初始化 Socket,建立流式套接字,与本机地址及端口进行绑定,然后通知 TCP,准备好接收连接,调用 accept() 阻塞,等待来自客户端的连接。如果这时客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕。最后关闭连接,交互结束。

  调用 accept() 时,Socket 会进入waiting状态。客户端请求连接时,方法建立连接并返回服务器。accept() 返回一个含有两个元素的元组 (conn, addr)。第一个元素 conn 是新的 Socket 对象,服务器必须通过它与客户端通信;第二个元素 addr 是客户端的 IP 地址及端口。data = conn.recv(1024)

  接下来是处理阶段,服务器和客户端通过 send() 和 recv() 通信(传输数据)。

  服务器调用 send(),并采用字符串形式向客户端发送信息,send() 返回已发送的字符个数。

  服务器调用 recv() 从客户端接收信息。调用 recv() 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv() 在接收数据时会进入blocked状态,最后返回一个字符串,用它表示收到的数据。如果发送的数据量超过了 recv() 所允许的,数据会被截短。多余的数据将缓冲于接收端,以后调用 recv() 时,会继续读剩余的字节,如果有多余的数据会从缓冲区删除(以及自上次调用 recv() 以来,客户端可能发送的其它任何数据)。传输结束,服务器调用 Socket 的 close() 关闭连接。

  从 TCP 连接的视角看 Socket 过程:

  TCP 三次握手的 Socket 过程:

  1、服务器调用 socket()、bind()、listen() 完成初始化后,调用 accept() 阻塞等待;

  2、客户端 Socket 对象调用 connect() 向服务器发送了一个 SYN 并阻塞;

  3、服务器完成了第一次握手,即发送 SYN 和 ACK 应答;

  4、客户端收到服务端发送的应答之后,从 connect() 返回,再发送一个 ACK 给服务器;

  5、服务器 Socket 对象接收客户端第三次握手 ACK 确认,此时服务端从 accept() 返回,建立连接。

  接下来就是两个端的连接对象互相收发数据。

  TCP 四次挥手的 Socket 过程:

  1、某个应用进程调用 close() 主动关闭,发送一个 FIN;

  2、另一端接收到 FIN 后被动执行关闭,并发送 ACK 确认;

  3、之后被动执行关闭的应用进程调用 close() 关闭 Socket,并也发送一个 FIN;

  4、接收到这个 FIN 的一端向另一端 ACK 确认。

  总结:

  上面的代码简单地演示了 Socket 的基本函数使用,其实不管有多复杂的网络程序,这些基本函数都会用到。上面的服务端代码只有处理完一个客户端请求才会去处理下一个客户端的请求,这样的服务器处理能力很弱,而实际中服务器都需要有并发处理能力,为了达到并发处理,合肥代孕威信15023219993太原代孕威信15023219993上海代孕威信15023219993广州代孕+15023219993重庆代孕+15023219993服务器就需要 fork 一个新的进程或者线程去处理请求。

原文地址:https://www.cnblogs.com/ipengrui1/p/12283425.html

时间: 2024-10-22 13:45:10

如何理解php socket的相关文章

python之我理解的socket

一.为什么学socket? 完成C/S架构的开发. 思考:什么是C/S架构. 二.学前准备 计算机系统=硬件+系统软件+应用软件,将这样的计算机比作成一个人,在地球这样的大环境下你只能和自己玩(比如自带的单机游戏扫雷什么的),但是地球上不会就只有一个人,地球上的人需要互相交流(语言),要想所有人都听得懂所以人类出了一个官方的语言英语,计算机之间交流就是通过互联网协议. 重点:互联网的核心就是由一堆协议组成,协议就是标准,比如全世界人通信的标准是英语 为什么学习socket要先学习互联网协议? 1

Linux Socket编程-(转自吴秦(Tyler))

"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信?

python socket类库t介绍

一.Socket是什么 1.socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.2.socket的个人理解:Socket看作是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) 二.Socket type socket.AF_UNIX 只能够用于单一的Unix系统进程间通信socket.AF_INET 服务器之间网络通信socket.AF_INET6IP

socket编程及API简介

什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的.    UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议.它是属于TCP/IP协议族中的一种.    这里有一张图,表明了这些协议的关系. Socket在哪里呢?       在上图中,我们没有看到Socket的影子,那么它到底在哪里呢?还是

网络中进程通信-----socket

一.什么是socket? socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",都可以用"打开open –> 读写write/read –> 关闭close"模式来操作.我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭). (1)socket()函数 int socket(int domain, int type, int protoc

什么是socket ??

socket起源于Unix, 而Unix/Linux基本哲学之一就是"一切皆文件", 都可以用"打开open -> 读写write/read -> 关闭close" 模式来操作. 我的理解就是socket就是该模式的一个实现, socket即是一种特殊的文件, 一些socket函数就是对其进行的操作 (读/写IO, 打开, 关闭), 我们在传输数据时, 可以只使用(传输层) TCP/IP 协议, 但是那样的话, 如果没有应用层, 便无法识别数据内容, 如

Socket通信原理探讨(C++为例)

一.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3.共享内存(匿名的和具名的) 4.远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮

Windows Socket编程示例-TCP示例程序

前面一部分是介绍,后面有示例 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问题,网络层的"ip地址"可以唯一标识网络中的主机,而传输层的"协议+端口"可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互. 使用TCP

Linux Socket编程(不限Linux)

话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.so