Socket

Socket(套接字) 是计算机网络编程里最核心的概念之一,可以理解为**“网络通信的端点”**,用来让两台设备上的程序互相收发数据。


一句话理解

Socket = IP 地址 + 端口号
就像:IP 是小区地址,端口是门牌号,Socket 就是“某小区某栋某室”,用来精准找到通信的那一端。


Socket 是什么?

在操作系统中,Socket 是一种文件描述符/抽象接口,应用程序通过它:

  • 发起连接(客户端)
  • 监听连接(服务器)
  • 发送 / 接收数据

它是 TCP/IP 协议栈 暴露给应用层的 API(最典型的是 BSD Socket)。


Socket 的工作流程(以 TCP 为例)

服务器端

  1. socket():创建套接字
  2. bind():绑定 IP + 端口
  3. listen():开始监听连接
  4. accept():接受客户端连接
  5. recv() / send():读写数据
  6. close():关闭连接

客户端

  1. socket():创建套接字
  2. connect():连接服务器 IP + 端口
  3. send() / recv():读写数据
  4. close():关闭连接

常见 Socket 类型

类型 说明 典型场景
TCP Socket(SOCK_STREAM 面向连接、可靠、流式 HTTP、FTP、数据库连接
UDP Socket(SOCK_DGRAM 无连接、不可靠、报文式 视频通话、DNS、游戏
Unix Domain Socket 本机进程间通信 Nginx ↔ PHP-FPM
Raw Socket 直接操作 IP 层 ping、网络扫描

简单示例(Python TCP)

服务端

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8888))
s.listen(1)

conn, addr = s.accept()
print("Connected by", addr)
data = conn.recv(1024)
conn.sendall(data.upper())
conn.close()

客户端

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8888))
s.sendall(b'hello')
data = s.recv(1024)
print(data.decode())
s.close()

Socket vs HTTP

  • Socket:底层通信机制,可自定义协议
  • HTTP:基于 TCP Socket 的应用层协议,有固定格式

几乎所有网络应用(浏览器、数据库、消息队列)底层都是 Socket。


常见面试/实战点

  • TCP 三次握手发生在 connect() / accept() 阶段
  • select / poll / epoll:高并发 I/O 多路复用
  • 粘包 / 拆包问题(TCP 流式特性)
  • 阻塞 vs 非阻塞 Socket
  • C10K 问题
上一篇
下一篇