套接字(socket) ━━━━━━━━━━━━━━━━━━━━━━━━━ TCP用主機(jī)的IP地址加上主機(jī)上的端口號作為TCP連接的端點,這種端點就叫做套接字(socket)或插口。 套接字用(IP地址:端口號)表示。 它是網(wǎng)絡(luò)通信過程中端點的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必需的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。 1、分類 常用的TCP/IP協(xié)議的3種套接字類型如下所示。 流式套接字(SOCK_STREAM): 流式套接字用于提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù)。該服務(wù)將保證數(shù)據(jù)能夠?qū)崿F(xiàn)無差錯、無重復(fù)發(fā)送,并按順序接收。流式套接字之所以能夠?qū)崿F(xiàn)可靠的數(shù)據(jù)服務(wù),原因在于其使用了傳輸控制協(xié)議,即TCP(The Transmission Control Protocol)協(xié)議。 數(shù)據(jù)報套接字(SOCK_DGRAM): 數(shù)據(jù)報套接字提供了一種無連接的服務(wù)。該服務(wù)并不能保證數(shù)據(jù)傳輸?shù)目煽啃?,?shù)據(jù)有可能在傳輸過程中丟失或出現(xiàn)數(shù)據(jù)重復(fù),且無法保證順序地接收到數(shù)據(jù)。數(shù)據(jù)報套接字使用UDP(User Datagram Protocol)協(xié)議進(jìn)行數(shù)據(jù)的傳輸。由于數(shù)據(jù)報套接字不能保證數(shù)據(jù)傳輸?shù)目煽啃裕瑢τ谟锌赡艹霈F(xiàn)的數(shù)據(jù)丟失情況,需要在程序中做相應(yīng)的處理。 原始套接字(SOCK_RAW): 原始套接字(SOCKET_RAW)允許對較低層次的協(xié)議直接訪問,比如IP、 ICMP協(xié)議,它常用于檢驗新的協(xié)議實現(xiàn),或者訪問現(xiàn)有服務(wù)中配置的新設(shè)備,因為RAW SOCKET可以自如地控制Windows下的多種協(xié)議,能夠?qū)W(wǎng)絡(luò)底層的傳輸機(jī)制進(jìn)行控制,所以可以應(yīng)用原始套接字來操縱網(wǎng)絡(luò)層和傳輸層應(yīng)用。比如,我們可以通過RAW SOCKET來接收發(fā)向本機(jī)的ICMP、IGMP協(xié)議包,或者接收TCP/IP棧不能夠處理的IP包,也可以用來發(fā)送一些自定包頭或自定協(xié)議的IP包。網(wǎng)絡(luò)監(jiān)聽技術(shù)很大程度上依賴于SOCKET_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ù)必須使用原始套接字。 2、簡介 套接字,是支持TCP/IP的網(wǎng)絡(luò)通信的基本操作單元,可以看做是不同主機(jī)之間的進(jìn)程進(jìn)行雙向通信的端點,簡單的說就是通信的兩方的一種約定,用套接字中的相關(guān)函數(shù)來完成通信過程。 非常非常簡單的舉例說明下: Socket=Ip address+ TCP/UDP + port。 3、連接方式 應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時,TCP和UDP會遇到同時為多個應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。 4、主要參數(shù) 區(qū)分不同應(yīng)用程序進(jìn)程間的網(wǎng)絡(luò)通信和連接,主要有3個參數(shù):通信的目的IP地址、使用的傳輸層協(xié)議(TCP或UDP)和使用的端口號。Socket原意是 “插座”。通過將這3個參數(shù)結(jié)合起來,與一個“插座”Socket綁定,應(yīng)用層就可以和傳輸層通過套接字接口,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。 Socket可以看成在兩個程序進(jìn)行通訊連接中的一個端點,是連接應(yīng)用程序和網(wǎng)絡(luò)驅(qū)動程序的橋梁,Socket在應(yīng)用程序中創(chuàng)建,通過綁定與網(wǎng)絡(luò)驅(qū)動建立關(guān)系。此后,應(yīng)用程序送給Socket的數(shù)據(jù),由Socket交給網(wǎng)絡(luò)驅(qū)動程序向網(wǎng)絡(luò)上發(fā)送出去。計算機(jī)從網(wǎng)絡(luò)上收到與該Socket綁定IP地址和端口號相關(guān)的數(shù)據(jù)后,由網(wǎng)絡(luò)驅(qū)動程序交給Socket,應(yīng)用程序便可從該Socket中提取接收到的數(shù)據(jù),網(wǎng)絡(luò)應(yīng)用程序就是這樣通過Socket進(jìn)行數(shù)據(jù)的發(fā)送與接收的。 5、分類介紹 Host A上的程序A將一段信息寫入Socket中,Socket的內(nèi)容被Host A的網(wǎng)絡(luò)管理軟件訪問,并將這段信息通過Host A的網(wǎng)絡(luò)接口卡發(fā)送到Host B,Host B的網(wǎng)絡(luò)接口卡接收到這段信息后,傳送給Host B的網(wǎng)絡(luò)管理軟件,網(wǎng)絡(luò)管理軟件將這段信息保存在Host B的Socket中,然后程序B才能在Socket中閱讀這段信息。 假設(shè)在網(wǎng)絡(luò)中添加第三個主機(jī)Host C,那么Host A怎么知道信息被正確傳送到Host B而不是被傳送到Host C中了呢?基于TCP/IP網(wǎng)絡(luò)中的每一個主機(jī)均被賦予了一個唯一的IP地址,IP地址是一個32位的無符號整數(shù),由于沒有轉(zhuǎn)變成二進(jìn)制,因此通常以小數(shù)點分隔,如:198.163.227.6,正如所見IP地址均由四個部分組成,每個部分的范圍都是0-255,以表示8位地址。 值得注意的是IP地址都是32位地址,這是IP協(xié)議版本4(簡稱Ipv4)規(guī)定的,目前由于IPv4地址已近耗盡,所以IPv6地址正逐漸代替Ipv4地址,Ipv6地址則是128位無符號整數(shù)。 假設(shè)第二個程序被加入的網(wǎng)絡(luò)的Host B中,那么由Host A傳來的信息如何能被正確的傳給程序B而不是傳給新加入的程序呢?這是因為每一個基于TCP/IP網(wǎng)絡(luò)通訊的程序都被賦予了唯一的端口和端口號,端口是一個信息緩沖區(qū),用于保留Socket中的輸入/輸出信息,端口號是一個16位無符號整數(shù),范圍是0-65535,以區(qū)別主機(jī)上的每一個程序(端口號就像房屋中的房間號),低于256的端口號保留給標(biāo)準(zhǔn)應(yīng)用程序,比如pop3的端口號就是110,每一個套接字都組合進(jìn)了IP地址、端口、端口號,這樣形成的整體就可以區(qū)別每一個套接字。 6、Sockets 流式套接字 本文描述流式套接字,它是兩種可用的Sockets類型中的一種。(另一種類型是數(shù)據(jù)報套接字 。) 流式套接字提供沒有記錄邊界的數(shù)據(jù)流:可以是雙向的字節(jié)流(應(yīng)用程序是全雙工:可以通過套接字同時傳輸和接收)。可依賴流傳遞有序的、不重復(fù)的數(shù)據(jù)。(“有序”指數(shù)據(jù)包按發(fā)送順序送達(dá)。“不重復(fù)”指一個特定的數(shù)據(jù)包只能獲取一次。)這能確保收到流消息,而流非常適合處理大量數(shù)據(jù)。 網(wǎng)絡(luò)傳輸層可將數(shù)據(jù)拆分為分組或若干個大小適當(dāng)?shù)臄?shù)據(jù)包。 CSocket 類將為您處理打包和解包。 流基于顯式連接:套接字 A 請求與套接字 B 建立連接;套接字 B 接受或拒絕此連接請求。 打電話的情況與流非常相似:正常情況下,接聽方聽到您的話和您講話時的順序一樣,沒有重復(fù)和遺漏。流套接字適合文件傳輸協(xié)議(FTP) 這類實現(xiàn),此協(xié)議有利于傳輸任意大小的 ASCII 或二進(jìn)制文件。 如果必須保證數(shù)據(jù)送達(dá)而且數(shù)據(jù)大小很大時,流式套接字優(yōu)于數(shù)據(jù)報套接字。有關(guān)流式套接字的更多信息,請參見Sockets規(guī)范。該規(guī)范可在 Platform SDK 中獲得。 MFC 示例 CHATTER 和 CHATSRVR 都使用流式套接字。這些示例可能已經(jīng)設(shè)計為使用數(shù)據(jù)報套接字向網(wǎng)絡(luò)上的所有接收套接字廣播。而目前的設(shè)計更好,這是因為: 廣播模型受制于網(wǎng)絡(luò)“洪水”(或“風(fēng)暴”)問題。 后來采用的客戶端-服務(wù)器模型更有效。 流式模型提供可靠的數(shù)據(jù)傳輸,數(shù)據(jù)報模型則未提供。 最終模型利用在 CArchive 類借給 CSocket 類的 Unicode 和 ANSI 套接字應(yīng)用程序之間通信的能力。 7、注意 如果使用 CSocket 類,則必須使用流。如果將套接字類型指定為 SOCK_DGRAM ,則 MFC 斷言失敗 Sockets 示例列表 下列 MFC 示例程序闡釋了Sockets功能: CHATTER CHATTER 是一個套接字客戶端示例應(yīng)用程序。它是一個具有拆分窗口的單文檔界面 (SDI) 應(yīng)用程序,允許用戶將消息發(fā)送到討論服務(wù)器 (CHATSRVR),討論服務(wù)器然后將消息同時發(fā)送給其他多個 CHATTER 用戶。 通過使 CHATTER 應(yīng)用程序向服務(wù)器發(fā)送廣播數(shù)據(jù)文報包而不是消息流,可以在不使用客戶端/服務(wù)器模型的情況下編寫 CHATTER 和 CHATSRVR。然而,與流式套接字不同,數(shù)據(jù)文報套接字不能保證一定會被傳送;因此,一些消息可能不會到達(dá)討論中的所有其他用戶。
|
|