2.8 套接字编程
2.1 应用层原理概述已经讲解了关于 Socket 的概念。简单来说,Socket 即是位于应用层与传输层之间的的 SAP,应用程序通过调用 Socket API,才能通过使用传输层服务来与其它应用程序建立通信。
按照选取的传输层协议的不同,可以将 Socket 大致分为 UDP Socket 与 TCP Socket。
TCP Socket
从应用程序的角度来看,TCP Socket 能够提供在分布式进程之间的可靠的 字节流 服务。
应用程序通过 TCP Socket 建立通信的一个典型过程如下:
- 服务器首先运行,创建并绑定 Welcome Socket,监听并 阻塞 地等待某个本地端口的连接请求。
- 客户端指定服务器进程的 IP 地址与端口号创建本地的 Socket,同时该套接字由操作系统隐式的绑定了一个本地的端口。客户端使用该 Socket 主动向服务器的对应端口发送连接请求。
- 服务器的欢迎 Socket 监听到来自客户端的连接请求,创建一个 新的专门用于与该客户端通信的 Socket,解除阻塞,与该客户端通信。
- 通信完成后,服务器将该客户端的连接 Socket 建立并销毁,程序回到第 1 步等待其它程序向欢迎 Socket 发送请求。
连接建立后客户端与服务器交互的动作也遵循一个自然而然的次序:客户端主动向服务器发起一个动作指令,服务器被动响应该指令并将结果返回给客户端。
UDP Socket
从应用程序的角度来看,UDP Socket 能够提供在分布式进程之间的不可靠的 字节组 传送服务。
与 TCP 相比,应用程序通过 UDP Socket 通信的过程要简单很多:
- 服务器首先运行,创建并绑定 Socket,直接监听通过该端口发送进来的报文。
- 客户端也创建并绑定 Socket。每当发送报文前,指定目的主机的 IP 地址与端口号。
- 服务器收到报文,该报文还附带一个源主机的 IP 地址与端口号的信息。服务器依据应用协议做出相应响应,封装在一个 UDP 报文内,并依据上面所述的源主机位置信息将该报文发送回去。