18.iOS開發(fā)-Socket網(wǎng)絡(luò)編程

網(wǎng)絡(luò)七層由下往上分別為物理層鳍贾、數(shù)據(jù)鏈路層鞍匾、網(wǎng)絡(luò)層、傳輸層骑科、會話層橡淑、表示層和應(yīng)用層。
http協(xié)議對應(yīng)于應(yīng)用層

tcp協(xié)議對應(yīng)于傳輸層

ip協(xié)議對應(yīng)于網(wǎng)絡(luò)層

三者本質(zhì)上沒有可比性咆爽。 何況HTTP協(xié)議是基于TCP連接的梁棠。

1.Socket簡介

首先讓我們通過一張圖知道socket在哪里置森?

image

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

2.TCP和UDP的區(qū)別

在這里就必須講一下udp和tcp的區(qū)別了

TCP:面向連接暇藏、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)、用于傳輸大量數(shù)據(jù)(流模式)濒蒋、速度慢盐碱,建立連接需要開銷較多(時(shí)間,系統(tǒng)資源)沪伙。

UDP:面向非連接瓮顽、傳輸不可靠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)围橡、速度快暖混。

關(guān)于TCP是一種流模式的協(xié)議,UDP是一種數(shù)據(jù)報(bào)模式的協(xié)議翁授,這里要說明一 下拣播,TCP是面向連接的,也就是說收擦,在連接持續(xù)的過程中贮配,socket中收到的數(shù)據(jù)都是由同一臺主機(jī)發(fā)出的(劫持什么的不考慮),因此塞赂,知道保證數(shù)據(jù)是有 序的到達(dá)就行了泪勒,至于每次讀取多少數(shù)據(jù)自己看著辦。

而UDP是無連接的協(xié)議宴猾,也就是說圆存,只要知道接收端的IP和端口,且網(wǎng)絡(luò)是可達(dá)的仇哆,任何主機(jī)都可以向接收端發(fā)送數(shù)據(jù)沦辙。這時(shí)候,如果一次能讀取超過一 個(gè)報(bào)文的數(shù)據(jù)讹剔,則會亂套油讯。比如,主機(jī)A向發(fā)送了報(bào)文P1辟拷,主機(jī)B發(fā)送了報(bào)文P2,如果能夠讀取超過一個(gè)報(bào)文的數(shù)據(jù)阐斜,那么就會將P1和P2的數(shù)據(jù)合并在了一 起衫冻,這樣的數(shù)據(jù)是沒有意義的。

3.TCP三次握手和四次揮手

相對于SOCKET開發(fā)者谒出,TCP創(chuàng)建過程和連接拆除過程是由TCP/IP協(xié)議棧自動創(chuàng)建的隅俘。因此開發(fā)者并不需要控制這個(gè)過程邻奠。但是對于理解TCP底層運(yùn)作機(jī)制,相當(dāng)有幫助为居。

因此在這里詳細(xì)解釋一下這兩個(gè)過程碌宴。

TCP三次握手

所謂三次握手(Three-way Handshake),是指建立一個(gè)TCP連接時(shí)蒙畴,需要客戶端和服務(wù)器總共發(fā)送3個(gè)包贰镣。

三次握手的目的是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號和確認(rèn)號并交換 TCP 窗口大小信息.在socket編程中膳凝,客戶端執(zhí)行connect()時(shí)碑隆。將觸發(fā)三次握手

image.png

首先了解一下幾個(gè)標(biāo)志,SYN(synchronous)蹬音,同步標(biāo)志上煤,ACK (Acknowledgement),即確認(rèn)標(biāo)志著淆,seq應(yīng)該是Sequence Number劫狠,序列號的意思,另外還有四次握手的fin永部,應(yīng)該是final独泞,表示結(jié)束標(biāo)志。

第一次握手:客戶端發(fā)送一個(gè)TCP的SYN標(biāo)志位置1的包指明客戶打算連接的服務(wù)器的端口扬舒,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里阐肤。

第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時(shí)讲坎,將確認(rèn)序號(Acknowledgement Number)設(shè)置為客戶的序列號加1以孕惜,即X+1。

第三次握手:客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0晨炕,ACK標(biāo)志位為1衫画。并且把服務(wù)器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫序列號的+1瓮栗。

TCP四次揮手

TCP的連接的拆除需要發(fā)送四個(gè)包削罩,因此稱為四次揮手(four-way handshake)》鸭椋客戶端或服務(wù)器均可主動發(fā)起揮手動作弥激,在socket編程中,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作愿阐。

image.png

其實(shí)有個(gè)問題微服,為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次揮手缨历?
因?yàn)楫?dāng)Server端收到Client端的SYN連接請求報(bào)文后以蕴,可以直接發(fā)送SYN+ACK報(bào)文糙麦。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來 同步的丛肮。但是關(guān)閉連接時(shí)赡磅,當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會立即關(guān)閉SOCKET宝与,所以只能先回復(fù)一個(gè)ACK報(bào)文焚廊,告訴Client端," 你發(fā)的FIN報(bào)文我收到了"伴鳖。只有等到我Server端所有的報(bào)文都發(fā)送完了饶氏,我才能發(fā)送FIN報(bào)文讥脐,因此不能一起發(fā)送。故需要四步握手。

TCPsocket和UDPsocket的具體實(shí)現(xiàn)
講了這么久嗡呼,終于要開始講socket的具體實(shí)現(xiàn)了源祈,iOS提供了Socket網(wǎng)絡(luò)編程的接口CFSocket虫溜,不過這里使用BSD Socket合敦。

tcp和udp的socket是有區(qū)別的,這里給出這兩種的設(shè)計(jì)框架

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


image.png

基本UDP客戶—服務(wù)器程序設(shè)計(jì)基本框架流程圖


image.png

常用的Socket類型有兩種:流式Socket(SOCK_STREAM) 和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)豌汇。流式是一種面向連接的Socket幢炸,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無連 接的Socket拒贱,對應(yīng)于無連接的UDP服務(wù)應(yīng)用宛徊。

socket調(diào)用庫函數(shù)主要有:

創(chuàng)建套接字
Socket(af,type,protocol)

建立地址和套接字的聯(lián)系
bind(sockid, local addr, addrlen)

服務(wù)器端偵聽客戶端的請求
listen( Sockid ,quenlen)

建立服務(wù)器/客戶端的連接 (面向連接TCP)

客戶端請求連接:
Connect(sockid, destaddr, addrlen)

服務(wù)器端等待從編號為Sockid的Socket上接收客戶連接請求
newsockid=accept(Sockid,Clientaddr, paddrlen)

發(fā)送/接收數(shù)據(jù)

面向連接:
send(sockid, buff, bufflen)       
recv( )

面向無連接:
sendto(sockid,buff,…,addrlen)       
recvfrom( )

釋放套接字:
close(sockid)

socket(套接字)是通信的基石逻澳,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元闸天,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址斜做,本地進(jìn)程的協(xié)議端口苞氮,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口瓤逼。

多個(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連接至少需要一對套接字撵枢,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket,另一個(gè)運(yùn)行于服務(wù)器端诲侮,稱為ServerSocket。套接字之間的連接過程分為三個(gè)步驟:服務(wù)器監(jiān)聽箱蟆,客戶端請求沟绪,連接確認(rèn)。

HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸空猜、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議要比http協(xié)議安全绽慈。
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議它是一個(gè)安全通信通道,它基于HTTP開發(fā)辈毯,用于在客戶計(jì)算機(jī)和服務(wù)器之間交換信息坝疼。它使用安全套接字層(SSL)進(jìn)行信息交換,簡單來說它是HTTP的安全版谆沃。

HTTPS和HTTP的區(qū)別:

(1)HTTP 是超文本傳輸協(xié)議钝凶,屬于明文傳輸協(xié)議,HTTPS 則是具有安全性的基于ssl加密的傳輸協(xié)議

(2)HTTP 和 HTTPS 使用的是連接方式不同唁影,而且用的端口也不一樣,前者是80,后者是443耕陷。

(3)HTTP 是簡單的無狀態(tài)的連接。HTTPS 協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸据沈、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 要比 HTTP 協(xié)議安全

(4)HTTPS 內(nèi)容經(jīng)過對稱加密哟沫,每個(gè)連接生成一個(gè)唯一的加密密鑰(對稱秘鑰:對稱密鑰加密又叫專用密鑰加密,即發(fā)送和接收數(shù)據(jù)的雙方必使用相同的密鑰對明文進(jìn)行加密和解密運(yùn)算锌介。)

(5)HTTPS 內(nèi)容傳輸經(jīng)過完整性校驗(yàn)

(6)https協(xié)議需要到ca申請證書嗜诀,一般免費(fèi)證書很少,需要交費(fèi)孔祸,費(fèi)用大概與.COM域名差不多隆敢,每年需要交大約幾十元的費(fèi)用。而常見的http協(xié)議則沒有這一項(xiàng)融击;

iOS開發(fā)網(wǎng)絡(luò)篇—Socket編程

HTTP都在這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筑公,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尊浪,更是在濱河造成了極大的恐慌匣屡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拇涤,死亡現(xiàn)場離奇詭異捣作,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹅士,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門券躁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事也拜∫允妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵慢哈,是天一觀的道長蔓钟。 經(jīng)常有香客問我,道長卵贱,這世上最難降的妖魔是什么滥沫? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮键俱,結(jié)果婚禮上兰绣,老公的妹妹穿的比我還像新娘。我一直安慰自己编振,他們只是感情好缀辩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踪央,像睡著了一般雌澄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杯瞻,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天镐牺,我揣著相機(jī)與錄音,去河邊找鬼魁莉。 笑死睬涧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旗唁。 我是一名探鬼主播畦浓,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼检疫!你這毒婦竟也來了讶请?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤屎媳,失蹤者是張志新(化名)和其女友劉穎夺溢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烛谊,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡风响,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丹禀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片状勤。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鞋怀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出持搜,到底是詐尸還是另有隱情密似,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布葫盼,位于F島的核電站辛友,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剪返。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一邓梅、第九天 我趴在偏房一處隱蔽的房頂上張望脱盲。 院中可真熱鬧,春花似錦日缨、人聲如沸钱反。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽面哥。三九已至,卻和暖如春毅待,著一層夾襖步出監(jiān)牢的瞬間尚卫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工尸红, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吱涉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓外里,卻偏偏與公主長得像怎爵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子盅蝗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348