即時(shí)通訊基礎(chǔ)(二)

Socket

Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層雕旨,它是一組接口蛤高。



常見(jiàn)的socket類(lèi)型有兩種:流式Socket和數(shù)據(jù)報(bào)式Socket脐湾。流式是一種面向連接的Socket诚撵,針對(duì)于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無(wú)連接的Socket颤枪,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用。


TCP與UDP的區(qū)別

建立連接的的方式
  • TCP
(1)第一次握手:

Client將標(biāo)志位SYN置為1淑际,隨機(jī)產(chǎn)生一個(gè)值seq=X畏纲,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN_SENT狀態(tài)春缕,等待Server確認(rèn)盗胀。

(2)第二次握手:

Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請(qǐng)求建立連接,Server將標(biāo)志位SYN和ACK都置為1淡溯,ack=X+1读整,隨機(jī)產(chǎn)生一個(gè)值seq=Y,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求咱娶,Server進(jìn)入SYN_RCVD狀態(tài)米间。

(3)第三次握手:

Client收到確認(rèn)后,檢查ack是否為X+1膘侮,ACK是否為1,如果正確則將標(biāo)志位ACK置為1琼了,ack=Y+1逻锐,并將該數(shù)據(jù)包發(fā)送給Server夫晌,Server檢查ack是否為Y+1,ACK是否為1昧诱,如果正確則連接建立成功晓淀,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手盏档,隨后Client與Server之間可以開(kāi)始傳輸數(shù)據(jù)了凶掰。

(1)第一次揮手:

Client發(fā)送一個(gè)FIN,用來(lái)關(guān)閉Client到Server的數(shù)據(jù)傳送蜈亩,Client進(jìn)入FIN_WAIT_1狀態(tài)懦窘。

(2)第二次揮手:

Server收到FIN后,發(fā)送一個(gè)ACK給Client稚配,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同畅涂,一個(gè)FIN占用一個(gè)序號(hào)),Server進(jìn)入CLOSE_WAIT狀態(tài)道川。

(3)第三次揮手:

Server發(fā)送一個(gè)FIN午衰,用來(lái)關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)愤惰。

(4)第四次揮手:

Client收到FIN后苇经,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server宦言,確認(rèn)序號(hào)為收到序號(hào)+1扇单,Server進(jìn)入CLOSED狀態(tài),完成四次揮手奠旺。

為什么建立連接是三次握手蜘澜,而關(guān)閉連接卻是四次揮手呢?

這是因?yàn)榉?wù)端在LISTEN狀態(tài)下响疚,收到建立連接請(qǐng)求的SYN報(bào)文后鄙信,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶(hù)端。而關(guān)閉連接時(shí)忿晕,當(dāng)收到對(duì)方的FIN報(bào)文時(shí)装诡,僅僅表示對(duì)方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對(duì)方了践盼,所以己方可以立即close鸦采,也可以發(fā)送一些數(shù)據(jù)給對(duì)方后,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示同意現(xiàn)在關(guān)閉連接咕幻,因此渔伯,己方ACK和FIN一般都會(huì)分開(kāi)發(fā)送。

  • UDP

我們都知道 TCP 是面向連接的肄程、可靠的锣吼、有序的傳輸層協(xié)議选浑,而 UDP 是面向數(shù)據(jù)報(bào)的、不可靠的玄叠、無(wú)序的傳輸協(xié)議古徒,所以 UDP 壓根不會(huì)建立什么連接。

就好比發(fā)短信一樣读恃,UDP 只需要知道對(duì)方的 ip 地址描函,將數(shù)據(jù)報(bào)一份一份的發(fā)送過(guò)去就可以了,其他的作為發(fā)送方狐粱,都不需要關(guān)心。


數(shù)據(jù)發(fā)送方式的差異

TCP:由于 TCP 是建立在兩端連接之上的協(xié)議胆数,所以理論上發(fā)送的數(shù)據(jù)流不存在大小的限制肌蜻。但是由于緩沖區(qū)有大小限制,所以你如果用 TCP 發(fā)送一段很大的數(shù)據(jù)必尼,可能會(huì)截?cái)喑珊脦锥谓眩邮辗揭来蔚慕邮铡?/p>

UDP:由于 UDP 本身發(fā)送的就是一份一份的數(shù)據(jù)報(bào),所以自然而然的就有一個(gè)上限的大小判莉。


數(shù)據(jù)有序性的差異

TCP:對(duì)于 TCP 來(lái)說(shuō)豆挽,本身 TCP 有著超時(shí)重傳、錯(cuò)誤重傳券盅、還有等等一系列復(fù)雜的算法保證了 TCP 的數(shù)據(jù)是有序的帮哈,假設(shè)你發(fā)送了數(shù)據(jù) 1、2锰镀、3娘侍,則只要發(fā)送端和接收端保持連接時(shí),接收端收到的數(shù)據(jù)始終都是 1泳炉、2憾筏、3。

UDP:而 UDP 協(xié)議則要奔放的多花鹅,無(wú)論 server 端無(wú)論緩沖池的大小有多大氧腰,接收 client 端發(fā)來(lái)的消息總是一個(gè)一個(gè)的接收。并且由于 UDP 本身的不可靠性以及無(wú)序性刨肃,如果 client 發(fā)送了 1古拴、2、3 這三個(gè)數(shù)據(jù)報(bào)過(guò)來(lái)之景,server 端接收到的可能是任意順序斤富、任意個(gè)數(shù)三個(gè)數(shù)據(jù)報(bào)的排列組合。


可靠性的差異

TCP:TCP 內(nèi)部的很多算法機(jī)制讓他保持連接的過(guò)程中是很可靠的锻狗。比如:TCP 的超時(shí)重傳满力、錯(cuò)誤重傳焕参、TCP 的流量控制、阻塞控制油额、慢熱啟動(dòng)算法叠纷、擁塞避免算法、快速恢復(fù)算法 等等潦嘶。所以 TCP 是一個(gè)內(nèi)部原理復(fù)雜涩嚣,但是使用起來(lái)比較簡(jiǎn)單的這么一個(gè)協(xié)議。

UDP:UDP 是一個(gè)面向非連接的協(xié)議掂僵,UDP 發(fā)送的每個(gè)數(shù)據(jù)報(bào)帶有自己的 IP 地址和接收方的 IP 地址航厚,它本身對(duì)這個(gè)數(shù)據(jù)報(bào)是否出錯(cuò),是否到達(dá)不關(guān)心锰蓬,只要發(fā)出去了就好了幔睬。


使用場(chǎng)景
  • UDP

對(duì)實(shí)時(shí)性要求高:比如實(shí)時(shí)會(huì)議,實(shí)時(shí)視頻這種情況下芹扭,如果使用 TCP麻顶,當(dāng)網(wǎng)絡(luò)不好發(fā)生重傳時(shí),畫(huà)面肯定會(huì)有延時(shí)舱卡,甚至越堆越多辅肾。如果使用 UDP 的話,即使偶爾丟了幾個(gè)包轮锥,但是也不會(huì)影響什么矫钓,這種情況下使用 UDP 比較好;
多點(diǎn)通信:TCP 需要保持一個(gè)長(zhǎng)連接舍杜,那么在涉及多點(diǎn)通訊的時(shí)候份汗,肯定需要和多個(gè)通信節(jié)點(diǎn)建立其雙向連接,然后有時(shí)在NAT環(huán)境下蝴簇,兩個(gè)通信節(jié)點(diǎn)建立其直接的 TCP 連接不是一個(gè)容易的事情杯活,而 UDP 可以無(wú)需保持連接,直接發(fā)就可以了熬词,所以成本會(huì)很低旁钧,而且穿透性好。這種情況下使用 UDP 也是沒(méi)錯(cuò)的互拾。

  • TCP

其他場(chǎng)景歪今,基本都是TCP更加適合。


第三方庫(kù)

CocoaAsyncSocket:https://github.com/robbiehanson/CocoaAsyncSocket

CocoaAsyncSocket provides easy-to-use and powerful asynchronous socket libraries for Mac and iOS. The classes are described below.


參考鏈接:
http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颜矿,一起剝皮案震驚了整個(gè)濱河市寄猩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骑疆,老刑警劉巖田篇,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件替废,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泊柬,警方通過(guò)查閱死者的電腦和手機(jī)椎镣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兽赁,“玉大人状答,你說(shuō)我怎么就攤上這事〉堆拢” “怎么了惊科?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亮钦。 經(jīng)常有香客問(wèn)我译断,道長(zhǎng),這世上最難降的妖魔是什么或悲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮堪唐,結(jié)果婚禮上巡语,老公的妹妹穿的比我還像新娘。我一直安慰自己淮菠,他們只是感情好男公,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著合陵,像睡著了一般枢赔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拥知,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天踏拜,我揣著相機(jī)與錄音,去河邊找鬼低剔。 笑死速梗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的襟齿。 我是一名探鬼主播姻锁,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猜欺!你這毒婦竟也來(lái)了位隶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤开皿,失蹤者是張志新(化名)和其女友劉穎涧黄,沒(méi)想到半個(gè)月后篮昧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弓熏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年恋谭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挽鞠。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疚颊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出信认,到底是詐尸還是另有隱情材义,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布嫁赏,位于F島的核電站其掂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏潦蝇。R本人自食惡果不足惜款熬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攘乒。 院中可真熱鬧贤牛,春花似錦、人聲如沸则酝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沽讹。三九已至般卑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爽雄,已是汗流浹背蝠检。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挚瘟,地道東北人蝇率。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刽沾,于是被迫代替她去往敵國(guó)和親本慕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容