1. 程式人生 > >大話TCP/IP協議之HTTP網路協議(一)

大話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:伺服器現在可能是太忙了,暫時不能給你這個客戶端提供服務了,或許稍後會恢復。