大話TCP/IP協議之HTTP網路協議(一)
Part1.最熟悉的陌生人
和TCP/UDP協議比起來,HTTP協議或許更為大家所熟知,因為大家處處都可以看到http://xxx.com的字樣。但是,真
正瞭解HTTP協議的同學,或許只是少數,還有很多人甚至不知道"404"的含義。而本文,正是讓大家來更深入的瞭解
下這位最熟悉的陌生人。
Part2.HTTP在江湖中的地位
眾所周知,Internet四層網路模型(也稱TCP/IP四層模型)包括資料鏈路層、網路層、傳輸層和應用層。網路層最著名的協議是IP協議,傳輸層最著名的協議是TCP協議和UDP協議,而應用層的協議眾多,諸如FTP協議、TELENT協議、TFTP協議、POP協議、SMTP協議、DNS協議、SNMP協議,當然還包括了本文的主角HTTP協議。如果說TCP/UDP/IP協議算作幕後的英雄,那麼毫不誇張的說,HTTP協議則是臺前最大腕的明星。
Part3.HTTP大概是怎樣工作的
HTTP,是符合Client/Sever模型的,總是Client來發起請求。整個過程,可以簡單分為四步:
(1)客戶端發起請求,與伺服器端完成"TCP三次握手";
(2)客戶端向伺服器端發出"HTTP請求報文";
(3)伺服器端在完成內部處理後,向客戶端發出"HTTP響應報文";
(4)客戶端與伺服器端完成"TCP四次分手"。
而HTTP協議本身是一種無狀態的協議,也就是說每一個HTTP報文不依賴於前面的報文狀態。
Part4.HTTP的URL如何表示
之所以要先講一下URL,是因為這個知識點在下文中會頻繁用到。
HTTP協議中的URL主要是用於定位伺服器端資源的位置。我們來看下它的語法定義:
http://http[:port][path]
其中:
http:// 表示我們使用的協議是HTTP協議;
host 表示一個可用的域名或IP地址;
port 為可選,表示要請求的埠號,預設情況下為80
path 為可選,表示要請求的資源所在的路徑(也叫URI),預設情況下為 /
Part5.HTTP請求長什麼樣兒
我們先來看一個典型的HTTP請求報文長什麼樣子:
(我們用/* */註釋嵌到請求裡,讓大家更好的理解每一行語句的含義)
/* 第一行叫做請求行(request),其它的各行都叫做頭部行(header) */
/* 請求行包括三個欄位:方法欄位、URI欄位、HTTP版本欄位 */
/* 這個例子的請求行,是要做這樣一件事:用HTTP協議1.1版本,使用GET方法,向伺服器端
申請/path/to/page.html資源 */
GET /path/to/page.html HTTP/1.1
/* 下面都屬於頭部行 */
/* Host用來指定要請求的伺服器端主機位roclinux.cn */
Host:roclinux.cn
/* Connection:close是要告訴伺服器端,我客戶端不想使用持久連線,請伺服器端在完成這次請求響應後關閉
此連線。雖然這個報文請求中使用了支援持久連線的HTTP1.1版本,但客戶端仍然不想使用持久連線 */
Connection:close
/* User-agent域則是用來指定當前這個請求報文是誰產生的,通常來說,一般這裡的設定的是使用者所使用的瀏覽器
型別。不要小看這個域,一些用心的站長,會通過這個域來識別客戶,並給不同的客戶展示資源的不同版本呢! */
User-agent:Mozilla/4.0
/* Accept-language域,則是客戶端再跟伺服器說"如果你哪裡有我申請的資源的中文版本,那就把中文版本給我;
如果沒有中文版本,那就把你的預設語言版本給我就好了。" */
Accept-language:zh-cn
/* 看這裡,看這裡!或許誰也沒有注意到這裡,這裡有一個空行,而且是必須有這個空行。這是HTTP協議的硬性
規定,不要忘記哦 */
下面,用我精心畫的一張圖,來說明下HTTP協議請求報文的格式:
從上面這個圖,應該可以很清晰的看出請求報文的具體格式了。
Part6.HTTP請求報文中有哪些方法
HTTP請求方法有很多,我們走馬觀花的看看:
GET方法:請求某資源
POST方法:請求某資源的同時附上一些資料
HEAD方法:請求某資源對應的響應報文頭
PUT方法:上傳一個資源
DELETE方法:刪除一個資源
TRACK方法:讓伺服器回送請求報文,用於除錯和排障
OPTIONS:請求伺服器效能資訊
CONNECT:預留給代理伺服器所用
Part7.怎麼響應HTTP的請求
在瞭解完請求報文的格式之後,你是不是想知道HTTP協議是如何響應請求報文的呢,我們來看一個典型的響應報文:
/* 一個響應報文,一般包括三部分,即狀態行、頭部行、附屬體 */
/* 第一行是狀態行,包括三個欄位:版本欄位、狀態碼欄位、原因短語欄位 */
/* 本例中,HTTP協議的響應報文想表達的意思是伺服器使用的是HTTP協議1.1版本,而且找到了客戶端所要
的資源,且會將響應報文發給客戶端,整個過程都很正常 */
HTTP/1.1 200 OK
/* 伺服器端不會保持住這個連線,而是在回覆完這個響應報文之後會斷開這個連線 */
Connection:close
/* 這裡記錄了這個響應報文被髮送出去的時間點 */
Date: Thu, 13 Oct 2005 03:17:33 GMT
/* Server域表明這個響應報文是由類Unix作業系統上的Apache伺服器發出的,且Apache的版本是2.0.54 */
Server:Apache/2.0.54(Unix)
/* 用於記錄本響應報文中所存的資料的最後修改時間 */
Last—Modified:Mon,22 Jun 1998 09;23;24 GMT
/* 指出資料部分的位元組數,即單位Byte */
Content-Length:6821
/* 指出所包含的資料是HTML文字內容 */
Content—Type:text/html
/* 看這裡,還得看這裡,和請求報文類似,這裡也有一個空行,不能省哦 */
/* 這裡是實際的響應資料 */
(data data data data ......)
下面,我們同樣來看看響應報文的協議格式:
Part8.說說HTTP的狀態碼
說到HTTP響應報文,就不得不提到HTTP狀態碼。相信大家看完這一小節後,就會很清楚404代表著什麼了。
狀態碼總共只有三位,第一位表示狀態類別,共分為五種,我們來依次看一下:
1xx:是進度通知類狀態,意思就是說“請求我已經收到了,或你的請求我正在處理”;
2xx:表示“你的請求我已經成功處理了”;
3xx:即重定向,也就是伺服器告訴客戶端“你要的資源搬家了,你到某某地方再去找他吧”;
4xx:客戶端發來的響應報文裡有些錯誤,比如語法錯誤或請求的資源不存在等;
5xx:伺服器端有些問題,已經無法處理完成你的請求了。
其實常用的狀態碼並不多,我們把常見的列舉在此:
200 OK:客戶端請求成功了,客戶端要的東西就在響應報文裡了;
301 Moved Permanently:客戶端啊,你要請求的資源已經永久的搬家了,我把他的新地址放到了Location頭部域中了;
302 Moved Temporarily:客戶端啊,你要請求的資源臨時有事去別的地方了,我把他的位置放到了Location頭部域中了,你可以先去那裡找他,不過他應該是會回到他自己的家的;
304 Not Modified:客戶端啊,你要請求的資源自從上次你請求之後,就再也沒有改動過,我想你是應該早就有這個資源了,所以在響應報文的資料部分我也沒有再放這個資源。
400 Bad Request:客戶端發來的請求報文裡有語法錯誤,伺服器端實在看不懂了;
401 Unauthorized:客戶端發來的請求不是合法來源的請求,也就是這個客戶端是沒有被授權的;
403 Forbidden:伺服器端順利收到了客戶端的請求,但是因為某些理由,伺服器端拒絕為他提供服務;
404 Not Found:客戶端要請求的資源不存在,八成是資源地址寫錯了;
500 Internal Server Error:很遺憾,伺服器不能給你提供服務了,伺服器內部出現了不可預知的問題了;
502 Bad Gateway:客戶端你好,我是請求報文的代理伺服器,持有資源的那個伺服器在給我傳送資源時出問題了;
503 Server Unavailable:伺服器現在可能是太忙了,暫時不能給你這個客戶端提供服務了,或許稍後會恢復。