程序員面試之必考題(二):HTTP的基本原理

來自微信公眾號:開點(diǎn)工作室(ID:kaidiancs)

用戶訪問萬維網(wǎng)文檔崭闲,萬維網(wǎng)文檔之間的鏈接以及萬維網(wǎng)文檔中數(shù)據(jù)傳送到用戶計算機(jī)族购,這些功能的實現(xiàn)都是由超文本傳輸協(xié)議HTTP(HyperTextTransfer Protocol)負(fù)責(zé)完成的最住。HTTP是一個應(yīng)用層協(xié)議箫津,它使用TCP連接進(jìn)行可靠的傳送俭嘁,能夠在萬維網(wǎng)上進(jìn)行文本、聲音肴颊、圖像氓栈、視頻等各種信息的交換。

HTTP協(xié)議也是工作在客戶機(jī)/服務(wù)器模式下婿着,分為HTTP客戶端和HTTP服務(wù)器兩個部分授瘦,雙方每次進(jìn)行交互醋界,都是由客戶端發(fā)出的請求和服務(wù)器端發(fā)出的響應(yīng)構(gòu)成。HTTP協(xié)議規(guī)定的用戶使用瀏覽器訪問萬維網(wǎng)的過程可以總結(jié)為:

1.用戶在瀏覽器中鍵入需要訪問網(wǎng)頁的URL或者點(diǎn)擊某個網(wǎng)頁中鏈接提完;

2.瀏覽器根據(jù)URL中的域名形纺,通過DNS解析出目標(biāo)網(wǎng)頁的IP地址;

3.瀏覽器與網(wǎng)頁所在服務(wù)器建立TCP連接徒欣;

4.瀏覽器發(fā)送HTTP請求報文逐样,獲取目標(biāo)網(wǎng)頁的文件;

5.服務(wù)器發(fā)送HTTP響應(yīng)報文打肝,將目標(biāo)網(wǎng)頁文件發(fā)送給瀏覽器脂新;

6.釋放TCP連接;

7.瀏覽器將網(wǎng)頁的內(nèi)容包括文本粗梭、圖像争便、聲音等顯示呈現(xiàn)在用戶計算機(jī)屏幕。

HTTP協(xié)議是無連接的断医,它使用面向連接的TCP協(xié)議所提供的服務(wù)滞乙。同時,HTTP協(xié)議也是無狀態(tài)的鉴嗤,即服務(wù)器端不記錄客戶端訪問的時間和次數(shù)斩启。最初的HTTP協(xié)議版本是1.0版,使用非持續(xù)連接(nonpersistentconnection)躬窜。每傳輸一個對象都需要利用1個往返時間RTT建立TCP連接浇垦,用1個往返時間RTT申請并傳輸回對象,即平均用2個往返時間RTT獲取一個對象荣挨。目前使用比較廣泛的是HTTP協(xié)議的1.1版本(HTTP/1.1)男韧,其在默認(rèn)情況下使用持續(xù)連接(persistentconnection),即利用同一個TCP連接傳輸多個對象默垄。

HTTP報文是面向文本的此虑,報文中的每一個字段都是一些ASCII碼串,各個字段的長度是不確定的口锭。HTTP有兩類報文:請求報文和響應(yīng)報文朦前。請求報文是從客戶端向服務(wù)器發(fā)送的報文,響應(yīng)報文是從服務(wù)器到客戶端的報文鹃操。下面分別介紹請求報文和響應(yīng)報文的具體格式韭寸。

1.HTTP請求報文格式

HTTP請求報文的由請求行、請求頭部行荆隘、空行和請求數(shù)據(jù)四部分構(gòu)成恩伺,具體格式如下所示:

(請求行)方法名+空格+URL+空格+版本+回車換行(\r\n)

(請求頭部行1)關(guān)鍵字+“:”+空格+值+回車換行(\r\n)

……

(請求頭部行N)關(guān)鍵字+“:”+空格+值+回車換行(\r\n)

(空行)回車換行(\r\n)

(請求數(shù)據(jù))……

(1)請求行

請求行由請求方法字段、URL字段和HTTP協(xié)議版本字段3個字段組成椰拒,它們用空格分隔晶渠。最后由回車和換行表示請求行結(jié)束凰荚。例如:

GET?www.sdu.edu.cn? HTTP/1.1回車換行(\r\n)

其中“方法”字段表示該請求報文希望服務(wù)器做什么,請求報文的類型就是由所采用的方法決定的褒脯。HTTP請求報文的主要方法包括:GET便瑟、POST、HEAD番川、PUT到涂、DELETE、OPTIONS爽彤、TRACE养盗、CONNECT等。最常見的方法有GET和HEAD适篙。

GET是最常見的一種請求方式,當(dāng)客戶端要從服務(wù)器中讀取文檔時箫爷,當(dāng)點(diǎn)擊網(wǎng)頁上的鏈接或者通過在瀏覽器的地址欄輸入網(wǎng)址來瀏覽網(wǎng)頁嚷节,使用的都是GET方式。GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報文的數(shù)據(jù)部分虎锚,回送給客戶端硫痰。GET方式不適合傳送私密數(shù)據(jù)和大量數(shù)據(jù)。

HEAD的功能與GET相似窜护,只是服務(wù)器端接收到HEAD請求后只返回響應(yīng)頭效斑,而不會發(fā)送響應(yīng)內(nèi)容。當(dāng)我們只需要查看某個頁面的狀態(tài)的時候柱徙,使用HEAD是非常高效的缓屠,因為在傳輸?shù)倪^程中省去了頁面內(nèi)容。

(2)請求頭部行(header)

請求頭部行包括若干行护侮,每行由關(guān)鍵字及其值構(gòu)成的敌完,關(guān)鍵字和值用英文冒號“:”分隔,每一行都由回車換行表示結(jié)束羊初。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息滨溉,典型的請求頭部關(guān)鍵字有:

User-Agent:產(chǎn)生請求的瀏覽器類型。

Accept:客戶端可識別的內(nèi)容類型列表长赞。

Accept-Language:客戶端可識別的語言類型

晦攒。

Host:請求的主機(jī)名。

Connection:告知服務(wù)器發(fā)送完文檔后釋放連接還是保持連接得哆。

(3)空行

最后一個請求頭部之后是一個空行脯颜,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請求頭部了柳恐。

(4)請求數(shù)據(jù)

GET方法中沒有請求數(shù)據(jù)的內(nèi)容伐脖,POST方法使用請求數(shù)據(jù)热幔,用于客戶端向服務(wù)器端填寫表單等操作。

比如瀏覽器使用GET方法訪問山東大學(xué)主頁中的“學(xué)校簡介”文檔(URL為www.sdu.edu.cn/2010/xxjj.htm)讼庇,則其HTTP請求報文可以為:

GET /2010/xxjj.html HTTP/1.1 \r\n

Host: www.sdu.edu.cn\r\n

User-Agent:Mozilla/5.0

Accept-Language:cn */*\r\n

2.響應(yīng)報文格式

HTTP響應(yīng)也由四個部分組成绎巨,分別是:狀態(tài)行、消息頭部蠕啄、空行和響應(yīng)正文场勤。其具體格式如下:

(狀態(tài)行)版本+空格+狀態(tài)碼+空格+短語+回車換行

(消息頭部1)關(guān)鍵字+“:”+空格+值+回車換行

……

(消息頭部N)關(guān)鍵字+“:”+空格+值+回車換行

(空行)回車換行(\r\n)

(響應(yīng)正文)……

在響應(yīng)報文的狀態(tài)行中,版本字的表示服務(wù)器HTTP協(xié)議的版本歼跟,狀態(tài)碼字的表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼和媳;短語字段表示狀態(tài)代碼的文本描述。狀態(tài)碼由三位十進(jìn)制數(shù)字組成哈街,第一個數(shù)字定義了響應(yīng)的類別留瞳,有五種可能取值(1-5),每種狀態(tài)碼的含義如下:

1xx:指示信息骚秦。表示請求已接收她倘,繼續(xù)處理。

2xx:成功作箍。表示請求已被成功接收硬梁、理解、接受胞得。

3xx:重定向荧止。要完成請求必須進(jìn)行更進(jìn)一步的操作。

4xx:客戶端錯誤阶剑。請求有語法錯誤或請求無法實現(xiàn)跃巡。

5xx:服務(wù)器端錯誤。服務(wù)器未能實現(xiàn)合法的請求个扰。

常見狀態(tài)碼及狀態(tài)描述的說明如下:

200 OK:客戶端請求成功瓷炮。

400 Bad Request:客戶端請求有語法錯誤,不能被服務(wù)器所理解递宅。

401 Unauthorized:請求未經(jīng)授權(quán)娘香。

403 Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)办龄。

404 Not Found:請求資源不存在烘绽,比如輸入了錯誤的URL。

500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯誤俐填。

503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請求安接,一段時間后可能恢復(fù)正常。

消息頭部與請求頭部的格式相似英融,也是包含若干行盏檐,每行由關(guān)鍵字及其值構(gòu)成歇式,常用的關(guān)鍵字包括:

Date:表示返回消息的時間。

Content-Type:表示返回消息的內(nèi)容類型胡野。

Content-Length:返回內(nèi)容的長度(字節(jié)數(shù))材失。

Server:使用的服務(wù)器軟件及其版本號。

同樣硫豆,最后一個消息頭部之后是一個空行龙巨,發(fā)送回車符和換行符,通知客戶端以下不再有消息頭部了熊响。

響應(yīng)正文部分是服務(wù)器端根據(jù)客戶端的請求發(fā)回的具體文檔內(nèi)容旨别,以HTML語言表示。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汗茄,一起剝皮案震驚了整個濱河市秸弛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剔难,老刑警劉巖胆屿,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偶宫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)环鲤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門纯趋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冷离,你說我怎么就攤上這事吵冒。” “怎么了西剥?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵痹栖,是天一觀的道長。 經(jīng)常有香客問我瞭空,道長揪阿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任咆畏,我火速辦了婚禮南捂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旧找。我一直安慰自己溺健,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布钮蛛。 她就那樣靜靜地躺著鞭缭,像睡著了一般剖膳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岭辣,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天吱晒,我揣著相機(jī)與錄音,去河邊找鬼易结。 笑死枕荞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搞动。 我是一名探鬼主播躏精,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹦肿!你這毒婦竟也來了矗烛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤箩溃,失蹤者是張志新(化名)和其女友劉穎瞭吃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涣旨,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歪架,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霹陡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片和蚪。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烹棉,靈堂內(nèi)的尸體忽然破棺而出攒霹,到底是詐尸還是另有隱情,我是刑警寧澤浆洗,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布催束,位于F島的核電站,受9級特大地震影響伏社,放射性物質(zhì)發(fā)生泄漏抠刺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一洛口、第九天 我趴在偏房一處隱蔽的房頂上張望矫付。 院中可真熱鬧,春花似錦第焰、人聲如沸买优。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杀赢。三九已至烘跺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脂崔,已是汗流浹背滤淳。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砌左,地道東北人脖咐。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像汇歹,于是被迫代替她去往敵國和親屁擅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容