(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協即選定套接字類型為數據報式套接字,數據報套接字通信流程如下圖所示
?