每日分享一个有趣的计算机小知识,今日话题:Socket
socket [ˈsɑːkɪt] 作英语名词时表示:插座、插孔、凹槽、窝、孔穴。在计算机领域,socket 被翻译为套接字,它是操作系统提供的进程间网络通信接口(并不是具体实现,不同的系统和语言可以实现不同),使得不同主机或同一主机上的应用程序可以在网络中进行数据传输。
Socket 起源于 Unix 系统,于1983年正式发布,它解决了网络编程中各种协议细节复杂、跨平台兼容性差的问题,统一了网络通信的编程接口。
它本质上是一个抽象接口,位于应用层和传输层之间,屏蔽了底层网络协议的复杂细节,将TCP、UDP等底层协议的调用封装成简单的 API(如bind、listen、accept、connect、send、recv、close),让开发者无需直接操作复杂的协议细节就能实现网络通信。
下面以TCP协议传输数据为例演示,括号里以打电话举例
服务器端步骤:
创建Socket => 绑定端口 => 监听连接 => 接受连接 => 收发数据 => 关闭连接
1. 创建 Socket
调用 socket() 函数,创建一个 TCP 类型的 Socket。(先 装个电话)
2. 绑定端口
调用 bind() 函数,将 Socket 与端口绑定,告诉操作系统监听这个端口。(给电话绑个固定号码:IP + 端口)
3. 监听连接
调用 listen() 函数,让 Socket 进入监听状态,等待客户端连接。(开机等着)
4. 接受连接
调用 accept() 函数,阻塞等待客户端连接;当有客户端连接时,返回一个新的 Socket(专门用于与该客户端通信),原 Socket 继续监听其他连接。(有人打来电话就接)
5. 收发数据
通过新 Socket 的 recv() 接收和 send() 发送函数与客户端交互。(接了电话之后就可以聊天)
6. 关闭连接
通信结束后,调用 close() 关闭 Socket。(聊完挂电话)
客户端步骤:
创建Socket => 发起连接 => 收发数据 => 关闭连接
1. 创建 Socket
调用 socket() 函数,创建 TCP Socket。(也先装个电话)
2. 发起连接
调用 connect() 函数,向服务器发起连接,触发三次握手。(有事拨服务器的号码)
3. 收发数据
连接建立后,通过 send() 和 recv() 与服务器进行数据交互。(电话通了就能互相聊天)
4. 关闭连接
调用 close() 关闭 Socket,触发四次挥手。(聊完挂电话)
还有一个跟 Socket 名字很像的叫 WebSocket,它是基于 TCP 的一种应用层、全双工、有状态、长连接、双向的网络通信协议,于2011年被 IETF 定为正式标准。弥补了 HTTP 协议只能由客户端发起通信的缺陷,让服务端也能主动向客户端推送数据。
它通过一次HTTP握手建立持久连接,后续通信复用同一TCP通道,连接后再用真正的 WebSocket 协议来进行通信,广泛应用于网页实时聊天、实时数据监控、直播弹幕、在线协作工具等浏览器端需要实时交互的场景。