(3)套接字(socket)
一个完整的网络应用程序包括客户端和服务器两个部分。网间通信进程需要由两个进程组成,并且只能用同一种协议。也就是说,不能在通信的一端使用TCP协议,而另一端则用UDP协议。一个完整的网络通信需要一个五元组来标识:协议、本地地址、本地端口号、远端地址、远端端口号。
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与Tcp,Udp协议交互提供了称为套接字(socket)的接口。套接字是一个通信终结点,它是Sockets应用程序用来在网络上发送或接收数据包的对象。套接字具有类型,与正在运行的进程相关联,并且可以有名称。使用套接字的应用程序间通信模型如图所示。
在网络上,一个套接字由一个IP地址和一个端口号唯一确定。套接字的地址指该套接字所在计算机的网络地址,可以为域名或IP地址的形式。同一计算机上可以运行多个网络应用程序,每个应用程序都有自己的套接字用以进行网络通信,此时如果只有地址标识套接字,则当一个通信包到达计算机时,将无法确定究竟是哪个应用程序的套接字需要接收此信息。由此增加了端口的概念,以协助区分同一计算机上不同应用程序的套接字。端口用于标识进程,同一计算机上不同的网络应用程序各有不同的端口,这样,通过“网络地址+端口号”的标识方法,便唯一标识了计算机上的应用程序了I,刀。某些端口是专门为公共服务保留的,如FtP:21,httP:80,除非程序是要提供这些服务,否则应避免使用这些端口。一般来说,端口1024以前的端口号都是系统保留的或是作为公共服务的,应尽量选择大于1024的端口号,以避免冲突。套接字一般分为三种类型:
①流式套接字(SOCK--STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。而且发送的数据是按顺序接收的。所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP使用该类接口。
②数据报式套接字(SOCK--DGRAM):数据报式套接字提供了面向无连接的服务,不提供正确性检查,也不保证各数据包的发送顺序,因此,可能出现数据的重发、丢失等现象,并且接收顺序由具体路由决定。然而,与流式套接字相比,使用数据报式套接字对网络线路占用率较低。在TCP月P协议组中,UDP使用该类套接字。
③原始套接字(SOCK--R戌w):该套接字一般不会出现在高级网络接口的现中,因为它是直接针对协议的较低层(如IP、TcP、UDP等)直接访问的。用于检验新的协议实现或访问现有服务中配置的新设备,使用原始套接字存在络应用程序的兼容性问题,所以一般不推荐使用原始套接字。
综合以上所述,由于本系统网络通信传输视频数据,在传输层选用UDP协即选定套接字类型为数据报式套接字,数据报套接字通信流程如下图所示