套接字類型

         轉載自:http://www.cnblogs.com/istrong/archive/2012/06/10/2544357.html

 

1、數據流套接字(Stream Socket

數據流式是一種面向連接的Socket,針對於面向連接的TCP服務應用,使用使用比較高質量的TCP協議。它有以下一些特點:

1 TCP提供可靠的連接。當TCP向另外一端發送數據時,它要求對方返回一個確認回答。如果沒有收到確認,則會等待一段時間後重新發送,在數次重發失敗後,TCP纔會放棄發送。

2 TCP爲發送的數據進行排序。比如發送2048個字節,TCP可能將它分成大小爲1024的兩個段,並分別進行編號“1”和“2”。接收段將根據編號對數據進行重新排序並判斷是否爲重複數據。

3 TCP提供流量控制。它會通知對方自己能夠接受數據的容量,稱爲窗口,這樣就確保不會發生緩衝區溢出的情況。

4 TCP的連接是雙工的。在給定連接上的應用進程在任何時刻既可以發送也可以接受數據。

TCP中相當重要的一個概念就是建立一個TCP連接,也就是三次握手過程,理解它對於今後編程有非常大的幫助。下面我們就詳細學習一下這個過程。

1 服務器必須準備好接收外來的連接。由調用socketbindlisten函數完成,稱爲被動打開(passive open)。

2 客戶通過調用connect進行主動打開(active open)。客戶TCP發送一個SYN(同步)包,以告知服務器客戶在這次連接中要發送數據的初始序列號。SYN數據包不包含數據,只有一個IP頭、一個TCP頭及其選項。

3 服務器確認客戶的SYN,同時自己也發送一個SYN數據包,告知客戶它自己在這次連接中發送數據的初始序列號。服務器分別對客戶SYN的應答ACK,以及自己的SYN數據。

4)客戶返回對服務器SYN的確認應答ACK

許多廣泛應用的程序都使用數據流套接字,比如telnetWWW瀏覽器使用的HTTP協議等。

2、數據報套接字(Datagram Socket

數據報式Socket是一種無連接的套接字,對應於無連接的UDP服務應用,相應協議是UDP

UDP提供無連接的服務,就是說UDP客戶與服務器不必保持長期的連接關係。例如,一個UDP客戶可以創建一個套接字併發送一個數據報給一個服務器,然後可以立即用同一個套接字發送另一個數據報給另一個服務器。UDP所面臨的問題就是缺乏可靠性。因爲它沒有例如確認、超時重傳等複雜機制,因此它不能保證數據的到達以及到達的次序。

那麼我們在傳送過程中,如果數據丟失了該怎麼辦呢?其實每個程序在UDP上都有自己的協議,如果在一定時間內沒有收到對方發回的確認應答,它將重新發送,直到得到ACK

UDP實現過程比較簡單,因此在一定程度上效率較高,對於一些數據量小,無須交互的通信情況還是適用的。使用UDP的應用程序有:tftpbootp等。

3、原始套接字(Raw Socket

除了上面兩種常用的套接字類型外,還有一類原始套接字(raw socket),在某些網絡應用中擔任重要角色。比如我們平時想看一看網絡是否通達,就用ping命令測試一下。Ping命令用的是ICMP協議,因此我們不能通過建立一個SOCK_STREAMSOCK_DGRAM來發送這個包,而只能自己親自來構建ICMP包來發送。另外一種情況是,許多操作系統只實現了幾種常用的協議,而沒有實現其它如OSPEGGP等協議。如果自己有必要編寫位於其上的應用,就必須藉助raw socket來實現,這是因爲操作系統遇到自己不能夠處理的數據包,就將這個包交給raw socket處理。

Raw socket的作用主要在三個方面:

1 通過raw socket來接收和發送ICMP協議包。

2 接收發向本機的但TCP/IP棧不能夠處理的IP包。

3 用來發送一些自己指定源地址特殊作用的IP包。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章