一艳悔、HTTP
HTTP簡介
①HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議急凰。
②HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)女仰。
③HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議猜年,由于其簡捷、快速的方式疾忍,適用于分布式超媒體信息系統(tǒng)乔外。它于1990年提出,經(jīng)過幾年的使用與發(fā)展一罩,得到不斷地完善和擴(kuò)展杨幼。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中聂渊,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出差购。
④HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請求汉嗽。Web服務(wù)器根據(jù)接收到的請求后欲逃,向客戶端發(fā)送響應(yīng)信息。
HTTP的主要特點(diǎn)
主要特點(diǎn)
1饼暑、簡單快速:客戶向服務(wù)器請求服務(wù)時(shí)稳析,只需傳送請求方法和路徑洗做。請求方法常用的有GET、HEAD彰居、POST诚纸。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單陈惰,使得HTTP服務(wù)器的程序規(guī)模小畦徘,因而通信速度很快。
2奴潘、靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象旧烧。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
3.無連接:無連接的含義是限制每次連接只處理一個(gè)請求画髓。服務(wù)器處理完客戶的請求掘剪,并收到客戶的應(yīng)答后,即斷開連接奈虾。采用這種方式可以節(jié)省傳輸時(shí)間夺谁。
4.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力肉微。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息匾鸥,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大碉纳。另一方面勿负,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
5劳曹、支持B/S及C/S模式奴愉。
HTTP的理解(此段摘抄于 Http協(xié)議與TCP協(xié)議簡單理解后續(xù))
一、
TCP協(xié)議對應(yīng)于傳輸層铁孵,而HTTP協(xié)議對應(yīng)于應(yīng)用層锭硼,從本質(zhì)上來說,二者沒有可比性蜕劝。Http協(xié)議是建立在TCP協(xié)議基礎(chǔ)之上的檀头,當(dāng)瀏覽器需要從服務(wù)器獲取網(wǎng)頁數(shù)據(jù)的時(shí)候,會發(fā)出一次Http請求岖沛。Http會通過TCP建立起一個(gè)到服務(wù)器的連接通道暑始,當(dāng)本次請求的數(shù)據(jù)完畢后,Http會立即將TCP連接斷開婴削,這個(gè)過程是很短的廊镜。所以Http連接是一種短連接,是一種無狀態(tài)的連接馆蠕。所謂的無狀態(tài)期升,是指瀏覽器每次向服務(wù)器發(fā)起請求的時(shí)候惊奇,不是通過一個(gè)連接,而是每次都建立一個(gè)新的連接播赁。如果是一個(gè)連接的話颂郎,服務(wù)器進(jìn)程中就能保持住這個(gè)連接并且在內(nèi)存中記住一些信息狀態(tài)。而每次請求結(jié)束后容为,連接就關(guān)閉乓序,相關(guān)的內(nèi)容就釋放了,所以記不住任何狀態(tài)坎背,成為無狀態(tài)連接替劈。
二、
隨著時(shí)間的推移得滤,html頁面變得復(fù)雜了陨献,里面可能嵌入了很多圖片,這時(shí)候每次訪問圖片都需要建立一次tcp連接就顯得低效了懂更。因此Keep-Alive被提出用來解決效率低的問題眨业。從HTTP/1.1起,默認(rèn)都開啟了Keep-Alive沮协,保持連接特性龄捡,簡單地說,當(dāng)一個(gè)網(wǎng)頁打開完成后慷暂,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉聘殖,如果客戶端再次訪問這個(gè)服務(wù)器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接Keep-Alive不會永久保持連接行瑞,它有一個(gè)保持時(shí)間奸腺,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間。雖然這里使用TCP連接保持了一段時(shí)間蘑辑,但是這個(gè)時(shí)間是有限范圍的洋机,到了時(shí)間點(diǎn)依然是會關(guān)閉的坠宴,所以我們還把其看做是每次連接完成后就會關(guān)閉洋魂。后來,通過Session, Cookie等相關(guān)技術(shù)喜鼓,也能保持一些用戶的狀態(tài)副砍。但是還是每次都使用一個(gè)連接,依然是無狀態(tài)連接
三庄岖、
為什么Http是無狀態(tài)的短連接呢豁翎?而TCP是有狀態(tài)的長連接?Http不是建立在TCP的基礎(chǔ)上嗎隅忿,為什么還能是短連接心剥?現(xiàn)在明白了邦尊,Http就是在每次請求完成后就把TCP連接關(guān)了,所以是短連接优烧。而我們直接通過Socket編程使用TCP協(xié)議的時(shí)候蝉揍,因?yàn)槲覀冏约嚎梢酝ㄟ^代碼區(qū)控制什么時(shí)候打開連接什么時(shí)候關(guān)閉連接,只要我們不通過代碼把連接關(guān)閉畦娄,這個(gè)連接就會在客戶端和服務(wù)端的進(jìn)程中一直存在又沾,相關(guān)狀態(tài)數(shù)據(jù)會一直保存著。
四熙卡、
比較形象的描述:HTTP是轎車杖刷,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動機(jī),提供了網(wǎng)絡(luò)通信的能力驳癌。對于從C#編程的角度來講滑燃,為了方便,你可以直接選擇已經(jīng)制造好的轎車Http來與服務(wù)器交互颓鲜。但是有時(shí)候往往因?yàn)榄h(huán)境因素或者其他的一些定制的請求不瓶,必須要使用TCP協(xié)議,這時(shí)就需要使用Socket編程灾杰,然后自己去處理獲取的數(shù)據(jù)蚊丐。就像是你用已有的發(fā)動機(jī),自己造了一輛卡車艳吠,去從服務(wù)器交互麦备。
HTTP都把TCP作為底層的傳輸協(xié)議。HTTP客戶首先發(fā)起建立與服務(wù)器TCP連接昭娩。一旦建立連接凛篙,瀏覽器進(jìn)程和服務(wù)器進(jìn)程就可以通過各自的套接字來訪問TCP。如前所述栏渺,客戶端套接字是客戶進(jìn)程和TCP連接之間的“門”呛梆,服務(wù)器端套接字是服務(wù)器進(jìn)程和同一TCP連接之間的“門”】恼铮客戶往自己的套接字發(fā)送HTTP請求消息填物,也從自己的套接字接收HTTP響應(yīng)消息。類似地霎终,服務(wù)器從自己的套接字接收HTTP請求消息滞磺,也往自己的套接字發(fā)送HTTP響應(yīng)消息±嘲客戶或服務(wù)器一旦把某個(gè)消息送入各自的套接字击困,這個(gè)消息就完全落入TCP的控制之中。TCP給HTTP提供一個(gè)可靠的數(shù)據(jù)傳輸服務(wù);這意味著由客戶發(fā)出的每個(gè)HTTP請求消息最終將無損地到達(dá)服務(wù)器广凸,由服務(wù)器發(fā)出的每個(gè)HTTP響應(yīng)消息最終也將無損地到達(dá)客戶阅茶。
HTTP的請求方法
根據(jù)HTTP標(biāo)準(zhǔn)蛛枚,HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法脸哀。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法坤候。
GET 請求指定的頁面信息,并返回實(shí)體主體企蹭。
HEAD 類似于get請求白筹,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)谅摄。數(shù)據(jù)被包含在請求體中徒河。POST請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容送漠。
DELETE 請求服務(wù)器刪除指定的頁面顽照。
CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS 允許客戶端查看服務(wù)器的性能闽寡。
TRACE 回顯服務(wù)器收到的請求代兵,主要用于測試或診斷。
HTTP的工作原理
HTTP協(xié)議定義Web客戶端如何從Web服務(wù)器請求Web頁面爷狈,以及服務(wù)器如何把Web頁面?zhèn)魉徒o客戶端植影。HTTP協(xié)議采用了請求/響應(yīng)模型∠延溃客戶端向服務(wù)器發(fā)送一個(gè)請求報(bào)文思币,請求報(bào)文包含請求的方法、URL羡微、協(xié)議版本谷饿、請求頭部和請求數(shù)據(jù)。服務(wù)器以一個(gè)狀態(tài)行作為響應(yīng)妈倔,響應(yīng)的內(nèi)容包括協(xié)議的版本博投、成功或者錯(cuò)誤代碼、服務(wù)器信息盯蝴、響應(yīng)頭部和響應(yīng)數(shù)據(jù)毅哗。
以下是 HTTP 請求/響應(yīng)的步驟:
1、客戶端連接到Web服務(wù)器
一個(gè)HTTP客戶端结洼,通常是瀏覽器黎做,與Web服務(wù)器的HTTP端口(默認(rèn)為80)建立一個(gè)TCP套接字連接叉跛。
2松忍、發(fā)送HTTP請求
通過TCP套接字,客戶端向Web服務(wù)器發(fā)送一個(gè)文本的請求報(bào)文筷厘,一個(gè)請求報(bào)文由請求行鸣峭、請求頭部宏所、空行和請求數(shù)據(jù)
四部分組成。
3摊溶、服務(wù)器接受請求并返回HTTP響應(yīng)
Web服務(wù)器解析請求爬骤,定位請求資源。服務(wù)器將資源復(fù)本寫到TCP套接字莫换,由客戶端讀取霞玄。一個(gè)響應(yīng)由狀態(tài)行、響應(yīng)頭部拉岁、
空行和響應(yīng)數(shù)據(jù)4部分組成坷剧。
4、釋放連接[TCP連接](http://www.reibang.com/p/ef892323e68f)
若connection 模式為close喊暖,則服務(wù)器主動關(guān)閉[TCP連接](http://www.reibang.com/p/ef892323e68f)惫企,
客戶端被動關(guān)閉連接,釋放[TCP連接](http://www.reibang.com/p/ef892323e68f);若connection 模式為
keepalive陵叽,則該連接會保持一段時(shí)間狞尔,在該時(shí)間內(nèi)可以繼續(xù)接收請求;
5、客戶端瀏覽器解析HTML內(nèi)容
客戶端瀏覽器首先解析狀態(tài)行巩掺,查看表明請求是否成功的狀態(tài)代碼偏序。然后解析每一個(gè)響應(yīng)頭,響應(yīng)頭告知以下為若干字節(jié)的
HTML文檔和文檔的字符集胖替∏莩担客戶端瀏覽器讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法對其進(jìn)行格式化刊殉,并在瀏覽器窗口中顯示殉摔。
例如:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車之后會經(jīng)歷以下流程:
1记焊、瀏覽器向 DNS 服務(wù)器請求解析該 URL 中的域名所對應(yīng)的 IP 地址;
2逸月、解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80遍膜,和服務(wù)器建立[TCP連接] (http://www.reibang.com/p/ef892323e68f);
3碗硬、瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應(yīng)的文件)的HTTP 請求,該請求報(bào)文作為 [TCP 三次握手](http://www.reibang.com/p/ef892323e68f)的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器;
4瓢颅、服務(wù)器對瀏覽器請求作出響應(yīng)恩尾,并把對應(yīng)的 html 文本發(fā)送給瀏覽器;
5、釋放 [TCP連接](http://www.reibang.com/p/ef892323e68f);
6挽懦、瀏覽器將該 html 文本并顯示內(nèi)容;
二翰意、TCP協(xié)議
TCP協(xié)議主要是在傳輸層,三次握手四次揮手
①三次握手
在TCP/IP協(xié)議中,TCP協(xié)議通過三次握手建立一個(gè)可靠的連接
第一次握手:客戶端嘗試連接服務(wù)器冀偶,向服務(wù)器發(fā)送syn包(同步序列編號Synchronize Sequence Numbers)醒第,
syn=j,客戶端進(jìn)入SYN_SEND狀態(tài)等待服務(wù)器確認(rèn)
第二次握手:服務(wù)器接收客戶端syn包并確認(rèn)(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)量瓜,完成三次握手
②四次揮手
由于TCP連接時(shí)全雙工的蝗岖,因此,每個(gè)方向都必須要單獨(dú)進(jìn)行關(guān)閉榔至,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后抵赢,發(fā)送一個(gè)FIN來終止這一方向的連接,收到一個(gè)FIN只是意味著這一方向上沒有數(shù)據(jù)流動了唧取,即不會再收到數(shù)據(jù)了铅鲤,但是在這個(gè)TCP連接上仍然能夠發(fā)送數(shù)據(jù),直到這一方向也發(fā)送了FIN枫弟。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動關(guān)閉邢享,而另一方則執(zhí)行被動關(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)序號為收到序號+1(與SYN相同群凶,一個(gè)FIN占用一個(gè)序號)插爹,
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)序號為收到序號+1够坐,
Server進(jìn)入CLOSED狀態(tài)寸宵,完成四次揮手崖面。
三、Scoket
1邓馒、socket概念
套接字(socket
)是通信的基石嘶朱,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元蛾坯。它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示光酣,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址脉课,本地進(jìn)程的協(xié)議端口救军,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口倘零。
一個(gè)Socket是一對IP地址和端口唱遭。
Socket可以看成在兩個(gè)程序進(jìn)行通訊連接中的一個(gè)端點(diǎn),一個(gè)程序?qū)⒁欢涡畔懭隨ocket中呈驶,該Socket將這段信息發(fā)送給另外一個(gè)Socket中拷泽,使這段信息能傳送到其他程序中。
2袖瞻、socket的作用
應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí)司致,TCP和UDP會遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接聋迎,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了稱為套接字(Socket)的接口脂矫,區(qū)分不同應(yīng)用程序進(jìn)程間的網(wǎng)絡(luò)通信和連接。
3霉晕、socket的原理
3.1 socket的實(shí)現(xiàn)方式
生成套接字庭再,主要有3個(gè)參數(shù):通信的目的IP地址、使用的傳輸層協(xié)議(TCP或UDP)和使用的端口號牺堰。Socket
原意是“插座”
拄轻。通過將這3個(gè)參數(shù)結(jié)合起來,與一個(gè)“插座”Socket綁定伟葫,應(yīng)用層就可以和傳輸層通過套接字接口哺眯,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)扒俯。
Host A
上的程序A將一段信息寫入Socket
中奶卓,Socket
的內(nèi)容被Host A
的網(wǎng)絡(luò)管理軟件訪問,并將這段信息通過Host A的網(wǎng)絡(luò)接口卡發(fā)送到Host B
撼玄,Host B
的網(wǎng)絡(luò)接口卡接收到這段信息后夺姑,傳送給Host B
的網(wǎng)絡(luò)管理軟件,網(wǎng)絡(luò)管理軟件將這段信息保存在Host B
的Socket
中掌猛,然后程序B才能在Socket中閱讀這段信息盏浙。
3.2 Socket連接的實(shí)現(xiàn)方式
要通過互聯(lián)網(wǎng)進(jìn)行通信眉睹,至少需要一對套接字,一個(gè)運(yùn)行于客戶機(jī)端废膘,稱之為ClientSocket
竹海,另一個(gè)運(yùn)行于服務(wù)器端,稱之為serverSocket
丐黄。
根據(jù)連接啟動的方式以及本地套接字要連接的目標(biāo)斋配,套接字之間的連接過程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽
,客戶端請求
灌闺,連接確認(rèn)
艰争。
服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài)桂对,實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)甩卓。
客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字蕉斜。為此逾柿,客戶端的套接字必須
首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號宅此,然后就向服務(wù)器端套接字提出連接請求机错。
連接確認(rèn) :是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求诽凌,
建立一個(gè)新的線程毡熏,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述侣诵,連接就建立好了痢法。
而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求杜顺。
3.3 Socket與TCP/IP的關(guān)系
創(chuàng)建Socket連接時(shí)财搁,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP)躬络,當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí)尖奔,該Socket連接就是一個(gè)TCP連接。
socket則是對TCP/IP協(xié)議的封裝和應(yīng)用(程序員層面上)穷当。也可以說提茁,TPC/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù) 如何在網(wǎng)絡(luò)中傳輸馁菜,而HTTP是應(yīng)用層協(xié)議茴扁,主要解決如何包裝數(shù)據(jù)。關(guān)于TCP/IP和HTTP協(xié)議的關(guān)系汪疮,網(wǎng)絡(luò)有一段比較容易理解的介紹:
“我們在傳輸數(shù)據(jù)時(shí)峭火,可以只使用(傳輸層)TCP/IP協(xié)議毁习,但是那樣的話,如 果沒有應(yīng)用層卖丸,便無法識別數(shù)據(jù)內(nèi)容纺且,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議稍浆,應(yīng)用層協(xié)議有很多载碌,比如HTTP、FTP粹湃、TELNET等恐仑,也 可以自己定義應(yīng)用層協(xié)議泉坐。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議为鳄,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上腕让」虑眨”
我們平時(shí)說的最多的socket是什么呢,實(shí)際上socket是對TCP/IP協(xié)議的封裝纯丸,Socket本身并不是協(xié)議偏形,而是一個(gè)調(diào)用接口(API),通過Socket觉鼻,我們才能使用TCP/IP協(xié)議俊扭。 實(shí)際上,Socket跟TCP/IP協(xié)議沒有必然的聯(lián)系坠陈。Socket編程接口在設(shè)計(jì)的時(shí)候萨惑,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議。所以說仇矾,Socket的出現(xiàn) 只是使得程序員更方便地使用TCP/IP協(xié)議棧而已庸蔼,是對TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口贮匕,比如create姐仅、 listen、connect刻盐、accept掏膏、send、read和write等等敦锌。網(wǎng)絡(luò)有一段關(guān)于socket和TCP/IP協(xié)議關(guān)系的說法比較容易理解:
“TCP/IP只是一個(gè)協(xié)議棧馒疹,就像操作系統(tǒng)的運(yùn)行機(jī)制一樣,必須要具體實(shí)現(xiàn)供屉,同時(shí)還要提供對外的操作接口行冰。這個(gè)就像操作系統(tǒng)會提供標(biāo)準(zhǔn)的編程接口溺蕉,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口悼做,這就是Socket編程接口疯特。”
實(shí)際上肛走,傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的漓雅,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的,而Socket本身不算是協(xié)議朽色,就像上面所說邻吞,它只是提供了一個(gè)針對TCP或者UDP編程的接口。socket是對端口通信開發(fā)的工具,它要更底層一些.
3.4 Socket與HTTP的關(guān)系
由于通常情況下Socket連接就是TCP連接葫男,因此Socket連接一旦建立抱冷,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開梢褐。但在實(shí)際網(wǎng)絡(luò)應(yīng)用中旺遮,客戶端到服務(wù)器之間的通信往往需要穿越多個(gè)中間節(jié)點(diǎn),例如路由器盈咳、網(wǎng)關(guān)耿眉、防火墻等,大部分防火墻默認(rèn)會關(guān)閉長時(shí)間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連鱼响,因此需要通過輪詢告訴網(wǎng)絡(luò)鸣剪,該連接處于活躍狀態(tài)。
而HTTP連接使用的是“請求—響應(yīng)”的方式丈积,不僅在請求時(shí)需要先建立連接筐骇,而且需要客戶端向服務(wù)器發(fā)出請求后,服務(wù)器端才能回復(fù)數(shù)據(jù)桶癣。
很多情況下拥褂,需要服務(wù)器端主動向客戶端推送數(shù)據(jù),保持客戶端與服務(wù)器數(shù)據(jù)的實(shí)時(shí)與同步牙寞。此時(shí)若雙方建立的是Socket連接饺鹃,服務(wù)器就可以直接將數(shù)據(jù)傳送給客戶端;若雙方建立的是HTTP連接间雀,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端悔详,因此,客戶端定時(shí)向服務(wù)器端發(fā)送連接請求惹挟,不僅可以保持在線茄螃,同時(shí)也是在“詢問”服務(wù)器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端连锯。
http協(xié)議是應(yīng)用層的協(xié)義
有個(gè)比較形象的描述:HTTP是轎車归苍,提供了封裝或者顯示數(shù)據(jù)的具體形式用狱;Socket是發(fā)動機(jī),提供了網(wǎng)絡(luò)通信的能力拼弃。