應用層 (application):應用層是個很廣泛的概念,有一些基本相同的系統級 tcp/ip 應用以及應用協定,也有許多的企業商業應用和網際網路應用。
傳輸層 (transport):傳輸層包括 udp 和 tcp,udp 幾乎不對封包進行檢查,而 tcp 提供傳輸保證。
網絡層 (network):網絡層協定由一系列協定組成,包括 icmp、igmp、rip、ospf、ip(v4,v6) 等。
鍊路層 (link):又稱為實體資料網絡接口層,負責封包傳輸。
socket的英文原義是“孔”或“插座”。作為程序通信機制,取後一種意思。通常也稱作“套接字”,用于描述ip位址和端口,是一個通信鍊的句柄。(其實就是兩個程式通信用的。)
socket非常類似于電話插座。以一個電話網為例。電話的通話雙方相當于互相通信的2個程式,電話号碼就是ip位址。任何使用者在通話之前,首先要占有一部電話機,相當于申請一個socket;同時要知道對方的号碼,相當于對方有一個固定的socket。然後向對方撥号呼叫,相當于發出連接配接請求。對方假如在場并空閑,拿起電話話筒,雙方就可以正式通話,相當于連接配接成功。雙方通話的過程,是一方向電話機發出信号和對方從電話機接收信号的過程,相當于向socket發送資料和從socket接收資料。通話結束後,一方挂起電話機相當于關閉socket,撤消連接配接。
在internet上有很多這樣的主機,這些主機一般運作了多個服務軟體,同時提供幾種服務。每種服務都打開一個socket,并綁定到一個端口上,不同的端口對應于不同的服務(應用程式)。
例如:http 使用80端口 ftp使用21端口 smtp 25端口
按端口号可分為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服務應用.不安全(丢失,順序混亂,在接收端要分析重排及要求重發),但效率高.
1.服務端welcoming socket 開始監聽端口(負責監聽用戶端連接配接資訊)
2.用戶端client socket連接配接服務端指定端口(負責接收和發送服務端消息)
3.服務端welcoming socket 監聽到用戶端連接配接,建立connection socket。(負責和用戶端通信)
伺服器端的socket(至少需要兩個)
•一個負責接收用戶端連接配接請求(但不負責與用戶端通信)
•每成功接收到一個用戶端的連接配接便在服務端産生一個對應的負責通信的socket
•在接收到用戶端連接配接時建立.
•為每個連接配接成功的用戶端請求在服務端都建立一個對應的socket(負責和用戶端通信).
用戶端的socket
•用戶端socket
•必須指定要連接配接的服務端位址和端口。
•通過建立一個socket對象來初始化一個到伺服器端的tcp連接配接。
伺服器端:
•申請一個socket
•綁定到一個ip位址和一個端口上
•開啟偵聽,等待接授連接配接
用戶端:
•連接配接伺服器(指明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:使用傳輸控制協定。
注意:
至少要定義一個要連接配接的遠端主機的ip和端口号。
端口号必須在 1 和 65535之間,最好在1024以後。
要連接配接的遠端主機必須正在監聽指定端口,也就是說你無法随意連接配接遠端主機。
如:
ipaddress addr = ipaddress.parse("127.0.0.1");
ipendpoint endp = new ipendpoint(addr, 10001);
服務端先綁定:serverwelcomesocket.bind(endp)
用戶端再連接配接:clientsocket.connect(endp)
5.一個socket一次隻能連接配接一台主機。
6.socket關閉後無法再次使用。
7.每個socket對象隻能一台遠端主機連接配接. 如果你想連接配接到多台遠端主機, 你必須建立多個socket對象.
------------------相關類--------------------------
ipaddress類:包含了一個ip位址
ipendpoint類:包含了一對ip位址和端口号
--------------------方法們------------------------------
socket (): 建立一個socket
bind(): 綁定一個本地的ip和端口号(ipendpoint)
listen(): 讓socket偵聽傳入的連接配接嘗試,并指定偵聽隊列容量
connect(): 初始化與另一個socket的連接配接
accept(): 接收連接配接并傳回一個新的socket
send(): 輸出資料到socket
receive(): 從socket中讀取資料
close(): 關閉socket (銷毀連接配接)
結語
根據之前的學習筆記,關于socket的基礎知識就介紹到這裡,之後會做一個小案例,可以更好的對socket的了解。主要是項目中需要用到網絡程式設計方面的東西,周末沒事幹,就将之前socket的方面的知識點複習了一下,也為了更好更快的投入工作中.....
部落格位址:
<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>
部落格版權:
本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。
如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!
再次感謝您耐心的讀完本篇文章。http://www.cnblogs.com/wolf-sun/p/3322300.html