http://www.reibang.com/p/a7666a73af0d
1.http
超文本傳輸協(xié)議,基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù), 該協(xié)議用于規(guī)定客戶端與服務(wù)端之間的傳輸規(guī)則,所傳輸?shù)膬?nèi)容不局限于文本(其實(shí)可以傳輸任意類型的數(shù)據(jù));
步驟
客戶端與服務(wù)器建立連接
建立連接后,客戶端給服務(wù)端發(fā)送請(qǐng)求
服務(wù)器收到消息后,給與響應(yīng)操作
客戶端收到消息后,展示到屏幕上,斷開連接
域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請(qǐng)求 --> 服務(wù)器響應(yīng)http請(qǐng)求棚菊,瀏覽器得到html代碼 --> 瀏覽器解析html代碼柳洋,并請(qǐng)求html代碼中的資源(如js、css孙援、圖片等) --> 瀏覽器對(duì)頁面進(jìn)行渲染呈現(xiàn)給用戶
請(qǐng)求報(bào)文主要包括: 請(qǐng)求行,請(qǐng)求頭,請(qǐng)求體
請(qǐng)求行: 請(qǐng)求行包含請(qǐng)求方法(Method)害淤、請(qǐng)求統(tǒng)一資源標(biāo)識(shí)符(URI)、HTTP版本號(hào)
請(qǐng)求頭:請(qǐng)求頭主要存放對(duì)客戶端想給服務(wù)端的附加信息 Host: 目標(biāo)服務(wù)器的網(wǎng)絡(luò)地址? Accept: 讓服務(wù)端知道客戶端所能接收的數(shù)據(jù)類型如text/html /Content-Length: body的長度 等等
請(qǐng)求體: 真正需要發(fā)給服務(wù)端的數(shù)據(jù)
響應(yīng)報(bào)文也包括三部分: 響應(yīng)行,響應(yīng)頭和響應(yīng)實(shí)體
狀態(tài)行 :是服務(wù)端返回給客戶端的狀態(tài)信息拓售,包含HTTP版本號(hào)窥摄、狀態(tài)碼、狀態(tài)碼對(duì)應(yīng)的英文名稱
響應(yīng)頭: 附加信息和請(qǐng)求頭類似
響應(yīng)體: 服務(wù)器返回的真正數(shù)據(jù)
HTTP 是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議础淤,HTTP 協(xié)議一共有五大特點(diǎn)
支持客戶/服務(wù)器模式
簡單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí)崭放,只需傳送請(qǐng)求方法和路徑;請(qǐng)求方法常用的有GET管毙、 HEAD纵苛、POST疾牲。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同.由于HTTP協(xié)議簡 單稍算,使得HTTP服務(wù)器的程序規(guī)模小裹虫,因而通信速度很快
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象篙顺。正在傳輸?shù)念愋陀蒀ontent-Type(Content- Type是HTTP包中用來表示內(nèi)容類型的標(biāo)識(shí))加以標(biāo)記
無連接:無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求政基。服務(wù)器處理完客戶的請(qǐng)求示辈,并收到 客戶的應(yīng)答后,即斷開連接? HTTP1.1一次請(qǐng)求可以處理多個(gè)請(qǐng)求了
無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議掌桩。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力,缺少狀態(tài)意 味著如果后續(xù)處理需要前面的信息边锁,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的 數(shù)據(jù)量增大,另一方面拘鞋,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快
HTTP1.0定義了三種請(qǐng)求方法: GET, POST 和 HEAD方法砚蓬。
HTTP1.1新增了五種請(qǐng)求方法: OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 請(qǐng)求指定的頁面信息盆色,并返回實(shí)體主體
HEAD 類似于get請(qǐng)求灰蛙,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求,數(shù)據(jù)被包含在請(qǐng)求體中
PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容
DELETE 請(qǐng)求服務(wù)器刪除指定的頁面
CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器
OPTIONS 允許客戶端查看服務(wù)器的性能
TRACE 回顯服務(wù)器收到的請(qǐng)求隔躲,主要用于測(cè)試或診斷
TCP是什么
Tcp(傳輸控制協(xié)議)是一種面向連接的摩梧、可靠的、基于字節(jié)流的傳輸層通信協(xié)議;是專門為了在不可靠的互聯(lián)網(wǎng)絡(luò)上提供一個(gè)可靠的端到端字節(jié)流而設(shè)計(jì)的宣旱,面向字節(jié)流;會(huì)有三次握手來建立連接仅父,而且在數(shù)據(jù)傳遞時(shí),有確認(rèn). 窗口. 重傳. 擁塞控制機(jī)制浑吟,在數(shù)據(jù)傳完之后笙纤,還會(huì)斷開來連接用來節(jié)約系統(tǒng)資源.
UDP是什么
UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議;它是面向非連接的協(xié)議,它不與對(duì)方建立連接组力,而是直接就把數(shù)據(jù)包發(fā)送過去;UDP適用于一次只傳送少量數(shù)據(jù)省容、對(duì)可靠性要求不高的應(yīng)用環(huán)境可以使用UDP;
TCP和UDP區(qū)別
1. TCP面向連接(三次握手);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2. TCP提供可靠的服務(wù)燎字。也就是說腥椒,通過TCP連接傳送的數(shù)據(jù),無差錯(cuò)候衍,不丟失笼蛛,不重復(fù),且按序到達(dá),UDP盡最大努力交付蛉鹿,即不保證可靠交付, Tcp通過校驗(yàn)和滨砍,重傳控制,序號(hào)標(biāo)識(shí)妖异,滑動(dòng)窗口惨好、確認(rèn)應(yīng)答實(shí)現(xiàn)可靠傳輸;
3. UDP具有較好的實(shí)時(shí)性,工作效率比TCP高随闺,適用于對(duì)高速傳輸和實(shí)時(shí)性有較高的通信或廣播通信
4. 每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多蔓腐,多對(duì)一和多對(duì)多的交互通信
5. TCP對(duì)系統(tǒng)資源要求較多矩乐,UDP對(duì)系統(tǒng)資源要求較少;
什么是三次握手
所謂三次握手(Three-Way Handshake)即建立TCP連接,是指建立一個(gè)TCP連接時(shí),需要客戶端和服務(wù)端總共發(fā)送3個(gè)包以確認(rèn)連接的建立;
第一次握手:客戶端發(fā)送 syn 包(syn=j)到服務(wù)器散罕,并進(jìn)入 SYN_SEND 狀態(tài)分歇,等待服務(wù)器確認(rèn)
第二次握手:服務(wù)器收到 syn 包,必須確認(rèn)客戶的 SYN(ack=j+1)欧漱,同時(shí)自己也發(fā) 送一個(gè) SYN 包(syn=k)职抡,即 SYN+ACK 包,此時(shí)服務(wù)器進(jìn)入 SYN_RECV 狀態(tài)
第三次握手:客戶端收到服務(wù)器的 SYN+ACK 包误甚,向服務(wù)器發(fā)送確認(rèn)包 ACK(ack=k+1)缚甩, 此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入 ESTABLISHED 狀態(tài)窑邦,完成三次握手
握手過程中傳送的包里不包含數(shù)據(jù)擅威,三次握手完畢后,客戶端與服務(wù)器才正式開始 傳送數(shù)據(jù)
什么是四次揮手
由于TCP連接是全雙工的冈钦,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉;這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接;收到一個(gè) FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng)郊丛,一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù);首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉
TCP客戶端發(fā)送一個(gè)FIN瞧筛,用來關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送
服務(wù)器收到這個(gè)FIN厉熟,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1较幌。和SYN一樣揍瑟,一個(gè)FIN將占用一個(gè)序號(hào)
服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個(gè)FIN給客戶端
客戶端發(fā)回ACK報(bào)文確認(rèn)绅络,并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1
什么是HTTTS
HTTPS? 超文本傳輸安全協(xié)議,是以安全為目標(biāo)的HTTP通道月培,簡單講是HTTP的安全版;即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL?
加密過程是在傳輸層完成的(完成連接->驗(yàn)證證書->加密傳輸->斷開連接)
HTTPS連接過程簡述
客戶端向服務(wù)端發(fā)起 https 請(qǐng)求
服務(wù)器(需要申請(qǐng) ca 證書),返回證書(包含公鑰)給客戶端
客戶端使用根證書驗(yàn)證 服務(wù)器證書的有效性,進(jìn)行身份確認(rèn)
客戶端生成對(duì)稱密鑰,通過公鑰進(jìn)行加密,發(fā)送給服務(wù)器
服務(wù)器使用私鑰進(jìn)行 解密,獲取對(duì)稱密鑰
雙發(fā)使用對(duì)稱加密的數(shù)據(jù)進(jìn)行通信
什么是對(duì)稱加密
對(duì)稱加密是最快速恩急、最簡單的一種加密方式杉畜,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)
常見的有AES,DES,3DES等
DES算法是一種用56位密鑰來加密分組長度為64位數(shù)據(jù)的對(duì)稱密鑰算法(實(shí)際上函數(shù)要求一個(gè)64位的密鑰作為輸入,但是第8衷恭、16此叠、24、32随珠、40灭袁、48、56窗看、64 等8位是校驗(yàn)位茸歧, 使得每個(gè)密鑰都有奇數(shù)個(gè) 1,所以參與加密過程的只有56位)
AES算法显沈,基本變換字節(jié)代換软瞎、行位移逢唤、列混合和輪密鑰加
AES是一個(gè)迭代分組密碼,分組大小為128位,而密鑰長度為128位涤浇、192位或256位鳖藕,相應(yīng)的迭代輪數(shù)N,為10輪只锭、12輪著恩、14輪
非對(duì)稱加密
非對(duì)稱加密為數(shù)據(jù)的加密與解密提供了一個(gè)非常安全的方法,它使用了一對(duì)密鑰蜻展,公鑰(public key)和私鑰(private key);私鑰只能由一方安全保管喉誊,不能外泄,而公鑰則可以發(fā)給任何請(qǐng)求它的人;非對(duì)稱加密使用這對(duì)密鑰中的一個(gè)進(jìn)行加密铺呵,而解密則需要另一個(gè)密鑰;
常見的: RSA算法
http 與https區(qū)別
https協(xié)議需要到ca申請(qǐng)證書裹驰,一般免費(fèi)證書很少,需要交費(fèi)
http是超文本傳輸協(xié)議片挂,信息是明文傳輸幻林,https 則是具有安全性的ssl加密傳輸協(xié)議
http和https使用的是完全不同的連接方式,用的端口也不一樣音念,前者是80沪饺,后者是443
http的連接很簡單,是無狀態(tài)的闷愤;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸整葡、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全
說一下Session 和 Cookie 的概念
Session 是服務(wù)器用來認(rèn)證,追蹤用戶的數(shù)據(jù)結(jié)構(gòu),通過判斷客戶端傳來的信息確定用戶,確定用戶唯一標(biāo)志是客戶端傳來的 SessionId
Cookie 是客戶端用來保存用戶信息的機(jī)制, 初次會(huì)話時(shí), http 協(xié)議會(huì)在 Cookie 里記錄一個(gè)SessionID,之后每次會(huì)話時(shí)把 SessionID發(fā)給服務(wù)器
什么Socket
網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)鏈接的一端稱為一個(gè)socket;
socket本質(zhì)是編程接口(API)讥脐,對(duì)TCP/IP的封裝遭居,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車旬渠,提供了封裝或者顯示數(shù)據(jù)的具體形式俱萍;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力;
什么是DNS
域名系統(tǒng)(DomainNameSystem告丢,縮寫:DNS)是[互聯(lián)網(wǎng)]的一項(xiàng)服務(wù)枪蘑。它作為將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫,能夠使人更方便地訪問[互聯(lián)網(wǎng)]
DNS劫持問題
DNS劫持又稱(域名劫持), 是指在劫持的網(wǎng)絡(luò)范圍內(nèi)攔截域名解析的請(qǐng)求岖免,分析請(qǐng)求的域名岳颇,把審查范圍以外的請(qǐng)求放行,否則返回假的IP地址或者什么都不做使請(qǐng)求失去響應(yīng),其效果就是對(duì)特定的網(wǎng)絡(luò)不能訪問或訪問的是假網(wǎng)址
解決辦法: 使用HTTPDNS
項(xiàng)目中網(wǎng)絡(luò)層如何做安全處理
盡量使用https
不要傳輸明文密碼
Post并不比Get安全
不要使用301跳轉(zhuǎn)
http請(qǐng)求都帶上MAC
http請(qǐng)求使用臨時(shí)密鑰
斷點(diǎn)續(xù)傳如何實(shí)現(xiàn)
通過HTTP颅湘,可以非常方便的實(shí)現(xiàn)斷點(diǎn)續(xù)傳
斷點(diǎn)續(xù)傳主要依賴于HTTP頭部定義的Range话侧,應(yīng)用可以通過HTTP請(qǐng)求曾經(jīng)獲取失敗的資源的某一個(gè)返回或者部分來恢復(fù)下載該資源;當(dāng)然并不是所有風(fēng)服務(wù)器都支持Range,所以不支持Range的不在我們考慮之內(nèi),Range是以字節(jié)計(jì)算的闯参,請(qǐng)求的時(shí)候不比給我結(jié)尾字節(jié)數(shù)瞻鹏,因?yàn)檎?qǐng)求方并不一定知道資源的大小
通過這個(gè)關(guān)鍵字可以告訴服務(wù)器返回哪些數(shù)據(jù)給我
什么是WebSocket术羔,解決了什么問題
WebSocket是應(yīng)用層第七層上的一個(gè)應(yīng)用層協(xié)議,它必須依賴 HTTP 協(xié)議進(jìn)行一次握手 乙漓,握手成功后,數(shù)據(jù)就直接從 TCP 通道傳輸释移,與 HTTP 無關(guān)了
Websocket的數(shù)據(jù)傳輸是frame形式傳輸?shù)陌扰热鐣?huì)將一條消息分為幾個(gè)frame,按照先后順序傳輸出去
WebSocket 的實(shí)現(xiàn)分為握手玩讳,數(shù)據(jù)發(fā)送/讀取涩蜘,關(guān)閉連接
什么是心跳
心跳就是用來檢測(cè)TCP連接的雙方是否可用
客戶端發(fā)起心跳Ping(一般都是客戶端),假如設(shè)置在10秒后如果沒有收到回調(diào)熏纯,那么說明服務(wù)器或者客戶端某一方出現(xiàn)問題同诫,這時(shí)候我們需要主動(dòng)斷開連接
公鑰加密計(jì)算量太大,如何減少耗用的時(shí)間
解決方法:每一次對(duì)話(session)樟澜,客戶端和服務(wù)器端都生成一個(gè)"對(duì)話密鑰"(session key)误窖,用它來加密信息;由于"對(duì)話密鑰"是對(duì)稱加密,所以運(yùn)算速度非持确。快霹俺,而服務(wù)器公鑰(非對(duì)稱加密)只用于加密"對(duì)話密鑰"本身,這樣就減少了加密運(yùn)算的消耗時(shí)間
AF中常駐線程的實(shí)現(xiàn)
使用單例創(chuàng)建線程 添加到runloop中毒费,且加了一個(gè)NSMachPort(線程間的通信)丙唧,來防止這個(gè)新建的線程由于沒有活動(dòng)直接退出
AF3.x為什么不再需要常駐線程
NSURLConnection的一大痛點(diǎn)就是:發(fā)起請(qǐng)求后,這條線程并不能隨風(fēng)而去觅玻,而需要一直處于等待回調(diào)的狀態(tài)
NSURLSession發(fā)起的請(qǐng)求想际,不再需要在當(dāng)前線程進(jìn)行代理方法的回調(diào)!可以指定回調(diào)的delegateQueue溪厘,這樣我們就不用為了等待代理回調(diào)方法而苦苦焙荆活線程了
同時(shí)還要注意一下,指定的用于接收回調(diào)的Queue的maxConcurrentOperationCount設(shè)為了1桩匪,這里目的是想要讓并發(fā)的請(qǐng)求串行的進(jìn)行回調(diào)
為什么AF3.0中需要設(shè)置self.operationQueue.maxConcurrentOperationCount = 1而AF2.0卻不需要打瘪?
AF3.0的operationQueue是用來接收NSURLSessionDelegate回調(diào)的,鑒于一些多線程數(shù)據(jù)訪問的安全性考慮,設(shè)置了maxConcurrentOperationCount = 1來達(dá)到串行回調(diào)的效果
AF2.0的operationQueue是用來添加operation并進(jìn)行并發(fā)請(qǐng)求的傻昙,所以不要設(shè)置為1
XMPP是什么
XMPP 是一種基于XML的協(xié)議闺骚,XMPP是一個(gè)分散型通信網(wǎng)絡(luò)
XMPP是一種基于標(biāo)準(zhǔn)通用標(biāo)記語言的子集XML的協(xié)議,它繼承了在XML環(huán)境中靈活的發(fā)展性妆档,XMPP有超強(qiáng)的擴(kuò)展性;XMPP中定義了三個(gè)角色僻爽,客戶端,服務(wù)端贾惦,網(wǎng)關(guān)胸梆。通信能夠在這個(gè)三者的任意兩個(gè)之間雙向發(fā)生敦捧,而他們的傳輸是XML流;
MPP工作原理:所有從一個(gè)客戶端到另一個(gè)客戶端的消息和數(shù)據(jù)都要通過服務(wù)端
XMPP允許建立并行的TCP套接字鏈接對(duì)所有連接上的客戶端和服務(wù)器端。持久的套接字的連接使得XMPP能夠更有效的支持高級(jí)的具有存在能力的應(yīng)用在帶寬和處理資源的使用中
小結(jié)
而XMPP的核心部分就是一個(gè)在網(wǎng)絡(luò)上分片斷發(fā)送XML的流協(xié)議.這個(gè)流協(xié)議是XMPP的即時(shí)通訊指令的傳遞基礎(chǔ)碰镜,也是一個(gè)非常重要的可以被進(jìn)一步利用的網(wǎng)絡(luò)基礎(chǔ)協(xié)議兢卵。所以可以說,XMPP用TCP傳的是XML流
MAC地址和ip地址的區(qū)別
MAC地址就是在媒體接入層上使用的地址绪颖,也叫物理地址秽荤、硬件地址或鏈路地址,由網(wǎng)絡(luò)設(shè)備制造商生產(chǎn)時(shí)寫在硬件內(nèi)部? 前三個(gè)設(shè)備商編號(hào)? 后三位設(shè)備ID
IP即指使用TCP/IP協(xié)議指定給主機(jī)的32位地址 通過DHCP協(xié)議動(dòng)態(tài)獲取IP地址
IP地址相當(dāng)于你現(xiàn)在所處的地址柠横,會(huì)隨著你的移動(dòng)發(fā)生改變窃款,而mac地址相當(dāng)于你的身份證號(hào)這些個(gè)人信息,是獨(dú)一無二的牍氛,不會(huì)改變的
Ping是什么協(xié)議
ping也屬于一個(gè)通信協(xié)議晨继,是TCP/IP協(xié)議的一部分;利用“ping”命令可以檢查網(wǎng)絡(luò)是否連通;
PING (Packet Internet Groper),因特網(wǎng)包探索器搬俊,用于測(cè)試網(wǎng)絡(luò)連接量的程序
Ping發(fā)送一個(gè)ICMP(Internet Control Messages Protocol)即因特網(wǎng)信報(bào)控制協(xié)議
它所利用的原理是這樣的:利用網(wǎng)絡(luò)上機(jī)器IP地址的唯一性紊扬,給目標(biāo)IP地址發(fā)送一個(gè)數(shù)據(jù)包,再要求對(duì)方返回一個(gè)同樣大小的數(shù)據(jù)包來確定兩臺(tái)網(wǎng)絡(luò)機(jī)器是否連接相通悠抹,時(shí)延是多少