套接字是通信的基石,是支持TCP/IP協(xié)議的路通信的基本操作單元??梢詫⑻捉幼挚醋鞑煌鳈C間的進程進行雙間通信的端點,它構(gòu)成了單個主機內(nèi)及整個網(wǎng)絡(luò)間的編程界面。套接字存在于通信域中,通信域是為了處理一般的線程通過套接字通信而引進的一種抽象概念。套接字通常和同一個域中的套接字交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時一定要執(zhí)行某種解釋程序),各種進程使用這個相同的域互相之間用Internet協(xié)議簇來進行通信。
Socket(套接字)可以看成是兩個網(wǎng)絡(luò)應(yīng)用程序進行通信時,各自通信連接中的端點,這是一個邏輯上的概念。它是網(wǎng)絡(luò)環(huán)境中進程間通信的API(應(yīng)用程序編程接口),也是可以被命名和尋址的通信端點,使用中的每一個套接字都有其類型和一個與之相連進程。通信時其中一個網(wǎng)絡(luò)應(yīng)用程序?qū)⒁獋鬏數(shù)囊欢涡畔懭胨谥鳈C的 Socket中,該 Socket通過與網(wǎng)絡(luò)接口卡(NIC)相連的傳輸介質(zhì)將這段信息送到另外一臺主機的 Socket中,使對方能夠接收到這段信息。 Socket是由IP地址和端口結(jié)合的,提供向應(yīng)用層進程傳送數(shù)據(jù)包的機制。
1.流套接字(SOCK_STREAM)
流套接字用于提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù)。該服務(wù)將保證數(shù)據(jù)能夠?qū)崿F(xiàn)無差錯、無重復(fù)送,并按順序接收。流套接字之所以能夠?qū)崿F(xiàn)可靠的數(shù)據(jù)服務(wù),原因在于其使用了傳輸控制協(xié)議,即TCP(The Transmission Control Protocol)協(xié)議。
2.數(shù)據(jù)報套接字(SOCK_DGRAM)
數(shù)據(jù)報套接字提供一種無連接的服務(wù)。該服務(wù)并不能保證數(shù)據(jù)傳輸?shù)目煽啃?數(shù)據(jù)有可能在傳輸過程中丟失或出現(xiàn)數(shù)據(jù)重復(fù),且無法保證順序地接收到數(shù)據(jù)。數(shù)據(jù)報套接字使用UDP( User DatagramProtocol)協(xié)議進行數(shù)據(jù)的傳輸。由于數(shù)據(jù)報套接字不能保證數(shù)據(jù)傳輸?shù)目煽啃?,對于有可能出現(xiàn)的數(shù)據(jù)丟失情況,需要在程序中做相應(yīng)的處理。
3.原始套接字(SOCK_RAW)
原始套接字與標(biāo)準(zhǔn)套接字(標(biāo)準(zhǔn)套接字指的是前面介紹的流套接字和數(shù)據(jù)報套接字)的區(qū)別在于:原始套接字可以讀寫內(nèi)核沒有處理的IP數(shù)據(jù)包,而流套接字只能讀取TCP協(xié)議的數(shù)據(jù),數(shù)據(jù)報套接字只能讀取UDP協(xié)議的數(shù)據(jù)。因此,如果要訪問其他協(xié)議發(fā)送的數(shù)據(jù)必須使用原始套接。
套接字Socket=(IP地址:端口號),套接字的表示方法是點分十進制的lP地址后面寫上端口號,中間用冒號或逗號隔開。每一個傳輸層連接唯一地被通信兩端的兩個端點(即兩個套接字)所確定。例如:如果IP地址是210.37.145.1,而端口號是23,那么得到套接字就是(210.37.145.1:23)。
為了更方便地開發(fā)網(wǎng)絡(luò)應(yīng)用程序,美國伯克利大學(xué)在UNIX上推出了一種應(yīng)用程序訪問通信協(xié)議的操作系統(tǒng)調(diào)用接字(Socket)。 Socket的出現(xiàn),使得程序員可以很方便地訪問 TCPIP,從而開發(fā)各種網(wǎng)絡(luò)應(yīng)用程序。后來套接字被引進到 Windows等操作系統(tǒng),成為開發(fā)網(wǎng)絡(luò)應(yīng)用程序的有效工具。
套接字存在于通信區(qū)域,通信區(qū)域也被稱為地址族,主要用于將通過套接字通信的進程的公有特性綜合在一起。套接字通常只與同一區(qū)域的套接字交換數(shù)據(jù)。Windows Socket只支持一個通信區(qū)域——AF_INET國際網(wǎng)區(qū)域,使用網(wǎng)際協(xié)議族通信的進程使用該域。