# Socket
:又称为套接字,位于会话层。
- 是在 TCP、UDP 协议的基础上创建虚拟端口,从而区分同一个主机上不同进程收发的 TCP、UDP 数据包。
- 应用层的进程进行通信时,通过 IP 协议只能定位目标主机,不能定位目标主机上的进程。因此,通常使用 Socket 进行 TCP、UDP 通信。
- 简单的情况下,用
IP:PORT
两个参数可以确定一个 Socket 。比如127.0.0.1:80
。- IP :IPv4 或 IPv6 地址,用于定位主机。
- PORT :端口号,用于定位主机上的进程。
- 实际上,Socket 通信中的数据包一般包含以下信息:
- SRC-IP、SRC-PORT :发送方的 Socket 。
- DEST-IP、DEST-PORT :接收方的 Socket 。
- PROTOCOL :协议,是 int 型值,默认为 0 。
- 如果使用不同的协议,同一主机上的不同进程就可以绑定同一个端口,一个进程也可以重复绑定一个端口。
例:
- 假设主机 A 的 IP 为 10.0.0.1 ,其上有一个进程 a ,申请使用 TCP 80 端口。
- 主机 A 将 TCP 80 端口绑定到进程 a 。
- 如果其它主机上的进程想与进程 A 通信,就发送 TCP 数据包,目标 Socket 为:10.0.0.1:80
- 路由器收到 TCP 包之后,会将它转发给 IP 相符的主机 A 。
- 主机 A 收到 TCP 包之后,会将它转发给绑定 80 端口的进程 A 。(此过程称为进程 A 在监听 80 端口)
- 进程 A 收到 TCP 包之后,可以从中发现发送方的 Socket ,作出回复。
# 端口号
- 端口号在 TCP/UDP 报文中存储为 16 位的无符号整数,因此取值范围为 0~65535 。
- 如果进程申请监听端口 0 ,则会被随机分配一个可用端口来监听。如下:
[[email protected] ~]# python3 -m http.server 0 Serving HTTP on 0.0.0.0 port 33720 (http://0.0.0.0:33720/) ...
- 小于 1024 的端口通常被系统服务、标准通信协议使用,不建议普通进程使用。例如:
- FTP 协议 :20、21
- SSH 协议 :22
- telnet 协议 :23
- SMTP 协议 :25
- HTTP 协议 :80
- HTTPS 协议 :443
# Socket API
- 操作系统一般会提供 Socket 通信的 API ,比如 bind、send、close 等。
# ♢ socket
:Python 的标准库,用于进行 Socket 通信。