一、連接至Web服務器 一個客戶端應用(如Web瀏覽器)打開到Web服務器的HTTP端口的一個套接字(缺省為80)。 例如:http://www.:8080/index.html 在Java中,這將等同于代碼: Soceet socket=new Socket("www.",8080); InputStream in=socket.getInputStream(); OutputStream out=socket.getOutputStream(); 二、發(fā)送HTTP請求 通過連接,客戶端寫一個ASCII文本請求行,后跟0或多個HTTP頭標,一個空行和實現(xiàn)請求的任意數(shù)據(jù)。 一個請求由四個部分組成:請求行、請求頭標、空行和請求數(shù)據(jù) 1.請求行:請求行由三個標記組成:請求方法、請求URI和HTTP版本,它們用空格分隔。 例如:GET /index.html HTTP/1.1 HTTP規(guī)范定義了8種可能的請求方法: GET 檢索URI中標識資源的一個簡單請求 HEAD 與GET方法相同,服務器只返回狀態(tài)行和頭標,并不返回請求文檔 POST 服務器接受被寫入客戶端輸出流中的數(shù)據(jù)的請求 PUT 服務器保存請求數(shù)據(jù)作為指定URI新內(nèi)容的請求 DELETE 服務器刪除URI中命名的資源的請求 OPTIONS 關于服務器支持的請求方法信息的請求 TRACE Web服務器反饋Http請求和其頭標的請求 CONNECT 已文檔化但當前未實現(xiàn)的一個方法,預留做隧道處理 2.請求頭標:由關鍵字/值對組成,每行一對,關鍵字和值用冒號(:)分隔。 請求頭標通知服務器有關于客戶端的功能和標識,典型的請求頭標有: User-Agent 客戶端廠家和版本 Accept 客戶端可識別的內(nèi)容類型列表 Content-Length 附加到請求的數(shù)據(jù)字節(jié)數(shù) 3.空行:最后一個請求頭標之后是一個空行,發(fā)送回車符和退行,通知服務器以下不再有頭標。 4.請求數(shù)據(jù):使用POST傳送數(shù)據(jù),最常使用的是Content-Type和Content-Length頭標。 三、服務端接受請求并返回HTTP響應 Web服務器解析請求,定位指定資源。服務器將資源副本寫至套接字,在此處由客戶端讀取。 一個響應由四個部分組成;狀態(tài)行、響應頭標、空行、響應數(shù)據(jù) 1.狀態(tài)行:狀態(tài)行由三個標記組成:HTTP版本、響應代碼和響應描述。 HTTP版本:向客戶端指明其可理解的最高版本。 響應代碼:3位的數(shù)字代碼,指出請求的成功或失敗,如果失敗則指出原因。 響應描述:為響應代碼的可讀性解釋。 例如:HTTP/1.1 200 OK HTTP響應碼: 1xx:信息,請求收到,繼續(xù)處理 2xx:成功,行為被成功地接受、理解和采納 3xx:重定向,為了完成請求,必須進一步執(zhí)行的動作 4xx:客戶端錯誤: 2.響應頭標:像請求頭標一樣,它們指出服務器的功能,標識出響應數(shù)據(jù)的細節(jié)。 3.空行:最后一個響應頭標之后是一個空行,發(fā)送回車符和退行,表明服務器以下不再有頭標。 4.響應數(shù)據(jù):HTML文檔和圖像等,也就是HTML本身。 四、服務器關閉連接,瀏覽器解析響應 1.瀏覽器首先解析狀態(tài)行,查看表明請求是否成功的狀態(tài)代碼。 2.然后解析每一個響應頭標,頭標告知以下為若干字節(jié)的HTML。 3.讀取響應數(shù)據(jù)HTML,根據(jù)HTML的語法和語義對其進行格式化,并在瀏覽器窗口中顯示它。 4.一個HTML文檔可能包含其它需要被載入的資源引用,瀏覽器識別這些引用,對其它的資源再進行額外的請求,此過程循環(huán)多次。 五、無狀態(tài)連接 HTTP模型是無狀態(tài)的,表明在處理一個請求時,Web服務器并不記住來自同一客戶端的請求。 六、實例 1.瀏覽器發(fā)出請求 GET /index.html HTTP/1.1 服務器返回響應 HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Content-Length: 119 Content-Type: text/html <HTML> <HEAD> <LINK REL="stylesheet" HREF="index.css"> </HEAD> <BODY> <IMG SRC="image/logo.png"> </BODY> </HTML> 2.瀏覽器發(fā)出請求 GET /index.css HTTP/1.1 服務器返回響應 HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 70 Content-Type: text/plane h3{ font-size:20px; font-weight:bold; color:#005A9C; } 3.瀏覽器發(fā)出請求 GET image/logo.png HTTP/1.1 服務器返回響應 HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 1280 Content-Type: text/plane {Binary image data follows} (附錄) 1.HTTP規(guī)范:Internet工程制定組織(IETF)發(fā)布的RFC指定Internet標準,這些RFC被Internet研究發(fā)展機構廣泛接受。因為它們是標準文檔,故一般用正規(guī)語言編寫,如立法文標一樣。 2.RFC:RFC一旦被提出,就被編號且不會再改變,當一個標準被修改時,則給出一個新的RFC。作為標準,RFC在Internet上被廣泛采用。 3.HTTP的幾個重要RFC: RFC1945 HTTP 1.0 描述 RFC2068 HTTP 1.1 初步描述 RFC2616 HTTP 1.1 標準 4.資源標識符URI(Uniform Resource Identifter,URI) |
|