簡(jiǎn)介
Socket最早是應(yīng)用于UNIX系統(tǒng)的一種通信模式UNIX系統(tǒng)下的所有操作均是面向文件的即Socket的通信模式也是基于文件操作的?客戶(hù)端和服務(wù)端均對(duì)一個(gè)文件完成“打開(kāi)-讀/寫(xiě)-關(guān)閉”的操作通過(guò)此文件傳輸信息完成通信。7
套接字是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。可以將套接字看作不同主機(jī)間的進(jìn)程進(jìn)行雙間通信的端點(diǎn),它構(gòu)成了單個(gè)主機(jī)內(nèi)及整個(gè)網(wǎng)絡(luò)間的編程界面。套接字存在于通信域中,通信域是為了處理一般的線(xiàn)程通過(guò)套接字通信而引進(jìn)的一種抽象概念。套接字通常和同一個(gè)域中的套接字交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時(shí)一定要執(zhí)行某種解釋程序),各種進(jìn)程使用這個(gè)相同的域互相之間用Internet協(xié)議簇來(lái)進(jìn)行通信3。
Socket(套接字)可以看成是兩個(gè)網(wǎng)絡(luò)應(yīng)用程序進(jìn)行通信時(shí),各自通信連接中的端點(diǎn),這是一個(gè)邏輯上的概念。它是網(wǎng)絡(luò)環(huán)境中進(jìn)程間通信的API(應(yīng)用程序編程接口),也是可以被命名和尋址的通信端點(diǎn),使用中的每一個(gè)套接字都有其類(lèi)型和一個(gè)與之相連進(jìn)程。通信時(shí)其中一個(gè)網(wǎng)絡(luò)應(yīng)用程序?qū)⒁獋鬏數(shù)囊欢涡畔?xiě)入它所在主機(jī)的 Socket中,該 Socket通過(guò)與網(wǎng)絡(luò)接口卡(NIC)相連的傳輸介質(zhì)將這段信息送到另外一臺(tái)主機(jī)的 Socket中,使對(duì)方能夠接收到這段信息。 Socket是由IP地址和端口結(jié)合的,提供向應(yīng)用層進(jìn)程傳送數(shù)據(jù)包的機(jī)制2。
Socket是面向客戶(hù)/服務(wù)器模型而設(shè)計(jì)的。通信的一方扮演客戶(hù)機(jī)的角色,另一方扮演服務(wù)器的角色。服務(wù)器在運(yùn)行中一直監(jiān)聽(tīng)套接字指定的傳輸層端口,并等待著客戶(hù)機(jī)的連接請(qǐng)求。當(dāng)服務(wù)器端收到客戶(hù)機(jī)發(fā)來(lái)的連接請(qǐng)求以后,服務(wù)器會(huì)接受客戶(hù)機(jī)的連接請(qǐng)求,雙方建立連接后,就可進(jìn)行數(shù)據(jù)的傳遞。6
表示方法
套接字包括 IP 地址和端口號(hào)兩個(gè)部分。通過(guò)網(wǎng)絡(luò)通信的每對(duì)進(jìn)程需要使用一對(duì)套接字。不同的進(jìn)程之間的通信所使用的套接字是不一樣的,套接字可以用來(lái)區(qū)分不同的進(jìn)程之間的數(shù)據(jù)傳輸。套接字主要有目標(biāo)IP、傳輸層使用的傳輸協(xié)議、傳輸層使用的端口號(hào)這3個(gè)重要參數(shù)。6
套接字Socket=(IP地址:端口號(hào)),套接字的表示方法是點(diǎn)分十進(jìn)制的lP地址后面寫(xiě)上端口號(hào),中間用冒號(hào)或逗號(hào)隔開(kāi)。每一個(gè)傳輸層連接唯一地被通信兩端的兩個(gè)端點(diǎn)(即兩個(gè)套接字)所確定。例如:如果IP地址是210.37.145.1,而端口號(hào)是23,那么得到套接字就是(210.37.145.1:23)4。
主要類(lèi)型
Socket處于網(wǎng)絡(luò)協(xié)議的傳輸層套接字可以分為流套接字、數(shù)據(jù)報(bào)套接字和原始套接字3種不同的類(lèi)型。6
1.流套接字(SOCK_STREAM)
流套接字用于提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù)。該服務(wù)將保證數(shù)據(jù)能夠?qū)崿F(xiàn)無(wú)差錯(cuò)、無(wú)重復(fù)送,并按順序接收。流套接字之所以能夠?qū)崿F(xiàn)可靠的數(shù)據(jù)服務(wù),原因在于其使用了傳輸控制協(xié)議,即TCP(The Transmission Control Protocol)協(xié)議3。
2.數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)
數(shù)據(jù)報(bào)套接字提供一種無(wú)連接、不可靠的服務(wù)。該服務(wù)并不能保證數(shù)據(jù)傳輸?shù)目煽啃?數(shù)據(jù)有可能在傳輸過(guò)程中丟失或出現(xiàn)數(shù)據(jù)重復(fù),且無(wú)法保證順序地接收到數(shù)據(jù)。數(shù)據(jù)報(bào)套接字使用UDP( User DatagramProtocol)協(xié)議進(jìn)行數(shù)據(jù)的傳輸。由于數(shù)據(jù)報(bào)套接字不能保證數(shù)據(jù)傳輸?shù)目煽啃?,?duì)于有可能出現(xiàn)的數(shù)據(jù)丟失情況,需要在程序中做相應(yīng)的處理3。
3.原始套接字(SOCK_RAW)
原始套接字與標(biāo)準(zhǔn)套接字(標(biāo)準(zhǔn)套接字指的是前面介紹的流套接字和數(shù)據(jù)報(bào)套接字)的區(qū)別在于:原始套接字可以讀寫(xiě)內(nèi)核沒(méi)有處理的IP數(shù)據(jù)包,而流套接字只能讀取TCP協(xié)議的數(shù)據(jù),數(shù)據(jù)報(bào)套接字只能讀取UDP協(xié)議的數(shù)據(jù)。因此,如果要訪問(wèn)其他協(xié)議發(fā)送的數(shù)據(jù)必須使用原始套接3。原始套接字主要用于一些協(xié)議的開(kāi)發(fā),可以進(jìn)行比較底層的操作。6
工作流程
要通過(guò)互聯(lián)網(wǎng)進(jìn)行通信,至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶(hù)端,稱(chēng)之為 Client Socket,另一個(gè)運(yùn)行于服務(wù)器端,稱(chēng)之為 Server Socket3。
根據(jù)連接啟動(dòng)的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過(guò)程可以分為三個(gè)步驟3:
(1)服務(wù)器監(jiān)聽(tīng)。
(2)客戶(hù)端請(qǐng)求。
(3)連接確認(rèn)3。
1.服務(wù)器監(jiān)聽(tīng)
所謂服務(wù)器監(jiān)聽(tīng),是指服務(wù)器端套接字并不定位具體的客戶(hù)端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)3。
2.客戶(hù)端請(qǐng)求
所謂客戶(hù)端請(qǐng)求,是指由客戶(hù)端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶(hù)端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端接字提出連接請(qǐng)求3。
3.連接確認(rèn)
所謂連接確認(rèn),是指當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶(hù)端套接字的連接請(qǐng)求,就會(huì)響應(yīng)客戶(hù)端套接字的請(qǐng)求,建立一個(gè)新的線(xiàn)程,并把服務(wù)器端套接字的描述發(fā)送給客戶(hù)端。一旦客戶(hù)端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),接收其他客戶(hù)端套接字的連接請(qǐng)求3。
主要特點(diǎn)
根據(jù)套接字的不同類(lèi)型,可以將套接字調(diào)用分為面向連接服務(wù)和無(wú)連接服務(wù)5。
面向連接服務(wù)的主要特點(diǎn)如下:
(1)數(shù)據(jù)傳輸過(guò)程必須經(jīng)過(guò)建立連接、維護(hù)連接和釋放連接3個(gè)階段5;
(2)在傳輸過(guò)程中,各分組不需要攜帶目的主機(jī)的地址5;
(3)可靠性好,但由于協(xié)議復(fù)雜,通信效率不高5。
面向無(wú)連接服務(wù)的主要特點(diǎn)如下:
(1)不需要連接的各個(gè)階段5;
(2)每個(gè)分組都攜帶完整的目的主機(jī)地址,在系統(tǒng)中獨(dú)立傳送5;
(3)由于沒(méi)有順序控制,所以接收方的分組可能出現(xiàn)亂序、重復(fù)和丟失現(xiàn)象5;
(4)通信效率高,但可靠性不能確保5。
套接字的引入
為了更方便地開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序,美國(guó)伯克利大學(xué)在UNIX上推出了一種應(yīng)用程序訪問(wèn)通信協(xié)議的操作系統(tǒng)調(diào)用接字(Socket)。 Socket的出現(xiàn),使得程序員可以很方便地訪問(wèn) TCPIP,從而開(kāi)發(fā)各種網(wǎng)絡(luò)應(yīng)用程序。后來(lái)套接字被引進(jìn)到 Windows等操作系統(tǒng),成為開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序的有效工具3。
套接字存在于通信區(qū)域,通信區(qū)域也被稱(chēng)為地址族,主要用于將通過(guò)套接字通信的進(jìn)程的公有特性綜合在一起。套接字通常只與同一區(qū)域的套接字交換數(shù)據(jù)。Windows Socket只支持一個(gè)通信區(qū)域——AF_INET國(guó)際網(wǎng)區(qū)域,使用網(wǎng)際協(xié)議族通信的進(jìn)程使用該域3。