轉(zhuǎn)載:iOS網(wǎng)絡(luò)協(xié)議----HTTP/TCP/IP淺析
一题画、TCP/IP協(xié)議
話說兩臺(tái)電腦要通訊就必須遵守共同的規(guī)則钝尸,就好比兩個(gè)人要溝通就必須使用共同的語(yǔ)言一樣缔刹。一個(gè)只懂英語(yǔ)的人暇务,和一個(gè)只懂中文的人由于沒有共同的語(yǔ)言(規(guī)則)就沒辦法溝通。兩臺(tái)電腦之間進(jìn)行通訊所共同遵守的規(guī)則俗壹,就是網(wǎng)絡(luò)協(xié)議科汗。
那么誰(shuí)來制定這個(gè)網(wǎng)絡(luò)協(xié)議?
國(guó)際標(biāo)準(zhǔn)化組織(ISO)定義了網(wǎng)絡(luò)協(xié)議的基本框架绷雏,被稱為OSI模型头滔。要制定通訊規(guī)則,內(nèi)容會(huì)很多涎显,比如要考慮A電腦如何找到B電腦坤检,A電腦在發(fā)送信息 給B電腦時(shí)是否需要B電腦進(jìn)行反饋,A電腦傳送給B電腦的數(shù)據(jù)的格式又是怎樣的期吓??jī)?nèi)容太多太雜早歇,所以O(shè)SI模型將這些通訊標(biāo)準(zhǔn)進(jìn)行層次劃分,每一層次解決 一個(gè)類別的問題讨勤,這樣就使得標(biāo)準(zhǔn)的制定沒那么復(fù)雜箭跳。OSI模型制定的七層標(biāo)準(zhǔn)模型,分別是:應(yīng)用層潭千,表示層谱姓,會(huì)話層,傳輸層刨晴,網(wǎng)絡(luò)層屉来,數(shù)據(jù)鏈路層,物理層狈癞。
雖然國(guó)際標(biāo)準(zhǔn)化組織制定了這樣一個(gè)網(wǎng)絡(luò)協(xié)議的模型茄靠,但是實(shí)際上互聯(lián)網(wǎng)通訊使用的網(wǎng)絡(luò)協(xié)議是TCP/IP網(wǎng)絡(luò)協(xié)議。
TCP/IP 是一個(gè)協(xié)議族蝶桶,也是按照層次劃分慨绳。共四層:應(yīng)用層,傳輸層真竖,互連網(wǎng)絡(luò)層儡蔓,網(wǎng)絡(luò)接口層。 那么TCP/IP協(xié)議和OSI模型有什么區(qū)別呢疼邀?OSI網(wǎng)絡(luò)協(xié)議模型,是一個(gè)參考模型召锈,而TCP/IP協(xié)議是事實(shí)上的標(biāo)準(zhǔn)旁振。TCP/IP協(xié)議參考了OSI 模型,但是并沒有嚴(yán)格按照OSI規(guī)定的七層去劃分標(biāo)準(zhǔn),而只劃分了四層拐袜,個(gè)人覺得這樣會(huì)更簡(jiǎn)單點(diǎn)吉嚣,當(dāng)劃分太多層次時(shí),你很難區(qū)分某個(gè)協(xié)議是屬于哪個(gè)層次 的蹬铺。TCP/IP協(xié)議和OSI模型也并不沖突尝哆,TCP/IP協(xié)議中的應(yīng)用層協(xié)議,就對(duì)應(yīng)于OSI中的應(yīng)用層甜攀,表示層秋泄,會(huì)話層。就像以前有工業(yè)部和信息產(chǎn)業(yè) 部规阀,現(xiàn)在實(shí)行大部制后只有工業(yè)和信息化部一個(gè)部門恒序,但是這個(gè)部門還是要做以前兩個(gè)部門一樣多的事情,本質(zhì)上沒有多大的差別谁撼。TCP/IP中有兩個(gè)重要的協(xié) 議歧胁,傳輸層的TCP協(xié)議和互連網(wǎng)絡(luò)層的IP協(xié)議,因此就拿這兩個(gè)協(xié)議做代表厉碟,來命名整個(gè)協(xié)議族了喊巍,在說TCP/IP協(xié)議時(shí),是指整個(gè)協(xié)議族箍鼓。
TCP/IP協(xié)議分為四個(gè)層次崭参,但我們并不需要了解所有層次的協(xié)議,我覺得主要關(guān)注應(yīng)用層和傳輸層的協(xié)議就可以了袄秩。拿寄送郵件舉例阵翎, A寄郵件給B,A關(guān)心的是用什么格式寫什么內(nèi)容給B(應(yīng)用層內(nèi)容)之剧,是寄掛號(hào)信還是寄平信(傳輸層內(nèi)容)郭卫,但是A是不會(huì)去關(guān)注郵件傳送過程中采用了那條路 線,郵遞員是如何把信件遞送到B手里的(互連網(wǎng)絡(luò)層背稼,網(wǎng)絡(luò)接口層)贰军。
先說傳輸層,傳輸層有多個(gè)協(xié)議蟹肘,但最主要的是TCP和UDP協(xié)議词疼。兩則的區(qū)別在于TCP協(xié)議需要接收方反饋,UDP協(xié)議不需要接收方反饋帘腹。TCP就像掛號(hào) 信贰盗,A電腦發(fā)信息給B電腦后,需要得到B電腦的反饋阳欲,這樣A電腦就能知道B電腦是否已經(jīng)收到信息舵盈。UDP就像平信陋率,A電腦發(fā)信息給B電腦后,B電腦并不給 A電腦發(fā)聵秽晚,A電腦發(fā)送信息出去后并不知道B電腦是否已經(jīng)收到瓦糟。 因此,TCP傳輸比UDP傳送更可靠赴蝇,但是TCP傳輸?shù)男示筒蝗鏤DP了菩浙。至于,在傳送過程中具體選擇哪種傳送方式句伶,需要具體問題具體分析劲蜻。在不可靠的 網(wǎng)絡(luò)傳送過程中一般選擇TCP傳送方式。在講求效率熄阻,或者不在乎傳送失誤的情況下可以選擇UDP方式來提高傳輸速率斋竞。
應(yīng)用層的協(xié)議有很多,每一個(gè)協(xié)議代表一種類型的服務(wù)秃殉。HTTP協(xié)議坝初,萬(wàn)維網(wǎng)服務(wù)。FTP協(xié)議钾军,文件傳送服務(wù)鳄袍。POP3,郵件服務(wù)吏恭,SOAP協(xié)議webService服務(wù)拗小。
在理解TCP/IP協(xié)議的過程中,遇到了三個(gè)困惑樱哼。
1.什么是socket?
以前有聽說過socket編程這種說法哀九,也有的說套接字編程。我在搜索關(guān)于socket的資料時(shí)搅幅,發(fā)現(xiàn)有的說socket是指一個(gè)連接阅束,有的說 socket是一指一個(gè)端點(diǎn)。拿打電話做比喻茄唐,A電話機(jī)和B電話機(jī)正在通話息裸,那么socket是指的A和B之間的連接線呢,還是指電話機(jī)(端點(diǎn))沪编?
我現(xiàn)在的理解是呼盆,socket就是一個(gè)連接中的一個(gè)端點(diǎn),一次通訊(連接)a,b端都會(huì)有一個(gè)socket蚁廓。一個(gè)socket對(duì)應(yīng)一個(gè)連接访圃。
2.http協(xié)議屬于應(yīng)用層還是傳輸層?
http 超文本傳送協(xié)議相嵌,聽上去像是傳輸層的協(xié)議一樣挽荠。但事實(shí)上大家都知道http和ftp一樣都是屬于應(yīng)用層的協(xié)議克胳,我先前很納悶的是,既然是應(yīng)用層的協(xié)議圈匆,怎 么就取這樣一個(gè)誤導(dǎo)人的名稱啊。在對(duì)TCP/IP協(xié)議還不熟悉的時(shí)候捏雌,這很容易讓人誤解和納悶的跃赚。后來,我在wiki上發(fā)現(xiàn)這么一段話:
http中文譯名問題
HTTP 在中國(guó)大陸被翻譯為“超文本傳輸協(xié)議”性湿,因?yàn)椤皌ransfer”在中文里有“傳輸”的含意纬傲。但依據(jù) HTTP 定制者之一的 Roy Fielding博士的論文[1](6.5.3節(jié)),作者專門強(qiáng)調(diào)“transfer”表示的是“(表述狀態(tài)的)轉(zhuǎn)移” (Representational State Transfer)肤频,而不是“傳輸”(transport)叹括。故其中文譯名“超文本傳輸協(xié)議”恰恰引種反映了這種誤解。更符合原義的譯名應(yīng)該為“超文本轉(zhuǎn) 移協(xié)議”宵荒。
這段話解除了我的疑惑汁雷。那么http協(xié)議當(dāng)然是應(yīng)用層的協(xié)議。
3.SOAP可以使用HTTP協(xié)議進(jìn)行傳輸嗎报咳?
在了解SOAP協(xié)議的過程中侠讯,看到介紹說soap可以通過tcp,udp,http協(xié)議來傳送。這也是讓人困惑的描述暑刃。一看這句話厢漩,就會(huì)感覺http怎么 和tcp,udp協(xié)議并列了呢?難道http還是屬于傳輸層的協(xié)議岩臣?再加上http中文譯名的問題溜嗜,名字聽上去像傳輸層,初學(xué)者又要開始頭大了架谎。
事實(shí)上炸宵,http是應(yīng)用層的協(xié)議,這一點(diǎn)可以毫無(wú)懷疑狐树。那么現(xiàn)在新的問題來了焙压。soap和http都是應(yīng)用層協(xié)議,怎么說soap能用http協(xié)議來傳輸呢抑钟?應(yīng)用層的協(xié)議可以用應(yīng)用層的協(xié)議傳送嗎涯曲?
我查閱了資料,是這樣一回事情在塔,soap將信息進(jìn)行XML的序列化后幻件,再用http協(xié)議的方式再打包進(jìn)行傳送,傳送的方式還是tcp或者udp蛔溃。做個(gè)比喻 就好理解了绰沥。tcp 和 udp 都是公路篱蝇,暫且把tcp認(rèn)為是一般公路,udp高速公路徽曲,soap和http就都是汽車零截,那么soap和http都可以在tcp和udp上跑。說soap 可以通過http來傳送秃臣,實(shí)際就是說soap是小轎車涧衙,http是裝轎車的卡車,把soap的信息裝到http里面奥此,然后再運(yùn)輸弧哎,當(dāng)然走的道路還是tcp 或udp。
說soap可以通過http協(xié)議來傳輸稚虎,這句話不太準(zhǔn)確撤嫩,比較準(zhǔn)確第說法是:soap信息可以通過http協(xié)議包裝后通過tcp或udp傳輸。
二蠢终、HTTP協(xié)議
一序攘、URL
1.基本介紹
URL的全稱是Uniform Resource Locator
(統(tǒng)一資源定位符)
通過1個(gè)URL,能找到互聯(lián)網(wǎng)上唯一的1個(gè)資源
URL就是資源的地址蜕径、位置两踏,互聯(lián)網(wǎng)上的每個(gè)資源都有一個(gè)唯一的URL
2.URL中常見的協(xié)議
(1)HTTP
超文本傳輸協(xié)議,訪問的是遠(yuǎn)程的網(wǎng)絡(luò)資源兜喻,格式是http://
http協(xié)議是在網(wǎng)絡(luò)開發(fā)中最常用的協(xié)議
(2)file
訪問的是本地計(jì)算機(jī)上的資源梦染,格式是file://(不用加主機(jī)地址)
(3)mailto
訪問的是電子郵件地址,格式是mailto:
(4)FTP
訪問的是共享主機(jī)的文件資源朴皆,格式是ftp://
二帕识、HTTP協(xié)議
1.HTTP協(xié)議簡(jiǎn)介
不管是移動(dòng)客戶端還是PC端,訪問遠(yuǎn)程的網(wǎng)絡(luò)資源經(jīng)常使用HTTP協(xié)議
訪問百度主頁(yè):http://www.baidu.com
獲得新浪的微博數(shù)據(jù)
獲得大眾點(diǎn)評(píng)的團(tuán)購(gòu)數(shù)據(jù)
2.HTTP協(xié)議的作用
HTTP的全稱是Hypertext Transfer Protocol
遂铡,超文本傳輸協(xié)議
(1)規(guī)定客戶端和服務(wù)器之間的數(shù)據(jù)傳輸格式
(2)讓客戶端和服務(wù)器能有效地進(jìn)行數(shù)據(jù)溝通
3.為什么選擇使用HTTP肮疗?
(1)簡(jiǎn)單快速 因?yàn)镠TTP協(xié)議簡(jiǎn)單,所以HTTP服務(wù)器的程序規(guī)模小扒接,因而通信速度很快
(2)靈活 HTTP允許傳輸任意類型的數(shù)據(jù)
(3)HTTP 0.9和1.0使用非持續(xù)連接 限制每次連接只處理一個(gè)請(qǐng)求伪货,服務(wù)器對(duì)客戶端的請(qǐng)求做出響應(yīng)后,馬上斷開連接钾怔,這種方式可以節(jié)省傳輸時(shí)間
4.HTTP的通信過程
要想使用HTTP協(xié)議向服務(wù)器索取數(shù)據(jù)碱呼,得先了解HTTP通信的完整過程
完整的http通信可以分為2大步驟
(1)請(qǐng)求:客戶端向服務(wù)器索要數(shù)據(jù)
(2)響應(yīng):服務(wù)器返回客戶端相應(yīng)的數(shù)據(jù)
三、HTTP通信過程 - 請(qǐng)求和響應(yīng)
1.HTTP通信過程 - 請(qǐng)求
HTTP協(xié)議規(guī)定:1個(gè)完整的由客戶端發(fā)給服務(wù)器的HTTP請(qǐng)求中包含以下內(nèi)容
請(qǐng)求行:包含了請(qǐng)求方法宗侦、請(qǐng)求資源路徑愚臀、HTTP協(xié)議版本
GET /MJServer/resources/images/1.jpg HTTP/1.1
請(qǐng)求頭:包含了對(duì)客戶端的環(huán)境描述、客戶端請(qǐng)求的主機(jī)地址等信息
Host: 192.168.1.105:8080
// 客戶端想訪問的服務(wù)器主機(jī)地址
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0//
客戶端的類型矾利,客戶端的軟件環(huán)境
Accept: text/html
, /// 客戶端所能接收的數(shù)據(jù)類型
Accept-Language: zh-cn
// 客戶端的語(yǔ)言環(huán)境
Accept-Encoding: gzip
// 客戶端支持的數(shù)據(jù)壓縮格式
請(qǐng)求體:客戶端發(fā)給服務(wù)器的具體數(shù)據(jù)姑裂,比如文件數(shù)據(jù)
2.HTTP通信過程 - 響應(yīng)
客戶端向服務(wù)器發(fā)送請(qǐng)求馋袜,服務(wù)器應(yīng)當(dāng)做出響應(yīng),即返回?cái)?shù)據(jù)給客戶端
HTTP協(xié)議規(guī)定:1個(gè)完整的HTTP響應(yīng)中包含以下內(nèi)容:
狀態(tài)行:包含了HTTP協(xié)議版本舶斧、狀態(tài)碼欣鳖、狀態(tài)英文名稱
HTTP/1.1 200 OK
響應(yīng)頭:包含了對(duì)服務(wù)器的描述、對(duì)返回?cái)?shù)據(jù)的描述
Server: Apache-Coyote/1.1
// 服務(wù)器的類型
Content-Type: image/jpeg
// 返回?cái)?shù)據(jù)的類型
Content-Length: 56811
// 返回?cái)?shù)據(jù)的長(zhǎng)度
Date: Mon, 23 Jun 2014 12:54:52 GMT
// 響應(yīng)的時(shí)間
實(shí)體內(nèi)容:服務(wù)器返回給客戶端的具體數(shù)據(jù)茴厉,比如文件數(shù)據(jù)
3.補(bǔ)充:推薦工具firebug-1.12.5-fx.xpi
蟲子的作用:攔截所有的http請(qǐng)求观堂。
4.常見的響應(yīng)狀態(tài)碼
四、發(fā)送HTTP請(qǐng)求的方法
1.簡(jiǎn)單說明
在HTTP/1.1協(xié)議中呀忧,定義了8種發(fā)送http請(qǐng)求的方法
GET、POST溃睹、OPTIONS而账、HEAD、PUT因篇、DELETE泞辐、TRACE、CONNECT竞滓、PATCH
根據(jù)HTTP協(xié)議的設(shè)計(jì)初衷咐吼,不同的方法對(duì)資源有不同的操作方式
PUT :增
DELETE :刪
POST:改
GET:查
提示:最常用的是GET和POST(實(shí)際上GET和POST都能辦到增刪改查)
2.get和post請(qǐng)求
要想使用GET和POST請(qǐng)求跟服務(wù)器進(jìn)行交互,得先了解一個(gè)概念:參數(shù)就是傳遞給服務(wù)器的具體數(shù)據(jù)商佑,比如登錄時(shí)的帳號(hào)锯茄、密碼
GET和POST對(duì)比:GET和POST的主要區(qū)別表現(xiàn)在數(shù)據(jù)傳遞上
GET
在請(qǐng)求URL后面以?的形式跟上發(fā)給服務(wù)器的參數(shù),多個(gè)參數(shù)之間用&隔開茶没,比如http://ww.test.com/login?username=123&pwd=234&type=JSON
注意:由于瀏覽器和服務(wù)器對(duì)URL長(zhǎng)度有限制肌幽,因此在URL后面附帶的參數(shù)是有限制的,通常不能超過1KB
POST
發(fā)給服務(wù)器的參數(shù)全部放在請(qǐng)求體中
理論上抓半,POST傳遞的數(shù)據(jù)量沒有限制(具體還得看服務(wù)器的處理能力)
3.GET和POST的選擇
選擇GET和POST的建議
(1)如果要傳遞大量數(shù)據(jù)喂急,比如文件上傳,只能用POST請(qǐng)求
(2)GET的安全性比POST要差些笛求,如果包含機(jī)密\敏感信息廊移,建議用POST
(3)如果僅僅是索取數(shù)據(jù)(數(shù)據(jù)查詢),建議使用GET
(4)如果是增加探入、修改狡孔、刪除數(shù)據(jù),建議使用POST
4.iOS中發(fā)送HTTP請(qǐng)求的方案
在iOS中新症,常見的發(fā)送HTTP請(qǐng)求(GET和POST)的解決方案有
(1)蘋果原生(自帶)
NSURLConnection:用法簡(jiǎn)單步氏,最古老最經(jīng)典最直接的一種方案
NSURLSession:iOS 7新出的技術(shù),功能比NSURLConnection更加強(qiáng)大
CFNetwork:NSURL*的底層徒爹,純C語(yǔ)言
(2)第三方框架
ASIHttpRequest:外號(hào)“HTTP終結(jié)者”荚醒,功能極其強(qiáng)大芋类,可惜早已停止更新
AFNetworking:簡(jiǎn)單易用,提供了基本夠用的常用功能
建議:
為了提高開發(fā)效率界阁,企業(yè)開發(fā)用的基本是第三方框架
5.ASI和AFN架構(gòu)對(duì)比
說明:AFN基于NSURL侯繁,ASI基于CFHTTP,ASI的性能更好一些泡躯。
補(bǔ)充
協(xié)議:ftp://
(文件傳輸協(xié)議) ,http://
(超文本傳輸協(xié)議),https://
(安全超文本傳輸協(xié)議) ,file://
(本地文件協(xié)議)
iOS中常用的HTTP請(qǐng)求方案
蘋果原生的方案(偶爾使用)
NSURLConnection:使用簡(jiǎn)單贮竟,但是慢慢被遺棄
NSURLSession:功能比NSURLConnection強(qiáng)大
CFNetwork:純C語(yǔ)言框架,NSURL的底層
使用第三方框架(經(jīng)常使用)
ASIHttpRequest:非常強(qiáng)大较剃,早已停止更新咕别,多見于老項(xiàng)目中
AFNetworking:簡(jiǎn)單易用,維護(hù)者較多写穴,提供了最基本的功能