Socket學(xué)習(xí)筆記
Socket基礎(chǔ)知識(shí)
背景
應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí)隐岛,TCP會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題踊沸。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過同一個(gè) TCP協(xié)議端口傳輸數(shù)據(jù)苛蒲。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接笋颤,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口勤篮。應(yīng)用層可以和傳輸層通過Socket接口都毒,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)碰缔。
Socket概念
Socket 又稱"套接字"账劲,是系統(tǒng)提供的用于網(wǎng)絡(luò)通信的方法。 它的本質(zhì)并不是協(xié)議, 而是一個(gè)調(diào)用接口(API)瀑焦。 通過 Socket 腌且, 我們才能使用 TCP/IP 協(xié)議。
套接字(socket)是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示榛瓮,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議铺董,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口禀晓,遠(yuǎn)地主機(jī)的IP地址精续,遠(yuǎn)地進(jìn)程的協(xié)議端口。
Socket支持的協(xié)議
Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),具體采用哪種協(xié)議粹懒,有業(yè)務(wù)場(chǎng)景來決定;
TCP
TCP是面向連接的重付、傳輸可靠(保證數(shù)據(jù)正確性且保證數(shù)據(jù)順序)、用于傳輸大量數(shù)據(jù)(流模式)凫乖、速度慢确垫,建立連接需要開銷較多(時(shí)間,系統(tǒng)資源)拣凹。
TCP是一種流模式的協(xié)議森爽,是面向連接的,也就是說嚣镜,在連接持續(xù)的過程中爬迟,socket中收到的數(shù)據(jù)都是由同一臺(tái)主機(jī)發(fā)出的(劫持什么的不考慮),因此菊匿,知道保證數(shù)據(jù)是有序的到達(dá)就行了付呕,至于每次讀取多少數(shù)據(jù)不關(guān)心。
UDP
UDP是面向無連接跌捆、傳輸不可靠徽职、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)、速度快的傳輸層協(xié)議佩厚。注意姆钉,UDP傳輸?shù)氖菙?shù)據(jù)報(bào)包,而TCP是流抄瓦。
UDP是面向無連接的協(xié)議潮瓶,只要知道接收端的IP和端口,且網(wǎng)絡(luò)是可達(dá)的钙姊,任何主機(jī)都可以向接收端發(fā)送數(shù)據(jù)毯辅。這時(shí)候,如果一次能讀取超過一個(gè)報(bào)文的數(shù)據(jù)煞额,則會(huì)亂套思恐。比如沾谜,主機(jī)A向發(fā)送了報(bào)文P1,主機(jī)B發(fā)送了報(bào)文P2胀莹,如果能夠讀取超過一個(gè)報(bào)文的數(shù)據(jù)基跑,那么就會(huì)將P1和P2的數(shù)據(jù)合并在了一起,這樣的數(shù)據(jù)是沒有意義的嗜逻。
關(guān)于UDP 廣播 多播概念可以移步這里http://www.reibang.com/p/41c2a53d719b
Socket連接基本步驟
建立Socket連接至少需要一對(duì)套接字涩僻,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket; 另一個(gè)運(yùn)行于服務(wù)器端栈顷,稱為ServerSocket。
socket通信過程如下:
- 服務(wù)端利用Socket監(jiān)聽端口嵌巷;
- 客戶端發(fā)起連接萄凤;
- 服務(wù)端返回信息,建立連接搪哪,開始通信靡努;
- 客戶端,服務(wù)端斷開連接晓折。
套接字之間的連接過程分為三個(gè)步驟:
服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字惑朦,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)漓概,等待客戶端的連接請(qǐng)求
客戶端請(qǐng)求:客戶端的套接字提出連接請(qǐng)求漾月,要連接到目標(biāo)服務(wù)器端的套接字。為此胃珍,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字梁肿,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求
連接確認(rèn):當(dāng)服務(wù)器端的套接字監(jiān)聽到或者說接收到客戶端的套接字的連接請(qǐng)求時(shí)觅彰,就響應(yīng)客戶端套接字的請(qǐng)求吩蔑,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端填抬,一旦客戶端確認(rèn)了此描述烛芬,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)飒责,繼續(xù)接收其他客戶端套接字的連接請(qǐng)求
iOS端Socket編程
既可以C語(yǔ)言 也可以 OC語(yǔ)言實(shí)現(xiàn)赘娄,
目前第三方庫(kù)中比較好的是 CocoaAsyncSocket。
參考學(xué)習(xí)文章
1.Soket 理論知識(shí)http://www.reibang.com/p/06f8b9111a56