TCP/IP 簡單介紹
- 應用層 (Application):應用層是個很普遍的概念,有一些基本相同的系統級 TCP/IP 應用以及應用協議,也有許多的企業商業應用和互聯網應用。
- 傳輸層 (Transport):傳輸層包括 UDP 和 TCP,UDP 幾乎不對報文進行檢查,而 TCP 提供傳輸保證。
- 網絡層 (Network):網絡層協議由一系列協議組成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。
- 鏈路層 (Link):又稱爲物理數據網絡接口層,負責報文傳輸。
Socket相關概念
按端口號可分爲3大類編程
(1)公認端口(WellKnownPorts):從0到1023,它們緊密綁定(binding)於一些服務。一般這些端口的通信明確代表了某種服務的協議。例如:80端口實際上老是HTTP通信。安全
(2)註冊端口(RegisteredPorts):從1024到49151。它們鬆散地綁定於一些服務。也就是說有許多服務綁定於這些端口,這些端口一樣用於許多其它目的。例如:許多系統處理動態端口從1024左右開始。服務器
(3)動態和/或私有端口(Dynamicand/orPrivatePorts):從49152到65535。理論上,不該爲服務分配這些端口。實際上,機器一般從1024起分配動態端口。網絡
•流式Socket(STREAM):
是一種面向鏈接的Socket,針對於面向鏈接的TCP服務應用,安全,可是效率低;
•數據報式Socket(DATAGRAM):
是一種無鏈接的Socket,對應於無鏈接的UDP服務應用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但效率高.
Socket的通常應用模式(服務器端和客戶端)
1.服務端welcoming socket 開始監聽端口(負責監聽客戶端鏈接信息)
2.客戶端client socket鏈接服務端指定端口(負責接收和發送服務端消息)
3.服務端welcoming socket 監聽到客戶端鏈接,建立connection socket。(負責和客戶端通訊)socket
服務器端的Socket(至少須要兩個)
•一個負責接收客戶端鏈接請求(但不負責與客戶端通訊)
•每成功接收到一個客戶端的鏈接便在服務端產生一個對應的負責通訊的Socket
•在接收到客戶端鏈接時建立.
•爲每一個鏈接成功的客戶端請求在服務端都建立一個對應的Socket(負責和客戶端通訊).
客戶端的Socket
•客戶端Socket
•必須指定要鏈接的服務端地址和端口。
•經過建立一個Socket對象來初始化一個到服務器端的TCP鏈接。
Socket的通信過程
服務器端:
•申請一個socket
•綁定到一個IP地址和一個端口上
•開啓偵聽,等待接授鏈接
客戶端:
•申請一個socket
•鏈接服務器(指明IP地址和端口號)
服務器端接到鏈接請求後與客戶端創建鏈接並進行通信,原監聽socket繼續監聽。
Socket的構造函數:
鏈接經過構造函數完成。
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
•AddressFamily 成員指定 Socket 用來解析地址的尋址方案。例如,InterNetwork 指示當 Socket 使用一個 IP 版本 4 地址鏈接。
•SocketType 定義要打開的 Socket 的類型
•Socket 類使用 ProtocolType 枚舉向 Windows Sockets API 通知所請求的協議
如:mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
AddressFamily.InterNetWork:使用 IP4地址函數
SocketType.Stream:支持可靠、雙向、基於鏈接的字節流,而不重複數據。此類型的 Socket 與單個對方主機進行通訊,而且在通訊開始以前須要遠程主機鏈接。Stream 使用傳輸控制協議 (Tcp) ProtocolType 和 InterNetworkAddressFamily。學習
ProtocolType.Tcp:使用傳輸控制協議。spa
注意:3d
- 至少要定義一個要鏈接的遠程主機的IP和端口號。
- 端口號必須在 1 和 65535之間,最好在1024之後。
- 要鏈接的遠程主機必須正在監聽指定端口,也就是說你沒法隨意鏈接遠程主機。
- 如:
IPAddress addr = IPAddress.Parse("127.0.0.1");server
IPEndPoint endp = new IPEndPoint(addr, 10001);
服務端先綁定:serverWelcomeSocket.Bind(endp)
客戶端再鏈接:clientSocket.Connect(endp)
5.一個Socket一次只能鏈接一臺主機。
6.Socket關閉後沒法再次使用。
7.每一個Socket對象只能一臺遠程主機鏈接. 若是你想鏈接到多臺遠程主機, 你必須建立多個Socket對象.
Socket的方法
- ------------------相關類--------------------------
- IPEndPoint類:包含了一對IP地址和端口號
- --------------------方法們------------------------------
- Bind(): 綁定一個本地的IP和端口號(IPEndPoint)
- Listen(): 讓Socket偵聽傳入的鏈接嘗試,並指定偵聽隊列容量
- Connect(): 初始化與另外一個Socket的鏈接
- Accept(): 接收鏈接並返回一個新的socket
Socket通訊基本流程圖
基於TCP的Socket編程(TCP service:可靠的字節流傳輸)
結語
根據以前的學習筆記,關於Socket的基礎知識就介紹到這裏,以後會作一個小案例,能夠更好的對socket的理解。主要是項目中須要用到網絡編程方面的東西,週末沒事幹,就將以前socket的方面的知識點複習了一下,也爲了更好更快的投入工做中.....