C#Socket通訊基礎知識(非同步Socket通訊TCP)
一、Socket通訊基礎
《1》TCP/IP層次模型
這裡只討論重要的四層
01,應用層(Application):應用層是個很廣泛的概念,有一些基本相同的系統級TCP/IP應用以及應用協議,也有許多的企業應用和網際網路應用。http協議在應用層執行。
02,傳輸層(Tanspot):傳輸層包括UDP和TCP,UDP幾乎不對報文進行檢查,而TCP
提供傳輸保證。
03,網路層(Netwok):網路層協議由一系列協議組成,包括ICMP、IGMP、RIP、OSPF、IP(v4,v6)等。
04,鏈路層(Link):又稱為物理資料網路介面層,負責報文傳輸。
然後我們來看下tcp層次模型圖
從上圖中可以看出,應用程式在應用層執行,在傳輸層,在資料前加上了TCP頭,在
網路層加上的IP頭,在資料鏈路層加上了幀。
《2》埠
埠號範圍:0-65535,總共能表示65536個數。
按埠號可分為3大類
(1)公認埠(WellKnownPorts):從0到1023,它們緊密繫結(binding)於一些服務。通常這些埠的通訊明確表明了某種服務的協議。例如:80埠實際上總是HTTP通訊。
(2)註冊埠(RegisteredPorts):從1024到49151。它們鬆散地綁定於一些服務。也就是說有許多服務綁定於這些埠,這些埠同樣用於許多其它目的。例如:許多系統處理動態埠從1024左右開始。
(3)動態和/或私有埠(Dynamicand/orPrivatePorts):從49152到65535。理論上,不應為服務分配這些埠。實際上,機器通常從1024起分配動態埠。
《3》TCP和UDP報文
從圖中我們可以看出TCP和UDP中都有校驗和,但是在UDP報文中,一般不使用校驗和,這樣可以加快資料傳輸的速度,但是資料的準確性可能會受到影響。換句話說,Tcp協議都有校驗和,為了保證傳輸資料的準確性.
《4》Socket
Socket包括Ip地址和埠號兩部分,程式通過Socket來通訊,Socket相當於作業系統的一個元件。Socket作為程序之間通訊機制,通常也稱作”套接字”,用於描述IP地址和埠號,是一個通訊鏈的控制代碼。說白了,就是兩個程式通訊用的。
生活案例對比:
Socket之間的通訊可以類比生活中打電話的案例。任何使用者在通話之前,首先要佔有一部電話機,相當於申請一個Socket,同時要知道對方的號碼,相當於對方有一個固定的Socket,然後向對方撥號呼叫,相當於發出連線請求。假如對方在場並空閒,拿起 電話話筒,雙方就可以進行通話了。雙方的通話過程,是一方向電話機發出訊號和對方從電話機接收訊號的過程,相當於向socket傳送資料和從socket接收資料。通話結束後,一方掛起電話機,相當於關閉socket,撤銷連線。
注意:Socket不僅可以在兩臺電腦之間通訊,還可以在同一臺電腦上的兩個程式間通訊。
《5》埠進階(深入)
通過IP地址確定了網路中的一臺電腦後,該電腦上可能提供很多提供服務的應用,每一個應用都對應一個埠。
在Internet上有很多這樣的主機,這些主機一般運行了多個服務軟體 ,同時提供幾種服務,每種服務都開啟一個Socket,並繫結到一個埠上,不同的埠對應於不同的服務(應用程式)
例如:http 使用80埠, ftp使用21埠 smtp使用25埠
《6》Socket分類
Socket主要有兩種型別:
- 流式Socket
是一種面向連線的Socket,針對於面向連線的TCP服務應用,安全,但是效率低
2,資料報式Socket
是一種無連線的Socket,對應於無連線的UDP服務應用,不安全,但效率高
《7》Socket一般應用模式(伺服器端和客戶端)
伺服器端的Socket(至少需要兩個)
01.一個負責接收客戶端連線請求(但不負責與客戶端通訊)
02.每成功接收到客戶端的連線便在伺服器端產生一個對應的複雜通訊的Socket
021.在接收到客戶端連線時建立
022. 為每個連線成功的客戶端請求在伺服器端都建立一個對應的Socket(負責和客戶端通訊)
客戶端的Socket
- 必須指定要連線的伺服器地址和埠
- 通過建立一個Socket物件來初始化一個到伺服器端的TCP連線
- 通過上圖,我們可以看出,首先伺服器會建立一個負責監聽的socket,然後客戶端通過socket連線到伺服器指定埠,最後伺服器端負責監聽的socket,監聽到客戶端有連線過來了,就建立一個負責和客戶端通訊的socket。
二、Socket更具體的通訊過程:
《1》Socket的通訊過程
伺服器端:
01,申請一個socket
02,繫結到一個IP地址和一個埠上
03,開啟偵聽,等待接收連線
客戶端:
01,申請一個socket
02,連線伺服器(指明IP地址和埠號)
伺服器端接收到連線請求後,產生一個新的socket(埠大於1024)與客戶端建立連線並進行通訊,原監聽socket繼續監聽。
注意:負責通訊的Socket不能無限建立,建立的數量和作業系統有關。
《2》Socket的建構函式
Public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolTYpe)
AddressFamily:指定Socket用來解析地址的定址方案。例如:InterNetWork指示當Socket使用一個IP版本4地址連線
SocketType:定義要開啟的Socket的型別
Socket類使用ProtocolType列舉向Windows Sockets API通知所請求的協議
注意:
1,埠號必須在 1 和 65535之間,最好在1024以後。
2,要連線的遠端主機必須正在監聽指定埠,也就是說你無法隨意連線遠端主機。
如:
IPAddress addr = IPAddress.Parse("127.0.0.1");
IPEndPoint endp = new IPEndPoint(addr,,9000);
服務端先繫結:serverWelcomeSocket.Bind(endp)
客戶端再連線:clientSocket.Connect(endp)
3,一個Socket一次只能連線一臺主機
4,Socket關閉後無法再次使用
5,每個Socket物件只能與一臺遠端主機連線。如果你想連線到多臺遠端主機,你必須建立多個Socket物件。
《3》Socket常用類和方法
相關類:
IPAddress:包含了一個IP地址
IPEndPoint:包含了一對IP地址和埠號
方法:
Socket():建立一個Socket
Bind():繫結一個本地的IP和埠號(IPEndPoint)
Listen():讓Socket偵聽傳入的連線吃那個病,並指定偵聽佇列容量
Connect():初始化與另一個Socket的連線
Accept():接收連線並返回一個新的Socket
Send():輸出資料到Socket
Receive():從Socket中讀取資料
Close():關閉Socket,銷燬連線
接下來,我們同一個簡單的伺服器和客戶端通訊的案例,來看下Sokcet的具體用法,效果圖如下:
注意:該內容轉載連線為:http://www.cnblogs.com/weilengdeyu/archive/2013/03/08/2949101.html