最近在學(xué)習(xí)Alamofire框架的相關(guān)知識(shí),這是一個(gè)
Swift版本的很強(qiáng)大的網(wǎng)絡(luò)請(qǐng)求庫,再深入學(xué)習(xí)之前,我們先來學(xué)習(xí)了解一下跟網(wǎng)絡(luò)協(xié)議相關(guān)的一些知識(shí)。以下的概念內(nèi)容和背景來自百度百科TCP/IP協(xié)議
概念
TCP/IP協(xié)議(傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)不是簡(jiǎn)單的一個(gè)協(xié)議,而是一組特別的協(xié)議,包括:TCP,IP,UDP,ARP等,這些被稱為子協(xié)議。在這些協(xié)議中,最重要、最著名的就是TCP和IP。因此,大部分網(wǎng)絡(luò)管理員稱整個(gè)協(xié)議族為“TCP/IP”。
產(chǎn)生的背景
Internet網(wǎng)絡(luò)的前身ARPANET當(dāng)時(shí)使用的并不是傳輸控制協(xié)議/網(wǎng)際協(xié)議(Transmission Control Protocol/Internet Protocol,TCP/IP),而是一種叫網(wǎng)絡(luò)控制協(xié)議(Network Control Protocol,NCP)的網(wǎng)絡(luò)協(xié)議,但隨著網(wǎng)絡(luò)的發(fā)展和用戶對(duì)網(wǎng)絡(luò)的需求不斷提高,設(shè)計(jì)者們發(fā)現(xiàn),NCP協(xié)議存在著很多的缺點(diǎn)以至于不能充分支持ARPANET網(wǎng)絡(luò),特別是NCP僅能用于同構(gòu)環(huán)境中(所謂同構(gòu)環(huán)境是網(wǎng)絡(luò)上的所有計(jì)算機(jī)都運(yùn)行相同的操作系統(tǒng)),設(shè)計(jì)者就認(rèn)為“同構(gòu)”這一限制不應(yīng)被加到一個(gè)分布廣泛的網(wǎng)絡(luò)上。1980年,用于“異構(gòu)”網(wǎng)絡(luò)環(huán)境中的TCP/IP協(xié)議研制成功,也就是說,TCP/IP協(xié)議可以在各種硬件和操作系統(tǒng)上實(shí)現(xiàn)互操作。1982年,ARPANET開始采用TCP/IP協(xié)議。TCP/IP始于美國國防部,美國國防部于20世紀(jì)60年代末為高級(jí)研究計(jì)劃局網(wǎng)絡(luò)(ARPAnet,Internet的前身)開發(fā)了TCP/IP。TCP/IP的迅速流行要?dú)w功于它的低成本、可在不同的平臺(tái)間進(jìn)行通信的能力和它開放的特性。“開放”的意思是軟件開發(fā)人員可以自由地使用和修改TCP/IP的核心協(xié)議。TCP/IP是Internet實(shí)際采用的標(biāo)準(zhǔn)。UNIX和Linux一直都使用TCP/IP,Windows網(wǎng)絡(luò)操作系統(tǒng)也以TCP/IP作為默認(rèn)的協(xié)議。TCP/IP協(xié)議的開發(fā)始于20世紀(jì)60年代后期,早于OSI參考模型,故不甚符合OSI參考標(biāo)準(zhǔn)。大致來說,TCP協(xié)議對(duì)應(yīng)于OSI參考模型的傳輸層,IP協(xié)議對(duì)應(yīng)于網(wǎng)絡(luò)層。雖然OSI參考模型是計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議的標(biāo)準(zhǔn),但由于其開銷太大,所以真正采用它的情況并不多。TCP/IP協(xié)議則不然,由于它的簡(jiǎn)潔、實(shí)用,從而得到了廣泛的應(yīng)用。可以說,TCP/IP協(xié)議已成為建立計(jì)算機(jī)局域網(wǎng)、廣域網(wǎng)的首選協(xié)議,已成為事實(shí)上的工業(yè)標(biāo)準(zhǔn)和國際標(biāo)準(zhǔn)。
協(xié)議分層
TCP/IP協(xié)議族按照層次由上到下有以下各層,層層包裝。
應(yīng)用層
這一層,向用戶提供一組常用的應(yīng)用程序,比如電子郵件、文件傳輸訪問、遠(yuǎn)程登錄等。遠(yuǎn)程登錄
TELNET使用TELNET協(xié)議提供在網(wǎng)絡(luò)其它主機(jī)上注冊(cè)的接口。TELNET會(huì)話提供了基于字符的虛擬終端。文件傳輸訪問FTP使用FTP協(xié)議來提供網(wǎng)絡(luò)內(nèi)機(jī)器間的文件拷貝功能。
傳輸層
提供應(yīng)用程序間的通信。其功能包括:一、格式化信息流;二、提供可靠傳輸。為實(shí)現(xiàn)后者,傳輸層協(xié)議規(guī)定接收端必須發(fā)回確認(rèn),并且假如分組丟失,必須重新發(fā)送。
網(wǎng)絡(luò)層
負(fù)責(zé)相鄰計(jì)算機(jī)之間的通信。其功能包括三方面:
- 處理來自傳輸層的分組發(fā)送請(qǐng)求,收到請(qǐng)求后,將分組裝入IP數(shù)據(jù)報(bào),填充報(bào)頭,選擇去往信宿機(jī)的路徑,然后將數(shù)據(jù)報(bào)發(fā)往適當(dāng)?shù)木W(wǎng)絡(luò)接口。
- 處理輸入數(shù)據(jù)報(bào):首先檢查其合法性,然后進(jìn)行尋徑--假如該數(shù)據(jù)報(bào)已到達(dá)信宿機(jī),則去掉報(bào)頭,將剩下部分交給適當(dāng)?shù)膫鬏攨f(xié)議;假如該數(shù)據(jù)報(bào)尚未到達(dá)信宿,則轉(zhuǎn)發(fā)該數(shù)據(jù)報(bào)。
- 處理路徑、流控、擁塞等問題。
數(shù)據(jù)鏈路層
這是
TCP/IP軟件的最低層,負(fù)責(zé)接收IP數(shù)據(jù)報(bào)并通過網(wǎng)絡(luò)發(fā)送之,或者從網(wǎng)絡(luò)上接收物理幀,抽出IP數(shù)據(jù)報(bào),交給IP層。
與HTTP關(guān)系密切的TCP、IP
IP協(xié)議
IP協(xié)議的作用在于把各種數(shù)據(jù)包準(zhǔn)確無誤的傳遞給對(duì)方,其中兩個(gè)重要的條件是IP地址、MAC地址(Media Access Control Address)。由于IP地址是稀有資源,不可能每個(gè)人都擁有一個(gè)IP地址,所以我們通常的IP地址是路由器給我們生成的IP地址,路由器里面會(huì)記錄我們的MAC地址。而MAC地址是全球唯一的,除去人為因素外不可能重復(fù)。舉一個(gè)現(xiàn)實(shí)生活中的例子,IP地址就如同是我們居住小區(qū)的地址,而MAC地址就是我們住的那棟樓那個(gè)房間那個(gè)人。
TCP協(xié)議
- 如果說
IP協(xié)議是找到對(duì)方的詳細(xì)地址。那么TCP協(xié)議就是把安全的把東西帶給對(duì)方。各有分工,互不沖突。- 按層次分,
TCP屬于傳輸層,提供可靠的字節(jié)流服務(wù)。什么叫字節(jié)流服務(wù)呢?這個(gè)名字聽起來讓人不知所以然,所謂的字節(jié)流服務(wù)(Byte Stream Service)是指,為了方便傳輸,將大塊數(shù)據(jù)分割成以報(bào)文段(segment)為單位的數(shù)據(jù)包進(jìn)行管理。而可靠的傳輸服務(wù)是指,能夠把數(shù)據(jù)準(zhǔn)確可靠地傳給對(duì)方。一言以蔽之,TCP協(xié)議為了更容易傳送大數(shù)據(jù)才把數(shù)據(jù)分割,而且TCP協(xié)議能夠確認(rèn)數(shù)據(jù)最終是否送達(dá)到對(duì)方。- 為了確保信息能夠確保準(zhǔn)確無誤的到達(dá),
TCP采用了著名的三次握手策略。
通過上面的概述,引來了咱們的重點(diǎn)知識(shí)問題:
-
TCP建立連接為什么是三次握手,而不是兩次或四次? - 為什么又出現(xiàn)了四次揮手?什么是四次揮手?
接下來,我們來一一解答這個(gè)問題。
三次握手
一些名詞解釋
SYN:發(fā)起一個(gè)新連接ACK:確認(rèn)序號(hào)有效PSH:接收方應(yīng)該盡快將這個(gè)報(bào)文交給應(yīng)用層FIN:釋放一個(gè)連接RST:重置連接URG:緊急指針(urgent pointer)有效Sequence number:Seq序號(hào),占32位,用來標(biāo)識(shí)從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時(shí)對(duì)此進(jìn)行標(biāo)記。Acknowledge number:Ack序號(hào),占32位,只有ACK標(biāo)志位為1時(shí),確認(rèn)序號(hào)字段才有效,Ack=Seq+1。establish:建立,創(chuàng)建
三次握手流程
所謂的三次握手,即是建立TCP的連接,是指在建立一個(gè)TCP的連接時(shí),需要客戶端和服務(wù)端總共發(fā)送3個(gè)包以確認(rèn)連接的建立。在socket編程中,這一過程由客戶端執(zhí)行connect來觸發(fā),整個(gè)流程如下圖所示:

看到上面這圖,感覺怎么樣?一臉懵了吧,看看上面的名詞解釋吧。
- 第一次握手:
Client將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=J,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN_SENT狀態(tài),等待Server確認(rèn)。- 第二次握手:
Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請(qǐng)求建立連接,Server將標(biāo)志位SYN和ACK都置為1,ack (number )=J+1,隨機(jī)產(chǎn)生一個(gè)值seq=K,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請(qǐng)求,Server進(jìn)入SYN_RCVD狀態(tài)。- 第三次握手:
Client收到確認(rèn)后,檢查ack是否為J+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了。
四次揮手
所謂的四次揮手即是終止TCP連接,就是指斷開一個(gè)TCP連接時(shí),需要客戶端和服務(wù)端總共發(fā)送4個(gè)包以確認(rèn)連接的斷開。在socket編程中,這一過程由客戶端或服務(wù)端任一方執(zhí)行close來觸發(fā),整個(gè)流程如下圖所示:

由于
TCP連接是全雙工的,因此,每個(gè)方向都必須要單獨(dú)進(jìn)行關(guān)閉,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個(gè)FIN來終止這一方向的連接,收到一個(gè)FIN只是意味著這一方向上沒有數(shù)據(jù)流動(dòng)了,即不會(huì)再收到數(shù)據(jù)了,但是在這個(gè)TCP連接上仍然能夠發(fā)送數(shù)據(jù),直到這一方向也發(fā)送了FIN。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方則執(zhí)行被動(dòng)關(guān)閉,上圖描述的即是如此。
- 第一次揮手:
Client發(fā)送一個(gè)FIN,用來關(guān)閉Client到Server的數(shù)據(jù)傳送,Client進(jìn)入FIN_WAIT_1狀態(tài)。- 第二次揮手:
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)。- 第三次揮手:
Server發(fā)送一個(gè)FIN,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)。- 第四次揮手:
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),完成四次揮手。
當(dāng)然,還有其他的情況,上面如果是一方主動(dòng)關(guān)閉了連接,另一方被動(dòng)關(guān)閉的情況,實(shí)際中,可能還會(huì)出現(xiàn)同時(shí)發(fā)起主動(dòng)關(guān)閉的情況,如下圖:

總結(jié)
簡(jiǎn)單的總結(jié)一下,關(guān)于TCP/IP相關(guān)的網(wǎng)絡(luò)知識(shí),還有很多很多我沒有提到的、深入了解到的東西,因?yàn)樵谶@里,我們只是為了探索Alamofire框架的一些前瞻知識(shí),有一個(gè)大概的了解基礎(chǔ),并不是需要深入底層去了解網(wǎng)絡(luò)TCP/IP,有興趣的同學(xué),可以去查查其他資料,有很多的,我這里就不深入了。接下來的文章,我們會(huì)慢慢的深入我們的主題 -- Alamofire