一版述、前言
Alamofire 是用 swift 寫的一套網(wǎng)絡(luò)請(qǐng)求三方庫广料,相當(dāng)于 OC 中的 AFNetWorking钦扭。在開始學(xué)習(xí) Alamofire 之前戒劫,先來復(fù)習(xí)一下網(wǎng)絡(luò)的一些基礎(chǔ)知識(shí),這樣可以更有助于我們學(xué)習(xí)理解這個(gè)網(wǎng)絡(luò)請(qǐng)求框架奸鬓。
二焙畔、OSI 七層網(wǎng)絡(luò)架構(gòu)
1、概覽
互聯(lián)網(wǎng)協(xié)議 按照功能不同分為 OSI 七層或 tcp/ip 五層或 tcp/ip 四層串远。每一層都運(yùn)行不同的協(xié)議宏多。如下圖:
每層的對(duì)應(yīng)的功能與協(xié)議如下表格:
OSI七層網(wǎng)絡(luò)模型 | TCP/IP四層概念模型 | 功能 | 對(duì)應(yīng)的協(xié)議 |
---|---|---|---|
應(yīng)用層(Application) | 應(yīng)用層 | 文件傳輸,電子郵件澡罚,文件服務(wù)伸但,虛擬終端 | HTTP、TFTP, FTP, NFS, WAIS留搔、SMTP更胖、Telnet |
表示層(Presentation) | 應(yīng)用層 | 數(shù)據(jù)格式化,代碼轉(zhuǎn)換隔显,數(shù)據(jù)加密 | Telnet, Rlogin, SNMP, Gopher |
會(huì)話層(Session) | 應(yīng)用層 | 解除或建立與其他接點(diǎn)的聯(lián)系 | SMTP, DNSr |
傳輸層(Transport) | 傳輸層 | 提供端對(duì)端的接口 | TCP, UDP |
網(wǎng)絡(luò)層(Network) | 網(wǎng)絡(luò)層 | 為數(shù)據(jù)包選擇路由 | SMTP, DNSr |
數(shù)據(jù)鏈路層(Data Link) | 網(wǎng)絡(luò)接口層 | 傳輸有地址的幀却妨,錯(cuò)誤檢測(cè)功能 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理層(Physical) | 網(wǎng)絡(luò)接口層 | 以二進(jìn)制數(shù)據(jù)形式在物理媒體上傳輸數(shù)據(jù) | IEEE 802.1A, IEEE 802.2 到 IEEE 802.11 |
客戶端發(fā)送請(qǐng)求到接收端的過程:
發(fā)送端在層與層之間傳輸數(shù)據(jù)時(shí),每經(jīng)過一層時(shí)必定會(huì)被打上一個(gè)該層所屬的首部信息括眠。反之彪标,接收端在層與層傳輸數(shù)據(jù)時(shí),每經(jīng)過一層時(shí)會(huì)把對(duì)應(yīng)的首部消去掷豺。
這種把數(shù)據(jù)信息包裝起來的做法成為封裝捞烟。
2、具體介紹
1)物理層(Physical)
物理層就是通過光纖当船、電纜等進(jìn)行連接题画,基于電器特性發(fā)送高低電壓(電信號(hào)),高電壓對(duì)應(yīng)數(shù)字 1德频,低電壓對(duì)應(yīng)數(shù)字 0苍息,傳輸一堆 001010100 的二進(jìn)制位。
2)數(shù)據(jù)鏈路層(Data Link)
只是物理層的單純的電信號(hào) 0 和 1 是沒有意義的,必須規(guī)定電信號(hào)多少位一組档叔,每組什么意思才行桌粉,數(shù)據(jù)鏈路層就是來對(duì)電信號(hào)來做分組的。數(shù)據(jù)鏈路層在不可靠的物理介質(zhì)上提供可靠的傳輸衙四。
該層的作用包括:
物理地址尋址、數(shù)據(jù)的成幀患亿、流量控制传蹈、數(shù)據(jù)的檢錯(cuò)、重發(fā)等步藕。在這一層惦界,數(shù)據(jù)的單位稱為幀(frame)。數(shù)據(jù)鏈路層協(xié)議的代表包括:SDLC咙冗、HDLC沾歪、PPP、STP等雾消。
3)網(wǎng)絡(luò)層(Network)
網(wǎng)絡(luò)層的任務(wù)就是選擇合適的網(wǎng)間路由和交換結(jié)點(diǎn)灾搏, 確保數(shù)據(jù)及時(shí)傳送。網(wǎng)絡(luò)層將數(shù)據(jù)鏈路層提供的幀組成數(shù)據(jù)包立润,包中封裝有網(wǎng)絡(luò)層包頭狂窑,其中含有邏輯地址信息- -源站點(diǎn)和目的站點(diǎn)地址的網(wǎng)絡(luò)地址。網(wǎng)絡(luò)層主要設(shè)備是路由器桑腮。
網(wǎng)絡(luò)層還可以實(shí)現(xiàn)擁塞控制泉哈、網(wǎng)際互連等功能。在這一層破讨,數(shù)據(jù)的單位稱為數(shù)據(jù)包(packet)丛晦。網(wǎng)絡(luò)層協(xié)議的代表包括:IP、IPX提陶、RIP烫沙、OSPF 等。
4)傳輸層(Transport)
網(wǎng)絡(luò)層的 ip 幫我們區(qū)分子網(wǎng)搁骑,以太網(wǎng)層的 mac 幫我們找到主機(jī)斧吐,那么如何標(biāo)識(shí)這臺(tái)主機(jī)上的應(yīng)用程序,那就需要端口仲器,端口就是應(yīng)用程序與網(wǎng)卡關(guān)聯(lián)的編號(hào)煤率。
傳輸層功能就是建立端口到端口的通信。端口范圍 0-65535乏冀,0-1023 為系統(tǒng)占用端口蝶糯。
(1)TCP 協(xié)議:
可靠傳輸,TCP 數(shù)據(jù)包沒有長度限制辆沦,理論上可以無限長昼捍,但是為了保證網(wǎng)絡(luò)的效率识虚,通常 TCP 數(shù)據(jù)包的長度不會(huì)超過IP數(shù)據(jù)包的長度,以確保單個(gè) TCP 數(shù)據(jù)包不必再分割妒茬。
源端口和目的端口:
一個(gè) IP 地址和端口的組合稱為“套接字”或“端點(diǎn)”担锤。
所以 IP 協(xié)議中的源 IP 地址和目的地址,組成了“一對(duì)”套接字(發(fā)送端的套接字和接收端的套接字)乍钻。序號(hào):
每一個(gè)“TCP 報(bào)文段中的第一個(gè)字節(jié)”都會(huì)被賦予一個(gè)序號(hào)(遞增)肛循。根據(jù) 控制標(biāo)志 中的 SYN 是否為 1,序號(hào)表達(dá)不同的含義:
SYN = 1:當(dāng)前為連接建立階段银择,此時(shí)的序號(hào)為初始序號(hào)(ISN)多糠。當(dāng)數(shù)據(jù)傳輸正式開始時(shí),數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)為 ISN + 1;
SYN = 0:當(dāng)前報(bào)文段中浩考,數(shù)據(jù)部分的第一個(gè)字節(jié)的序號(hào)夹孔。確認(rèn)號(hào)(TCP返回報(bào)文使用):
確認(rèn)號(hào)也稱 ACK 號(hào)或 ACK 字段。確認(rèn)號(hào)包含的值為:“確認(rèn)號(hào)的發(fā)送方”希望接收的下一個(gè)序列號(hào)析孽。(即最后接收成功的序列號(hào) +1)一旦連接建立成功搭伤,ACK 值一直為1。數(shù)據(jù)偏移量:
TCP 報(bào)文段的首部長度绿淋,單位是 word(4字節(jié))闷畸。字面含義是:TCP 報(bào)文段的數(shù)據(jù)的起始處,距離 TCP 報(bào)文段的起始處 的偏移量吞滞。4 個(gè)字節(jié)最大能表示的數(shù)字是 15佑菩,所以首部最大 60 字節(jié)。保留字段:
預(yù)留作為后續(xù)用途裁赠,必須是 0殿漠。控制標(biāo)志:
一共有 6 個(gè)控制標(biāo)志,其中 SYN/ACK佩捞、FIN/ACK 主要用于連接的建立绞幌、斷開階段。
URG: 當(dāng)置為 1 時(shí)一忱,表示 緊急指針 字段有效莲蜘;
ACK: 確認(rèn) 序號(hào) 字段有效;
PSH: 接收方應(yīng)立即把這個(gè)報(bào)文段交給應(yīng)用層帘营;
RST: 重建連接票渠;
SYN: 同步序號(hào),用于建立連接芬迄;
FIN: 發(fā)送端不再發(fā)送數(shù)據(jù)问顷;窗口大小:
允許對(duì)方發(fā)送的數(shù)據(jù)量。告訴對(duì)方自己緩沖區(qū)還能容納多少字節(jié)杜窄,用來控制對(duì)方發(fā)送數(shù)據(jù)的速度肠骆。校驗(yàn)和:
發(fā)送端對(duì) TCP 首部、數(shù)據(jù)進(jìn)行 CRC 運(yùn)算得出的結(jié)果塞耕。接收端收到數(shù)據(jù)后蚀腿,對(duì)接收到的 TCP 報(bào)文段的首部、數(shù)據(jù)進(jìn)行CRC 運(yùn)算扫外,并跟 TCP 首部中的校驗(yàn)和進(jìn)行對(duì)比唯咬,確保數(shù)據(jù)在傳輸過程中沒有損壞。緊急指針:
僅在 URG=1 時(shí)才生效畏浆,它的值是一個(gè)偏移量,和序號(hào)字段中的值相加得到緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)狞贱。
- 可選字段:
最常見的可選字段是 MSS(Maximum Segment Size)刻获,表示最長報(bào)文大小,通信雙方通常在連接的第一個(gè)報(bào)文段中指明這個(gè)選項(xiàng)瞎嬉。(只能出現(xiàn)在 SYN 報(bào)文中)
TCP 的三次握手和四次揮手:
(1)三次握手:
第一次握手: 建立連接時(shí)蝎毡,客戶端發(fā)送 syn 包(syn=x)到服務(wù)器,并進(jìn)入
SYN_SENT
狀態(tài)氧枣,等待服務(wù)器確認(rèn)沐兵;SYN: 同步序列編號(hào)(Synchronize Sequence Numbers)。
第二次握手: 服務(wù)器收到syn包便监,必須確認(rèn)客戶的 SYN(ack=x+1)扎谎,同時(shí)自己也發(fā)送一個(gè) SYN 包(syn=y),即 SYN+ACK 包烧董,此時(shí)服務(wù)器進(jìn)入 SYN_RECV
狀態(tài)毁靶;
第三次握手: 客戶端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器發(fā)送確認(rèn)包 ACK(ack=y+1)逊移,此包發(fā)送完畢预吆,客戶端和服務(wù)器進(jìn)入 ESTABLISHED
(TCP 連接成功)狀態(tài),完成三次握手胳泉。
(2)四次揮手:
1)客戶端進(jìn)程發(fā)出連接釋放報(bào)文拐叉,并且停止發(fā)送數(shù)據(jù)。釋放數(shù)據(jù)報(bào)文首部扇商,FIN=1凤瘦,其序列號(hào)為 seq=u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加 1 ),此時(shí)钳吟,客戶端進(jìn)入
FIN-WAIT-1
(終止等待 1)狀態(tài)廷粒。 TCP 規(guī)定,FIN 報(bào)文段即使不攜帶數(shù)據(jù),也要消耗一個(gè)序號(hào)坝茎。
2)服務(wù)器收到連接釋放報(bào)文涤姊,發(fā)出確認(rèn)報(bào)文,ACK=1嗤放,ack=u+1 思喊,并且?guī)献约旱男蛄刑?hào) seq=v ,此時(shí)次酌,服務(wù)端就進(jìn)入了 CLOSE-WAIT
(關(guān)閉等待)狀態(tài)恨课。TCP 服務(wù)器通知高層的應(yīng)用進(jìn)程,客戶端向服務(wù)器的方向就釋放了岳服,這時(shí)候處于半關(guān)閉狀態(tài)剂公,即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但是服務(wù)器若發(fā)送數(shù)據(jù)吊宋,客戶端依然要接受纲辽。這個(gè)狀態(tài)還要持續(xù)一段時(shí)間,也就是整個(gè) CLOSE-WAIT
狀態(tài)持續(xù)的時(shí)間璃搜。
3)客戶端收到服務(wù)器的確認(rèn)請(qǐng)求后拖吼,此時(shí),客戶端就進(jìn)入 FIN-WAIT-2
(終止等待 2 )狀態(tài)这吻,等待服務(wù)器發(fā)送連接釋放報(bào)文(在這之前還需要接受服務(wù)器發(fā)送的最后的數(shù)據(jù))吊档。
4)服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后,就向客戶端發(fā)送連接釋放報(bào)文唾糯,FIN=1怠硼,ack=u+1 ,由于在半關(guān)閉狀態(tài)趾断,服務(wù)器很可能又發(fā)送了一些數(shù)據(jù)拒名,假定此時(shí)的序列號(hào)為 seq=w ,此時(shí)芋酌,服務(wù)器就進(jìn)入了 LAST-ACK
(最后確認(rèn))狀態(tài)增显,等待客戶端的確認(rèn)。
5)客戶端收到服務(wù)器的連接釋放報(bào)文后脐帝,必須發(fā)出確認(rèn)同云,ACK=1,ack=w+1 堵腹,而自己的序列號(hào)是 seq=u+1 炸站,此時(shí),客戶端就進(jìn)入了 TIME-WAIT
(時(shí)間等待)狀態(tài)疚顷。注意此時(shí)TCP連接還沒有釋放旱易,必須經(jīng)過 2??MSL (最長報(bào)文段壽命)的時(shí)間后禁偎,當(dāng)客戶端撤銷相應(yīng)的 TCB 后,才進(jìn)入 CLOSED
狀態(tài)阀坏。
6)服務(wù)器只要收到了客戶端發(fā)出的確認(rèn)如暖,立即進(jìn)入 CLOSED
狀態(tài)。同樣忌堂,撤銷 TCB 后盒至,就結(jié)束了這次的 TCP 連接∈啃蓿可以看到枷遂,服務(wù)器結(jié)束 TCP 連接的時(shí)間要比客戶端早一些。
面試時(shí)經(jīng)常問的問題:
1棋嘲、為什么 TCP 建立連接需要三次握手酒唉,而非兩次?
為了實(shí)現(xiàn)可靠傳輸沸移,發(fā)送方和接收方始終需要同步( SYNchronize )序號(hào)黔州。 需要注意的是, 序號(hào)并不是從 0 開始的阔籽, 而是由發(fā)送方隨機(jī)選擇的初始序列號(hào) ( Initial Sequence Number, ISN )開始 。 由于 TCP 是一個(gè)雙向通信協(xié)議牲蜀, 通信雙方都有能力發(fā)送信息笆制, 并接收響應(yīng)。 因此涣达, 通信雙方都需要隨機(jī)產(chǎn)生一個(gè)初始的序列號(hào)在辆, 并且把這個(gè)起始值告訴對(duì)方。
過程如下圖:
2度苔、為什么 TCP 斷開連接需要四次揮手匆篓,而非兩次或三次?
(2)UDP 協(xié)議:
不可靠傳輸寇窑,”報(bào)頭”部分一共只有 8 個(gè)字節(jié)鸦概,總長度不超過65,535 字節(jié),正好放進(jìn)一個(gè) IP 數(shù)據(jù)包甩骏。
TCP 與 UDP 的區(qū)別:
TCP 是可靠通信協(xié)議窗市, 而 UDP 是不可靠通信協(xié)議。
TCP 的可靠性含義: 接收方收到的數(shù)據(jù)是完整饮笛, 有序咨察, 無差錯(cuò)的。
UDP 不可靠性含義: 接收方接收到的數(shù)據(jù)可能存在部分丟失福青, 順序也不一定能保證摄狱。
TCP 協(xié)議為了實(shí)現(xiàn)可靠傳輸脓诡, 通信雙方需要判斷自己已經(jīng)發(fā)送的數(shù)據(jù)包是否都被接收方收到, 如果沒收到媒役, 就需要重發(fā)祝谚。 為了實(shí)現(xiàn)這個(gè)需求, 很自然地就會(huì)引出序號(hào)(sequence number) 和 確認(rèn)號(hào)(acknowledgement number) 的使用刊愚。
發(fā)送方在發(fā)送數(shù)據(jù)包(假設(shè)大小為 10 byte)時(shí)踊跟, 同時(shí)送上一個(gè)序號(hào)( 假設(shè)為 500),那么接收方收到這個(gè)數(shù)據(jù)包以后鸥诽, 就可以回復(fù)一個(gè)確認(rèn)號(hào)(510 = 500 + 10) 告訴發(fā)送方 “我已經(jīng)收到了你的數(shù)據(jù)包商玫, 你可以發(fā)送下一個(gè)數(shù)據(jù)包, 序號(hào)從 510 開始” 牡借。
這樣發(fā)送方就可以知道哪些數(shù)據(jù)被接收到拳昌,哪些數(shù)據(jù)沒被接收到, 需要重發(fā)钠龙。
5)會(huì)話層(Session)
這一層也可以稱為會(huì)晤層或?qū)υ拰泳嫣伲跁?huì)話層及以上的高層次中,數(shù)據(jù)傳送的單位不再另外命名碴里,而是統(tǒng)稱為報(bào)文沈矿。會(huì)話層不參與具體的傳輸,它提供包括訪問驗(yàn)證和會(huì)話管理在內(nèi)的建立和維護(hù)應(yīng)用之間通信的機(jī)制咬腋。如服務(wù)器驗(yàn)證用戶登錄便是由會(huì)話層完成的羹膳。
6)表示層(Presentation)
這一層主要解決擁護(hù)信息的語法表示問題。它將欲交換的數(shù)據(jù)從適合于某一用戶的抽象語法根竿,轉(zhuǎn)換為適合于 OSI 系統(tǒng)內(nèi)部使用的傳送語法陵像。即提供格式化的表示和轉(zhuǎn)換數(shù)據(jù)服務(wù)。數(shù)據(jù)的壓縮和解壓縮寇壳, 加密和解密等工作都由表示層負(fù)責(zé)醒颖。
7)應(yīng)用層(Application)
應(yīng)用層為操作系統(tǒng)或網(wǎng)絡(luò)應(yīng)用程序提供訪問網(wǎng)絡(luò)服務(wù)的接口。應(yīng)用層協(xié)議的代表包括:Telnet壳炎、FTP泞歉、HTTP、SNMP 等匿辩。
以上的總結(jié)參考了并部分摘抄了以下文章疏日,非常感謝以下作者的分享!:
1撒汉、太白金星的《網(wǎng)絡(luò)協(xié)議篇(osi七層協(xié)議)》
2沟优、上野 宣 的《圖解http》
3、Red_Code的《TCP協(xié)議詳解》
4睬辐、程序猿小卡的《TCP入門與實(shí)例講解》
5挠阁、青柚_的《TCP的三次握手與四次揮手理解及面試題(很全面)》
轉(zhuǎn)載請(qǐng)備注原文出處宾肺,不得用于商業(yè)傳播——凡幾多