客户端与服务器的区别
- 根据用途,服务器可以分为很多种类,其硬件和操作系统与客户端是有所不同的。但是,网络相关的部分,如网卡、协议栈、Socket库等功能和客户端却并无二致。
- 服务器的程序可以同时和多台客户端计算机进行通信
服务器程序的结构
- 当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块(a),这个模块会创建套接字,然后进入等待连接的暂停状态。
- 当客户端连发起连接时,这个模块会恢复运行并接受连接,然后启动客户端通信模块(b),并移交完成连接的套接字。
- 每次有新的客户端发起连接,都会启动一个新的客户端通信模块(b),因此(b)与客户端是一对一的关系
- 服务器操作系统具有多任务、多线程功能,可以同时运行多个程序
- 事先启动几个客户端通信模块,当客户端发起连接时,从空闲的模块中挑选一个出来将套接字移交给它来处理。
服务器端的套接字和端口号
客户端的数据收发(调用Socket
库)
- 创建套接字(创建套接字阶段)
- 用管道连接服务器端的套接字(连接阶段)
- 收发数据(收发阶段)
- 断开管道并删除套接字(断开阶段)
服务器端的数据收发(调用Socket
库)
- 创建套接字(创建套接字阶段)
调用Socket
创建套接字 - 将套接字设置为等待连接状态(等待连接阶段)
调用bind
将端口号写入套接字中,端口号取决于服务器的种类,Web服务器使用80号端口 - 接受连接(接受连接阶段)
调用listen
向套接字写入等待连接状态
调用accept
来接受连接。服务器端处于等待包到达的状态,应用程序会暂停运行。在这个状态下,一旦客户端的包到达,就会返回响应包并开始接受连接操作。协议栈会给等待连接的套接字复制一个副本,然后将连接对象等控制信息写入新的套接字中。
- 收发数据(收发阶段)
等待连接模块会启动客户端通信模块,然后将连接好的新套接字转交给客户端通信模块
原来的那个套接字:还会以等待连接的状态继续存在,当再次调用accept,客户端连接包到达时,它又可以再次执行接受连接操作。接受新的连接之后,和刚才一样,协议栈会为这个等待连接的套接字复制一个新的副本,然后让客户端连接到这个新的副本套接字上
新创建的套接字副本必须和原来等待连接的套接字具有相同的端口号,根据客户端IP地址、客户端端口号、服务器IP地址、服务器端口号
还需要描述符
- 断开管道并删除套接字(断开阶段)