套接字编程
1.1 套接字概念
网络中不同主机上的应用进程之间进行双向通信的端点的抽象:
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点这种端点
就叫做套接字(socket)或插口
这里出现了几个陌生的概念:
- ip地址:依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。
- 端口号:用来辨别本地通讯进程,一个本地的进程在通讯时会占用一个端口号,不同的进程端口号不同,因此在通讯前必须分配一个没有被访问的端口号。
- 半相关:网络中用一个三元组可以在全局唯一标志一个进程。(三元组:协议,本地ip地址,本地端口号)
- 全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议,也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。
- 连接:两个进程间的通讯链路。
所以,一个完整的网间通信是一个五元组标识:协议,本地地址,本地端口号,远地地址,远地端口号。这样一个五元组,叫做一个相关,即两个协议相同的版相关才能组合成一个合适的相关。
2.C/S模式简介
在TCP/IP网络应用中,通信的两个进程相互作用的主要模式是客户/服务器(Client/Server,C/S)模式。客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。
2.1服务器端
其过程是首先服务器要先启动,并根据请求提供相应服务:
- 打开通信通道并告诉本地主机,它愿意在某一公认地址上的某一端口接受用户请求。
- 等待客户请求到达该端口。
- 接收到客户端的服务请求时,处理请求并发送应答信号。接收到并发服务请求,要激活一个新进程来处理这个客户请求(如UNIX系统中fork,exec) 新进程处理此客户的请求,并不需要对其请求做出应答,服务完成后,关闭此新进程与客户的通信链路,并终止。
- 返回第2步,继续等待另一个客户请求。
- 关闭服务器
2.2客户端
- 打开通信通道,并连接到服务器所在主机的特定端口。
- 向服务器发服务请求报文,等待并接收应答;继续提出请求。
- 请求结束后关闭通信通道并终止。
我们从上面的流程可以得知,客户与服务器进程的作用是非对称的,因此代码不同。服务器进程一般是先启动的,只要系统运行,该服务进程就一直存在&