iOS Socket理論知識

序言

網(wǎng)絡(luò)七層由下往上分別為物理層想帅、數(shù)據(jù)鏈路層场靴、網(wǎng)絡(luò)層啡莉、傳輸層港准、會話層、表示層和應(yīng)用層咧欣。
其中物理層浅缸、數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層通常被稱作媒體層,是網(wǎng)絡(luò)工程師所研究的對象魄咕;
傳輸層衩椒、會話層、表示層和應(yīng)用層則被稱作主機(jī)層哮兰,是用戶所面向和關(guān)心的內(nèi)容毛萌。

  • http協(xié)議對應(yīng)于應(yīng)用層
  • tcp/udp協(xié)議對應(yīng)于傳輸層
  • ip協(xié)議對應(yīng)于網(wǎng)絡(luò)層

三者本質(zhì)上沒有可比性。何況HTTP協(xié)議是基于TCP連接的喝滞。TCP/IP是傳輸層協(xié)議阁将,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;而HTTP是應(yīng)用層協(xié)議右遭,主要解決如何包裝數(shù)據(jù)做盅。我們在傳輸數(shù)據(jù)時缤削,可以只使用傳輸層(TCP/IP),但是那樣的話吹榴,由于沒有應(yīng)用層亭敢,便無法識別數(shù)據(jù)內(nèi)容,如果想要使傳輸?shù)臄?shù)據(jù)有意義图筹,則必須使用應(yīng)用層協(xié)議帅刀,應(yīng)用層協(xié)議很多,有HTTP远剩、FTP劝篷、TELNET等等,也可以自己定義應(yīng)用層協(xié)議民宿。WEB使用HTTP作傳輸層協(xié)議娇妓,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)送到網(wǎng)絡(luò)上活鹰。Socket是對TCP/IP協(xié)議的封裝哈恰,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API)志群,通過Socket着绷,我們才能使用TCP/IP協(xié)議。

什么是Socket?

Socket又稱之為“套接字”锌云,是系統(tǒng)提供的用于網(wǎng)絡(luò)通信的方法荠医。它的實質(zhì)并不是一種協(xié)議,沒有規(guī)定計算機(jī)應(yīng)當(dāng)怎么樣傳遞消息桑涎,只是給程序員提供了一個發(fā)送消息的接口彬向,程序員使用這個接口提供的方法,發(fā)送與接收消息攻冷。

Socket描述了一個IP娃胆、端口對。它簡化了程序員的操作等曼,知道對方的IP以及PORT就可以給對方發(fā)送消息里烦,再由服務(wù)器端來處理發(fā)送的這些消息。所以禁谦,Socket一定包含了通信的雙方胁黑,即客戶端(Client)與服務(wù)端(server)。

TCP

TCP是面向連接的州泊、傳輸可靠(保證數(shù)據(jù)正確性且保證數(shù)據(jù)順序)丧蘸、用于傳輸大量數(shù)據(jù)(流模式)、速度慢拥诡,建立連接需要開銷較多(時間触趴,系統(tǒng)資源)氮发。

TCP是一種流模式的協(xié)議,是面向連接的冗懦,也就是說爽冕,在連接持續(xù)的過程中,socket中收到的數(shù)據(jù)都是由同一臺主機(jī)發(fā)出的(劫持什么的不考慮)披蕉,因此颈畸,知道保證數(shù)據(jù)是有序的到達(dá)就行了,至于每次讀取多少數(shù)據(jù)不關(guān)心没讲。

TCP三次握手

所謂三次握手(Three-way Handshake)眯娱,是指建立一個TCP連接時,需要客戶端和服務(wù)器總共發(fā)送3個包爬凑。三次握手的目的是連接服務(wù)器指定端口徙缴,建立TCP連接,并同步連接雙方的序列號和確認(rèn)號并交換TCP窗口大小信息。在socket編程中嘁信,客戶端執(zhí)行connect()時于样,將觸發(fā)三次握手(圖片來源于網(wǎng)絡(luò)):

TCP三次握手

SYN(synchronous)是同步標(biāo)志;ACK (Acknowledgement)是確認(rèn)標(biāo)志潘靖,seq是序列號穿剖。

  • 第一次握手:客戶端發(fā)送一個TCP的SYN標(biāo)志位置1的包,指明客戶打算連接的服務(wù)器的端口卦溢,以及初始序號X,保存在包頭的序列號字段里糊余。
  • 第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時单寂,將確認(rèn)序號設(shè)置為客戶的序列號加1以贬芥,即X+1。
  • 第三次握手:客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0凄贩,ACK標(biāo)志位為1誓军。并且把服務(wù)器發(fā)來ACK的序號字段+1袱讹,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫序列號的+1疲扎。

關(guān)于三次握手,知乎上有個段子我覺得挺好的捷雕。

「喂喂喂椒丧,能聽到嗎?」

「沒問題救巷。能聽到就回一聲壶熏。」

「沒問題浦译“艏伲」

TCP四次揮手

四次揮手的流程:

TCP四次揮手

當(dāng)Server端收到Client端的SYN連接請求報文后溯职,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的帽哑,SYN報文是用來同步的谜酒。但是關(guān)閉連接時,當(dāng)Server端收到FIN報文時妻枕,很可能并不會立即關(guān)閉SOCKET僻族,所以只能先回復(fù)一個ACK報文,告訴Client端屡谐,”你發(fā)的FIN報文我收到了”述么。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文愕掏,因此不能一起發(fā)送度秘。故需要四步握手。

TCP客戶端-服務(wù)器程序設(shè)計基本框架

TCP客戶端-服務(wù)器程序設(shè)計基本框架

UDP

UDP是面向無連接饵撑、傳輸不可靠敷钾、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)、速度快的傳輸層協(xié)議肄梨。注意阻荒,UDP傳輸?shù)氖菙?shù)據(jù)報包,而TCP是流众羡。

UDP是面向無連接的協(xié)議侨赡,只要知道接收端的IP和端口,且網(wǎng)絡(luò)是可達(dá)的粱侣,任何主機(jī)都可以向接收端發(fā)送數(shù)據(jù)羊壹。這時候,如果一次能讀取超過一個報文的數(shù)據(jù)齐婴,則會亂套油猫。比如,主機(jī)A向發(fā)送了報文P1柠偶,主機(jī)B發(fā)送了報文P2情妖,如果能夠讀取超過一個報文的數(shù)據(jù),那么就會將P1和P2的數(shù)據(jù)合并在了一起诱担,這樣的數(shù)據(jù)是沒有意義的毡证。

UDP客戶端-服務(wù)端程序設(shè)計基本框架

UDP客戶端-服務(wù)端程序設(shè)計基本框架

Socket的通信過程

每一個應(yīng)用或者說服務(wù)都有一個端口。比如DNS的端口號53蔫仙,http的端口號80都是對應(yīng)一個應(yīng)用或者服務(wù)的端口料睛。我們能由DNS請求到查詢信息,是因為DNS服務(wù)器時時刻刻都在監(jiān)聽53端口,當(dāng)收到我們的查詢請求以后恤煞,就能夠返回我們想要的IP信息屎勘。所以,從程序設(shè)計上來講居扒,應(yīng)該包含以下步驟:

  1. 服務(wù)端利用Socket監(jiān)聽端口挑秉;
  2. 客戶端發(fā)起連接;
  3. 服務(wù)端返回信息苔货,建立連接犀概,開始通信;
  4. 客戶端夜惭,服務(wù)端斷開連接姻灶。

Socket原理

套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元诈茧。它是網(wǎng)絡(luò)通信過程中端點的抽象表示产喉,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址敢会,本地進(jìn)程的協(xié)議端口曾沈,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口鸥昏。

應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時塞俱,TCP會遇到同時為多個應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。多個TCP連接或多個應(yīng)用程序進(jìn)程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)吏垮。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接障涯,許多計算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應(yīng)用層可以和傳輸層通過Socket接口膳汪,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信唯蝶,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。

Socket連接

建立Socket連接至少需要一對套接字遗嗽,其中一個運(yùn)行于客戶端粘我,稱為ClientSocket,另一個運(yùn)行于服務(wù)器端痹换,稱為ServerSocket征字。

套接字之間的連接過程分為三個步驟:

  • 服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài)晴音,實時監(jiān)控網(wǎng)絡(luò)狀態(tài)柔纵,等待客戶端的連接請求
  • 客戶端請求:指客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字锤躁。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號系羞,然后就向服務(wù)器端套接字提出連接請求
  • 連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時郭计,就響應(yīng)客戶端套接字的請求,建立一個新的線程椒振,把服務(wù)器端套接字的描述發(fā)給客戶端昭伸,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接澎迎。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)庐杨,繼續(xù)接收其他客戶端套接字的連接請求
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夹供,隨后出現(xiàn)的幾起案子灵份,更是在濱河造成了極大的恐慌,老刑警劉巖哮洽,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件填渠,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸟辅,警方通過查閱死者的電腦和手機(jī)氛什,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匪凉,“玉大人枪眉,你說我怎么就攤上這事≡俨悖” “怎么了瑰谜?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長树绩。 經(jīng)常有香客問我萨脑,道長,這世上最難降的妖魔是什么饺饭? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任渤早,我火速辦了婚禮,結(jié)果婚禮上瘫俊,老公的妹妹穿的比我還像新娘鹊杖。我一直安慰自己,他們只是感情好扛芽,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布骂蓖。 她就那樣靜靜地躺著,像睡著了一般川尖。 火紅的嫁衣襯著肌膚如雪登下。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音被芳,去河邊找鬼缰贝。 笑死,一個胖子當(dāng)著我的面吹牛畔濒,可吹牛的內(nèi)容都是我干的剩晴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侵状,長吁一口氣:“原來是場噩夢啊……” “哼赞弥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趣兄,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绽左,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诽俯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妇菱,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年暴区,在試婚紗的時候發(fā)現(xiàn)自己被綠了闯团。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡仙粱,死狀恐怖房交,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伐割,我是刑警寧澤候味,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站隔心,受9級特大地震影響白群,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硬霍,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一帜慢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唯卖,春花似錦粱玲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橄碾,卻和暖如春卵沉,著一層夾襖步出監(jiān)牢的瞬間颠锉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工偎箫, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留木柬,地道東北人皆串。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓淹办,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恶复。 傳聞我的和親對象是個殘疾皇子怜森,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 序言 網(wǎng)絡(luò)七層由下往上分別為物理層、數(shù)據(jù)鏈路層谤牡、網(wǎng)絡(luò)層副硅、傳輸層、會話層翅萤、表示層和應(yīng)用層恐疲。 其中物理層、數(shù)據(jù)鏈路層和...
    隨風(fēng)飄蕩的小逗逼閱讀 319評論 0 0
  • 網(wǎng)絡(luò)七層由上往下分別為 物理層套么,數(shù)據(jù)鏈路層培己,網(wǎng)絡(luò)層,傳輸層胚泌,會話層省咨,表示層和應(yīng)用層,其中物理層玷室,數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層...
    小魚兒喜歡花無缺閱讀 330評論 0 1
  • 一: 網(wǎng)絡(luò)各個協(xié)議:TCP/IP零蓉、SOCKET、HTTP 網(wǎng)絡(luò)七層由下往上分別為物理層穷缤、數(shù)據(jù)鏈路層敌蜂、網(wǎng)絡(luò)層、傳輸層...
    iYeso閱讀 1,436評論 0 13
  • 一津肛、網(wǎng)絡(luò)各個協(xié)議:TCP/IP章喉、SOCKET、HTTP等 網(wǎng)絡(luò)七層由下往上分別為物理層快耿、數(shù)據(jù)鏈路層囊陡、網(wǎng)絡(luò)層、傳輸層...
    杯水救車薪閱讀 2,264評論 0 17
  • 匆匆何處掀亥,皚皚煙雪路撞反。馴鹿自知前去處,銀鈴響破林霧搪花。 紅襖朱帽靴革遏片,偶逢垂髫夜歌嘹害。急問錦囊何物?翁不語繞麋車吮便。
    靜鈴音閱讀 375評論 8 4