Westmont College 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API) CS 140 Part XV 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API) Chapters 26-28
应用层的功能 传输层及其以下层 应用层 通讯基础 可靠性 抽象 定义了标识网络上物理的和抽象的资源的符号名称。 文件 各种服务 数据库 2019/4/9
二重性 网络 传输位 在应用程序请求下工作 由应用程序的决定 发送什么? 何时发送? 发送至何处? 每个位的含义 2019/4/9
要点 Although an internet system provides a basic communication service, the protocol software cannot initiate contact with, or accept contact from, a remote computer. Instead, two application programs must participate in any communication: one application initiates communication and the other accepts it. 虽然因特网提供了基本的通讯服务, 但是协议软件并不能初始化连接,或是接收来自远程计算机的连接请求。而是在任何通信中,必须要有两个应用程序共同参与: 一个发出连接请求,另外一个接受请求. 从这个角度看,internet更象一个电话系统。 2019/4/9
两个应用程序如何联系 一个应用程序 另一个应用程序 称为: client-server interaction 首先开始执行 在预先设定的位置等待 另一个应用程序 随后开始执行 主动联系低一个程序 称为: client-server interaction 2019/4/9
客户-服务器 模式 应用于所有的网络应用程序 等待被访问的程序叫做服务器 主动连接的程序叫做客户端 2019/4/9
网络通讯 All network applications use a form of communication known as the client-server paradigm. A server application waits passively for contact, while a client application initiates communication actively. 网络应用所使用的通信形式称为客户-服务器模式。服务器应用被动地等待连接,而客户端软件则主动地初始化通讯. 2019/4/9
客户端的特征 任意应用程序 临时成为客户 也可进行其他的计算 由用户直接触发 在本地机运行 动态连接到服务器端 一次只能连接一个服务器端 2019/4/9
服务器特征 有一定功能和权限的程序 专用于提供某种服务 可同时处理多个远程客户端连接 系统启动后自动运行 永远运行 需要高性能的计算机和操作系统支持. 被动等待客户连接 接收任意客户端的请求 2019/4/9
术语 服务器 接收网络客户端连接请求的程序 服务器级计算机 运行服务程序的硬件设备 2019/4/9
数据流 数据流的方向 应用程序协议决定流向 标准通信模型 仅仅从客户端到服务器 仅仅从服务器到客户端 双向流动 客户端发请求 服务端响应 2019/4/9
主要思想 信息可以单向或双向地在客户和服务器之间流动。虽然许多服务是由客户发送一个或更多请求,然后服务器返回响应,但是其它的交互也是可能的. 2019/4/9
客户端,服务端及通信协议 客户端和服务端均为应用程序 2019/4/9
服务端 CPU 的使用情况 事实 结果 服务器的操作类似于其他应用程序 等待数据在网络间传输不需要 CPU时间 使用I/O 操作 等待数据在网络间传输不需要 CPU时间 结果 服务器程序只有在需要服务一个请求时才使用 CPU 2019/4/9
多种服务 在一台计算机上可以提供多种服务 服务器仅在被请求时才会使用处理器 同时提供多个服务需要功能强大的硬件 2019/4/9
多种服务图例 每个服务器可提供一个服务 一个服务器可处理多个客户端 2019/4/9
标识服务 使用协议端口号 每个服务给定唯一的端口号, P 服务器 客户端 通知 OS 它正在使用端口 P 等待请求 提出请求 2019/4/9
关于端口的要点 Transport protocols assign each service a unique port identifier. A server must specify the identifier when it begins execution. A client must specify the identifier when it requests transport protocol software to contact a server. Protocol software on the server computer uses the identifier to direct an incoming request to the correct server. 传输协议分配给每个服务一个唯一的端口标识符. 服务器开始执行的时候必须指明标识符. 客户请求时也要指明标识符.服务器上的协议软件利用标识符将到来的请求定向到相应的服务器. 2019/4/9
理论上 端口号仅仅是数字 任何一个服务器都可以使用任何一个端口号 2019/4/9
实际上 协议端口号用来做服务的唯一标识符 需要统一的编号方式 端口号 允许任意的客户端在任意机器上连接到服务器 避免“服务目录帮助”的需要 整个因特网统一 由标准规定 2019/4/9
术语 顺序程序 绝大部分程序属于此类 单路控制 并发程序 多路控制 并行完成 建立较困难 2019/4/9
服务器和并发 顺序服务器 也被称为循环式服务 每次只能处理一个请求 并发服务器 一次可以处理多个请求 无需等待 2019/4/9
服务器的延迟 并发服务器 顺序服务器 服务器为每个请求建立新线程来处理 客户端只需等待请求被处理 客户端只能等待前面的请求被应答之后才能得到应答 如果长请求阻塞了短请求,用户将无法得到应答 2019/4/9
服务器上的并发性 并发执行是服务器的基础.因为并发性允许多个客户同时得到特定的服务,而不需要等待服务器完成前面的请求. 在并发服务器上,主服务线程创建一个新的服务线程来处理每一个客户请求. 2019/4/9
协议端口和并发服务器 明显的问题 一个端口号只能标记一个服务 并发服务器同时有多个服务在运行 客户端和服务器间可能交互 传送到到同一服务器端口的信息必须进一步正确转交给相应的线程 2019/4/9
协议端口和并发服务器(续) 问题解决方案: 同时利用客户端信息和服务器来标识数据包 TCP 用四项信息来确认连接 服务器的IP地址 服务器的协议端口号 客户端的IP地址 客户端的协议端口号 2019/4/9
Demultiplexing in a Concurrent Server 传输协议给每个客户和服务器分配一个标识符.服务器计算机上的协议软件通过使用客户、服务器标识符的合并来选择正确的并发服务器的副本. 2019/4/9
多协议均可到达的服务 服务器可能使用 同一种服务可以使用多种不同的传输协议 无连接传输协议 (UDP) 有连接的传输协议 (TCP) 对某个服务同时使用两种通信形式 同一种服务可以使用多种不同的传输协议 增加了服务的灵活性 服务器可以同时拥有多个端口号 2019/4/9
复杂的服务 服务器可以 与客户端的交互持续几小时甚至几天 发送短应答,然后结束交互 使用本地机的 I/O 作为客户端连接其他服务器 (潜在循环问题) 2019/4/9
循环问题举例 时间服务器 文件服务器 假设程序员修改时间服务器,记录文件请求的日志,会发生什么? 返还该天当时的时间 允许客户端读写文件 Westmont College CS 140 循环问题举例 时间服务器 返还该天当时的时间 文件服务器 允许客户端读写文件 当文件需要时间标识时,可访问时间服务器 假设程序员修改时间服务器,记录文件请求的日志,会发生什么? 2019/4/9 Chapters 26-28
协议软件的交互 客户端和服务器都使用传输协议 传输协议在OS内部 应用程序在 OS外部 两者之间需要连接 称为 应用程序接口 (API) 2019/4/9
应用程序接口(API) 操作系统的一部分 允许应用程序使用协议 定义 允许的操作 每次操作的参数 2019/4/9
Socket API 初始设计 现况 为 BSD UNIX设计 与 TCP/IP 同时使用 成为工业标准 被许多操作系统支持 2019/4/9
套接字和套接字库 在没有提供本地套接字的计算机系统上,套接字库能够为应用程序提供套接字API。 当应用调用某个套接字过程时,控制转向库例程,这些库例程调用一个或多个底层操作系统的功能来实现套接字功能. 2019/4/9
Socket 一种OS 抽象 (而非硬件的) 动态生成 仅在应用程序运行时启用 用描述符来标识一个套接字 当应用调用底层过程通过网络传输数据时,应用会把该描述字作为一个参数,这样就无需知道远程目标的细节。 2019/4/9
描述符Descriptor 小的整数 每个激活的 socket 一个 在所有的 socket操作中运用 当 socket 建立后由OS产生 在 UNIX 下, 与文件描述符集成 2019/4/9
创建一个 Socket 应用程序调用 socket 函数 desc = socket(protofamily,type,proto); OS 返回 socket 的描述符 描述符有效至应用程序关闭或退出socket 一般: protofamily = PF_INET, 表示TCP/IP协议族 type = SOCK_STREAM or流 SOCK_DGRAM报文 desc = socket(protofamily,type,proto); 2019/4/9
Socket 的功能 Socket 具有广泛的普遍性 可以被以下对象使用 具有大量的操作 客户端 服务器 CO 传输协议 CL 传输协议 用于发送/接收数据 具有大量的操作 2019/4/9
Socket 的操作 关闭 停止使用 socket 永久性的 close(socket); 2019/4/9
Socket 的操作 捆绑 bind(socket,localaddr,addrlen); 为socket指定端口 为 socket 指定一个本地IP地址 对任意IP地址可以使用 INADDR_ANY bind(socket,localaddr,addrlen); 2019/4/9
通用地址格式 struct sockaddr { u_char sa_len; /*length of address*/ u_char sa_family; /*family of address*/ char sa_data[14]; /*address itself*/ } 2019/4/9
TCP/IP 地址形式 struct sockaddr_in { u_char sin_len; /*length of address*/ u_char sin_family; /*family of address*/ u_short sin_port; /*protocol port number*/ struct in_addr sin_addr; /*IP address*/ char sin_zero[8]; /*not used(set to zero)*/ } 2019/4/9
Socket 操作(续) 监听 接收 listen(socket,queuesize); 供服务器使用 准备socket来接收到来的连接 接收 等待下一次连接并返回一新的 socket listen(socket,queuesize); newsock = accept(socket,caddr,caddrlen); 2019/4/9
Socket操作(续) 连接 connect(socket,saddr,saddrlen); 供客户端使用 完成以下其中任一个 完成一个 TCP 连接 为 UDP指明地址 connect(socket,saddr,saddrlen); 2019/4/9
Connect函数的两个用途 Connet过程是由客户端调用的,它有两个用途. 当使用面向连接传输, connect 复杂与指定的服务器建立一个传输连接. 当使用无连接、传输时, connect 负责在套接字中记录服务器地址。这样,客户不需要为每条消息指定目的地址,就可向同一服务器发送多个消息。 2019/4/9
SOCKET操作(续) Send, sendto,和sndmsg send(socket,data,length,flags); 从应用程序传出数据 send(socket,data,length,flags); sendto(socket,data,length,flags, destaddr,addrlen); sendmsg(socket,msgstruct,flags); 2019/4/9
Msgstruct的结构 struct msgstruct { struct sockaddr *m_saddr; /*dest address*/ struct datavec *m_dvec; /*message (vector)*/ int mdvlength; /*size of vector*/ struct access *m_rights; /*access rights*/ int m_alength; /*size of access rights*/ } 2019/4/9
SOKET操作(续) Recv, recvfrom, 和recvmsg recv(socket,buffer,length,flags); 将接收数据转给应用程序 recv(socket,buffer,length,flags); recvfrom(socket,buffer,length,flags, senderaddr,saddrlen); recvmsg(socket,msgstruct,flags); 2019/4/9
SOKET操作(续) 其它的许多附加功能 提供支持和额外服务功能 一些由库实现 2019/4/9
Socket 支持功能举例 Gethostbyname Getprotobyname 把域名镜像成IP地址 举例 根据协议名得到主机代码 www.nuaa.edu.cn Getprotobyname 根据协议名得到主机代码 参数常取 “tcp” or “udp” 2019/4/9
服务举例 目的 记录访问它的客户的数目 返回可打印的ASCII码信息 面向连接协议 顺序执行 (非并发) 2019/4/9
客户端 打开 TCP 连接到服务器 重复直到文件结束: 接收正文 打印收到的字符 关闭连接 退出 2019/4/9
服务器举例 建立socket并进入被动模式 无限重复: 注意 接收连接,得到新的socket 计数增加并送出文本信息 服务器永不退出 2019/4/9
服务器和客户端的调用 客户端用后关闭 socket 服务器永不关闭初始的 socket 2019/4/9
客户端代码 程序参数 细节 克服不同版本Socket的不同 客户端代码列表 主机 协议口 以上均可选 Unix Microsoft Use C language #ifdef 客户端代码列表 2019/4/9
客户端代码 2019/4/9
2019/4/9
2019/4/9
2019/4/9
2019/4/9
服务器代码 程序参数 协议口 C language #ifdefs for socket variants 服务器代码列表 2019/4/9
2019/4/9
2019/4/9
2019/4/9
2019/4/9
流接口 发送方 TCP 接收方 Calls send repeatedly 指出每次调用的字节数 把流分割为segments Calls recv repeatedly 每次调用接收一个或多个字节 零字节意味文件结束 接收的长度与发送的长度无关 2019/4/9
总结 应用程序总是采用客户端/服务器模式交互 客户端 任意应用程序 主动开始通信 必需知道服务器的 IP 地址 协议端口号 2019/4/9
总结(续) 服务器 专用程序 永远运行不停止 一般提供一个服务 消极等待客户端请求 可以同时处理多个客户端 2019/4/9
总结(续) Socket API Socket 标准化的 介于应用程序和协议软件之间 操作系统抽象 动态建立 由客户端和服务器使用 2019/4/9