# 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 。
      • 如果使用不同的协议,同一主机上的不同进程就可以绑定同一个端口,一个进程也可以重复绑定一个端口。

例:

  1. 假设主机 A 的 IP 为 10.0.0.1 ,其上有一个进程 a ,申请使用 TCP 80 端口。
  2. 主机 A 将 TCP 80 端口绑定到进程 a 。
  3. 如果其它主机上的进程想与进程 A 通信,就发送 TCP 数据包,目标 Socket 为:10.0.0.1:80
  4. 路由器收到 TCP 包之后,会将它转发给 IP 相符的主机 A 。
  5. 主机 A 收到 TCP 包之后,会将它转发给绑定 80 端口的进程 A 。(此过程称为进程 A 在“监听”80 端口)
  6. 进程 A 收到 TCP 包之后,可以从中发现发送方的 Socket ,作出回复。

# 端口号

  • 端口号在 TCP/UDP 报文中存储为 16 位的无符号整数,因此取值范围为 0~65535 。
  • 如果进程申请监听端口 0 ,则会被随机分配一个可用端口来监听。如下:
    [root@CentOS ~]# 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 通信。