Winsock

Winsock簡介
WinSock的全名是 Windows Socket,其定義為介於Windows TCP/IP application,Client 與 TCP/IP 的protocol stack之間的一項標準介面,而非協定(protocol)。程式設計者於Windows上所寫的網路軟體(如Gopher,Telnet,FTP..),只要支援WinSock的規格,他就不需要顧慮所使用的網路卡是那家廠牌,因為Winsock所提供的程式庫Winsock.DLL會負起與網路底層溝通的工作。進而讓設計者能設計出更多功能或更user friendly的網路軟體。Socket可以抽象地想成是連接網路的窗口,它提供應用程式和網路溝通的管道。Winsock API 函式提供一套 socket 介面函式,應用程式利用這套函式開啟一個 socket,透過這個 socket 和網路溝通。

Winsock提供在柏克萊socket介面為基礎的一個通用的 應用程式界面。而現在我們使用的是Winsock2.2版,可向下相容於Winsock1.1版。
應用程式要為每個開啟的 socket 命名,這樣才能名正言順地使用這些 socket 作為網路溝通的管道。我們講一個 socket 的命名,包含三個部份 :
1. 通訊協定 (protocol)
2. IP 位址
3. Port number

Client 程式成功地和 server 程式取得聯繫後,client端的 socket和 server端的socket會建立起一個連結( association )。一個聯結包含五個部份 :
1. 通訊協定
2. 本地的IP 位址
3. 本地的 port number
4. 遠端IP 位址
5. 遠端的port number
Server端和client端要彼此產生通訊,一定要彼此的socket能認的對方,也就是要建立聯結的關係。能相互通訊的兩端一定是用同一種通訊協定,加上已端socket 的IP位址,port number和遠端socket的IP 位址,port number,這五個部份構成了連結的關係。

TCP Client - Server Model

1. 在伺服端及客戶端先利用WSAStartup()註冊winsock.dll的使用。
2. 然後建立用來連線用的socket,此時可以選定要用的通訊協定,TCP為SOCK_STREAM。
3. 利用bind()填妥伺服端的IP及port。
4. 此時伺服端利用listen()聆聽客戶端的要求。
5. 而客戶端則利用connect()和伺服端建立連線。
6. 伺服端收到客戶端的連線要求則利用accept()建立連線。
7. 連線過程完成。
8. 可以利用send()和recv()傳送和接收資料。
9. 最後closesocket()和WSACleanup()結束socket和winsock.dll使用。

圖3.1:TCP Client - Server Model流程圖
討論
從程式設計角度來看,TCP提供可靠的資料傳輸方式。他會檢查收到的資料,有一套驗證資料接收的方法,對於沒有送達的資料要求重送,並且保證收到的資料的順序是正確的。除此之外,考慮傳送端和接收端處理資料的快慢,對資料的流量加以控制(flow control)。若通訊期間有任何的錯誤產生,盡可能地通知雙方錯誤狀況。

UDP Client - Server Model

1. UDP不用建立連線,所以並不需要listen()、connect()和accept()等函式。
2. 伺服端及客戶端都需要利用bind()自己的IP及port。
3. 使用recvfrom()及sendto()接收資料,其中使用sendto()函式時,有一個參數是用來填入要傳送的位置,而recvfrom()則由有一個參數用來紀錄傳送端的位置。
4. 如果UDP的client在bind()後呼叫connect()指定server的位址,那就可以用send()傳送資料,不需每次指定server的sockaddr_in結構。

圖3.2:UDP Client - Server Model流程圖
討論
UDP不像TCP考慮那麼多,並不保證資料可以正確地到達對方。對於雙方處理資料速度的不同,不會做流量的控制,也不會告知雙方錯誤的發生。UDP只是很單純地”丟”出資料,送不送得到對方就看它的造化了!若應用程式使用無連接的方式通訊,要確保資料傳輸的可靠性,程式設計者可能自己要發展一套驗證的方法。UDP應用的時機通常是在網路本身狀況良好的情況下,資料不會在網路傳輸上發生流失或錯誤。一般而言,在區域網路(Local Area Network, Lan)通常不容易出錯,如果跨到廣域網路(Wide Area Network, WAN)那就不敢保證了。UDP程式設計除了本地網路狀況考量之外,更要考慮在廣域網路應用的情形,這是設計UDP程式者常常忽略的地方。
專題網路程式架構



圖3.3:網路程式整體流程示意圖
由圖3.3中,明顯看出和圖3.2的模型差異有二:
1.socket有基礎層(base layer) 和增強層(enhancement layer):
由於程式中,加入了增強層,目的在於利用增強層特殊編碼方式,做到”smooth scalability”。
2.重傳/重收機制:為因應FGS,在第五章中會有詳細說明。