《数据通信笫二十二讲Socket编程》由会员分享,可在线阅读,更多相关《数据通信笫二十二讲Socket编程(41页珍藏版)》请在金锄头文库上搜索。
1、数据通信与计算机网络(第二版 ) 电子教案笫二十二讲Socket编程1本讲内容第八章 运输层 8.4 Socket编程 8.4.1 Socket接口概念 8.4.2 Socket编程模型 8.4.3 Unix Socket编程 8.4.4 WinSock编程28.4.1 Socket接口概念 Socket接口是TCP/IP网络通信的API。它规定了 许多函数和例程,程序员可以用它们来开发 TCP/IP网络上的应用程序。 网间进程通信 不同主机进程间的相互通信。 端口 网络中可以被命名和寻址的通信端点,是操作系统可 分配的一种资源,用于标识通信的进程(如TCP或 UDP端口)。 端口类似于文件描
2、述符,端口操作类似于一般的I/O操 作。 进程在使用端口前需要将自己与该端口号联系起来(绑定)。38.4.1 Socket接口概念 端口号有两种基本分配方式 全局分配 由一个公认的中央机构统一管理和分配,并将结果公布于众( 著名端口)。 TCP和UDP规定,小于1024的端口号作为全局分配的保留端 口。 如21、80、110等。 本地分配(动态连接) 进程需要访问传输层服务时,向本地操作系统提出申请,操作 系统返回一个本地唯一的端口号。 TCP和UDP规定,大于1024的端口号用于本地分配的自由端 口。 TCP/IP端口号的分配综合了上述两种方式。 48.4.1 Socket接口概念 地址 网
3、络通信中通信的两个进程分别在不同的机器上。 主机上的进程通过三级寻址: 网络地址; 网络上的主机地址; 主机上的进程标识。 TCP/IP主机地址由网络ID和主机ID组成(32位IP地址 );进程标识使用端口号(16位)。 网络字节顺序 为保证数据的正确性,在网络协议中须指定网络字节 顺序。 TCP/IP使用16比特整数和32比特整数的高价先存格式 。 58.4.1 Socket接口概念 连接 两个进程间的通信链路称为连接。 连接在内部表现为一些缓冲区和一组协议机制,在外 部表现出比无连接高的可靠性。 半相关 网络中在全局唯一标识一个进程的三元组:(协议,本 地地址,本地端口号)。 它指定连接的
4、每半部分。 全相关 标识一个完整的网间通信的五元组:(协议,本地地址 ,本地端口号,远地地址,远地端口号)。 即两个协议相同的半相关组合成一个合适的相关,即 完全组成一连接。68.4.1 Socket接口概念 服务方式 “服务”是描述相邻层之间关系的抽象概念,即网络中各 层向紧邻上层提供的一组操作。 下层是服务提供者,上层是请求服务的用户。 服务的表现形式是原语(primitive),如系统调用或库 函数。 TCP/IP传输层以不同的服务方式提供“端到端”通信。 面向连接和无连接服务 TCP提供面向连接的字节流服务。 UDP提供无连接的数据报服务。 顺序 指接收数据顺序与发送数据顺序相同。 T
5、CP提供顺序服务。 78.4.1 Socket接口概念 差错控制 保证应用程序接收的数据无差错的一种机制。 如校验 和、确认等。 TCP提供差错控制服务。 流控制 在数据传输过程中控制数据传输速率的一种机制,以 保证数据不被丢失。 TCP提供流控制服务。 字节流 仅把传输中的数据段看作是一个字节序列,不提供数 据流的任何边界。 TCP提供字节流服务。 88.4.1 Socket接口概念 数据报 接收方要保存发送方的数据报边界。 UDP提供数据报服务。 全双工/半双工 端-端间数据同时以两个方向/一个方向传送。 TCP/IP的端到端通信是全双工的。 缓存 TCP/IP运输实体具备缓存能力。 紧急
6、数据 TCP支持紧急数据功能。98.4.1 Socket接口概念 在TCP/IP网络应用中,通信的两个进程间相互作 用的主要模式是客户/服务器(Client/Server, C/S)模式 客户向服务器发出服务请求,服务器接收到请求后, 提供相应的服务。 C/S模式的建立基于以下两点: 建立网络的起因是网络中软硬件资源、运算能力和信 息不均等,需要共享 。 网间进程通信完全是异步的。 108.4.1 Socket接口概念 C/S模式在操作过程中采取的是主动请求方式 服务器方(进程)先启动,并根据请求提供相应服务a) 打开一通信通道并告知本地主机,它愿意在某一端 口上(如HTTP使用80)接收客户
7、请求; b) 等待客户请求到达该端口; c) 接收到重复服务请求,处理该请求并发送应答信号 ;接收到并发服务请求,激活一新进程来处理这个 客户请求。服务完成后,关闭此新进程与客户的通 信链路,并终止。 d) 返回第二步,等待另一客户请求。 e) 关闭服务器。118.4.1 Socket接口概念 客户方(进程)a) 打开一通信通道,并连接到服务器所在主机的特定 端口; b) 向服务器发服务请求报文,等待并接收应答;继续 提出请求. c) 请求结束后关闭通信通道并终止。 从上面所描述过程可知: 客户与服务器进程的作用是非对称的,因此编码不 同。 服务进程一般是先于客户请求而启动的。只要系统 运行,
8、该服务进程一直存在,直到正常或强迫终止 。128.4.1 Socket接口概念 TCP/IP socket提供三种类型套接字 流式(stream)套接字 提供面向连接、可靠的数据流传输服务,数据无差错 、无重复地发送,且按发送顺序接收。 数据报式(datagram)套接字 提供无连接服务。数据包以独立包形式被发送,不提 供无错保证,数据可能丢失或重复,并且接收顺序混 乱。 原始式(raw)套接字 允许对较低层协议,如IP、ICMP直接访问。138.4.2 Socket编程模型 Socket网络通信模型 网络通信最终是由两台主机上的两个进程完成,通过 网络传递它们之间的数据,它实现的是网络间进程
9、通 信。 网络通信对话的每一端称为一个端点,当使用Socket 接口对网络通信编程时,Socket是网络通信过程中端 点的抽象表示。 实践中,Socket由主机地址和TCP/UDP端口号等组成 。为了通过Socket接口进行网络通信,程序在网络对 话的每端都需要一个Socket。 两个Socket之间的通信可以是面向连接的(点对点连接 ,实现TCP通信)也可以是无连接的(实现UDP通信)。148.4.2 Socket编程模型 从网络的角度看,Socket是通信连结的端点;从程序 设计者的角度看,Socket是编写网络通信程序的API。 Socket接口使用Unix系统传统的I/O命令集处理模式
10、 ,即“打开-读-写-关闭(open-read -write -close)”这样 的处理过程。158.4.3 Unix Socket编程 Unix下许多网络调用都需要一个变元,该变元是 指向Socket地址结构的指针。 在中定义: struct sockaddr 在中定义: struct in_addr struct sockaddr_in168.4.3 Unix Socket编程1、建立一个Socket 为了进行网络I/O,第一件事就是建立Socket。 它调用Socket函数,指定所要求的协议的类型 (TCP/UDP/IP等),返回一个类似文件描述符的句柄: Socket_handler
11、 = socket(int family,int type,int protocol) 调用Socket函数时,Socket执行体将建立一个Socket ,并返回一个指向描述符表入口的Socket句柄(或描 述符)。Socket执行体为用户管理描述符表。访问描 述符表的唯一途径是通过Socket描述符。 在通信完成之后,用户应该通过调用close函数来关闭 Socket,释放所分配的资源: Result = close(int sock_handle)178.4.3 Unix Socket编程 2、配置Socket 面向连接的客户程序使用connect 函数来配置 Socket。 connec
12、t函数要求用户指定一个Socket句柄、一个包含 远地主机信息的地址结构和此地址结构的长度: Result = connect(int socket_handle, struct sockaddr *servaddr, int addrlen) 由于无连接客户程序没有和远地主机建立直接连接, 所以它必须对协议端口进行侦听,以便接收对它的服 务请求所产生的数据报应答。同样,为了接收客户的 请求,服务器程序必须对一个特定的协议端口进行侦 听。Socket API中的bind函数让程序将一个本地地址( 包括主机地址和协议端口)和一个Socket联系起来: Result = bind(int sock
13、et_handle, struct sockaddr *myaddr, int addrlen) 188.4.3 Unix Socket编程3、通过Socket传输数据 通过一个连接的Socket发送数据 使用面向连接数据的Socket API函数不需要目的地址而 使用Socket句柄作为其参数: Result = write(int socket_handle, chat *message_buffer, int buffer_length); Result = writev(int socket_handle, struct iovec io_vector, int iovcount);
14、Result = send(int socket_handle, char *buffer, int bufflen, int special_flags) 这三个函数都返回一个整数值:如果正确执行,函数 将返回传送的字节数;如果发生错误,函数返回-1。198.4.3 Unix Socket编程 通过一个无连接的Socket发送数据 为了通过一个无连接的Socket发送数据,可以使用 sendto和sendmsg这两个Socket API函数。 Result = sendto(int socket_handle, char *buffer, int buflen, int flags, str
15、uct sockaddr *to, int addrlen); Result = sendmsg(int socket_handle, struct msghdr *msg, int special_flags) sendmsg 函数传输数据时,让用户使用一个报文结构 而不是一个简单的数据缓冲区。208.4.3 Unix Socket编程 通过Socket接收数据 Socket接口包括五个与传送数据函数相对应的接收函 数(read,readv,recv,recvfrom,recvmsg)。对应的 传送接收函数使用同样的参数。 Result = read(int sock_handle,chat* buffer,int length); Result = readv(int sock_handle,struct iovec iov, int iovcount); Result = recv(int sock_handle,char *buf,int len,int flags); Result = recvfrom(int sock_handle,char *buf,int len ,struct sockaddr *fromaddr,int fromlen) ; Result = recvmsg(int sock_handle,struc