web服務器工作原理及http協議通信

一個 Web 服務器也被稱爲 HTTP 服務器,它通過 HTTP 協議與客戶端通信。這個客戶端通常指的是 Web 瀏覽器。

    Web服務器的工作原理簡單的可以歸納爲:客戶機連接服務器,客戶端向服務器發送請求,服務器向客戶機發送應答,客戶機與服務器斷開。一個簡單的事務處理事件就是這樣實現的,看起來不簡單,做起來其實也是挺簡單的,呵呵……需要注意的是客戶機與服務器直接的通信是非連接的,也就是當服務器發送了應答後就與客戶機斷開連接,等待下一次請求。

  HTTP 是一種讓 Web 服務器與瀏覽器(客戶端)通過 Internet 發送與接收數據的協議。它是一個請求、響應協議--客戶端發出一個請求,服務器響應這個請求。HTTP 運用可靠的 TCP 連接,通常用的 TCP 80 端口。

在 HTTP 中,客戶端總是通過建立一個連接與發送一個 HTTP 請求來發起一個事務。服務器不能主動去與客戶端聯繫,也不能給客戶端發出一個回叫連接。客戶端與服務器端都可以提前中斷一個連接。例如,當用一個瀏覽器下載一個文件時,你可以通過點擊“停止”鍵來中斷文件的下載,關閉與服務器的 HTTP 連接。
    http協議使Web服務器和瀏覽器可以通過Web交換數據。它是一種請求/響應協議,即服務器等待並響應客戶方請求。H T T P不維護與客戶方的連接,它使用可靠的T C P連接,通常採用TCP 80端口。客戶/服務器傳輸過程可分爲四個基一步驟:
 1) 瀏覽器與服務器建立連接;
 2) 瀏覽器向服務器請求文檔;
 3) 服務器響應瀏覽器請求;
 4) 斷開連接。
H T T P是一種無狀態協議,它不維護連接的狀態信息。
1. 客戶請求
客戶請求包含以下信息:
請求方法
請求頭
請求數據
(1)請求方法是用於特定U R L或We b頁面的程序HTTP請求方法:
方法       描述
GET     請求指定的文檔
HEAD    僅請求文檔頭
POST    請求服務器接收指定文檔作爲可執行的信息
PUT     用從客戶端傳送的數據取代指定文檔中的內容
DELETE  請求服務器刪除指定頁面
OPTIONS 允許客戶端查看服務器的性能
TRACE   用於測試—允許客戶端查看消息回收過程
(2)頭信息是可選項,它用於向服務器提供客戶端的其他信息
如果客戶採用某種方法獲取數據(如P O S T ),數據就放在頭( h e a d e r )之後;否則客戶機等待
從服務器傳來的響應。
2. 服務器響應
服務器響應包括以下關鍵部分:
狀態碼
響應頭
響應數據
HTTP定義了多組返回給瀏覽器的狀態碼。
響應頭向客戶方提供服務器和/或請求文檔的信息HTTP響應頭:
方法              描述
Server         Web服務器信息
Date           當前日期/時間
Last Modified  請求文檔最近修改時間
Expires        請求文檔過期時間
Content-length 數據長度(字節)
Content-type   數據M I M E類型
WWW-authenticate 用於通知客戶方需要的認證信息(如用戶名、口令等)
如果有客戶方請求的數據,數據放在響應頭之後,否則服務器斷開連接。
3.通信實例:
1. 請求
在本例中,瀏覽器請求文檔的U R L爲h ttp://www.hostname.com/index.html。所有的請求均以空行結束。
GET /index.html HTTP/1.1
Accept: text/plain
Accept: text/html
User-Agent: Mozilla/4.5(WinNT)
                   (blank line)
(DATA)

瀏覽器使用Get方法請求文檔/index.html。瀏覽器聲明它只能接收純文本和html數據,它使用Mozilla/4.5(Netscape)引擎。
2. 響應
服務響應包括狀態碼、一些頭信息(以空行結束)及請求數據,假設數據存在,則響應信息如下:
HTTP/1.1 200 OK
Date Sunday, 15-Jul-05 12:18:33 GMT
Server: Apache/1.3.6
MIME-version: 1.0
Content-type: test/html
Last-modified: Thursday,02-Jun-05 20:43:56 GMT
Content-length: 1432
        (blank line)
<HTML>              (此行開始爲數據部分,與前面頭部要空一行)
<HEAD>
<title>Example Server-Browser Communication</title>
</HEAD>
<BODY>
......
</BODY>
</HTML>

假設文檔未找到,響應信息如下
HTTP/1.1 404 NOT FOUND
Date Sunday, 15-Jul-05 12:19:33 GMT
Server: Apache/1.3.6

注意:每行換行時用:/r/n,頭部與數據段之間要多空已行,即用兩次/r/n

特別的,請求的一個網頁包含着圖片或視頻等內容時,服務器第一次先發送文本消息,斷開連接,客戶端再次發送請求,服務器再次發送圖片信息,有多少張圖片(即除文本標籤以爲的消息)服務器就要和客戶機斷開/連接多少次。下面是我用Java編寫的一個簡單的web服務器:

如果想要代碼的話,自己下載:

現在解釋一下運行的一些問題:

while (true) {

System.out.println("服務器在等待中……");

              // 讓服務器循環等待客戶機的連接,如果沒有whlie(true)語句,當客戶機與服務器

              // 斷開時,web服務器也退出了程序,無法使用

              Socket client = server.accept();

              // 處理客戶端

              processClient(client);

服務器在等待中……

(此處爲空行)

服務器在等待中……

2.jpg

服務器在等待中……

3.jpg

服務器在等待中……

1.gif

服務器在等待中……

sound.mp3

服務器在等待中……

其中的第一個“服務器在等待中……”是在服務器創建成功後輸出的,之後等待客戶機連接(即執行Socket client = server.accept();這句代碼時,程序處於阻塞狀態),當客戶機來連接時,輸出空行,也就是向請求主頁,當服務器向客戶機發送了文本時,斷開,服務器再次進入等待,此時輸出第二個“服務器在等待中……”,客戶機再次發送1.jpg圖片文件請求,依次類推,知道將客戶機請求的全部信息都發送完,這也是web服務器與瀏覽器(客戶機)之間通信的缺點之一,也就是http沒連接一次只能完成一次請求,如果html文件中有多張圖片,每傳送一個圖片,客戶機和服務器之間都要單獨建立一次連接。當然一個好的web服務器不僅僅是這麼簡單的,但是隻要我們掌握了他們通信的原理,寫出一個好的web服務器不是一件難事……

發佈了199 篇原創文章 · 獲贊 8 · 訪問量 88萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章