最開始我們需要明白一件事情,因為這是這篇文章的前提:
HTTP協議只是一個應用層協議,它底層是通過TCP進行傳輸數據的。因此,浏覽器訪問Web服務器的過程必須先有“連接建立”的發生。
而有人或許會問:眾所周知,HTTP協議有兩大特性,一個是“無連接”性,一個是“無狀態”性。這裡的“無連接”豈不是跟上面的說法有沖突?其實這裡並沒有矛盾,只是人們對“連接”這個詞的理解有差異。首先我們來看一下浏覽器向Web服務器發出Http請求以及Web服務器給浏覽器回復的過程:
1)浏覽器創建Socket,按給定IP(域名)和端口(默認為80)連接服務器。比如使用類似Socket.Connect()、Socket.BeginConnect()等方法;
2)連接成功後,浏覽器依據HTTP協議規范(關於協議,後面有講到),向Web服務器發送請求數據。比如“請求行”、“請求頭標”以及“請求數據”等,這裡可能使用類似Socket.Send()、Socket.BeginSend()等方法。【關於HTTP協議中的請求行、請求頭標等請參見http://www.cnblogs.com/riky/archive/2007/04/09/705848.html】
3)浏覽器等待服務器處理並返回數據;
4)Web服務器端使用Socket.Accept()、Socket.BeginAccept()等方法偵聽到浏覽器的連接後,便開始接收浏覽器發送的數據。接收到請求數據後,依據HTTP協議規范解析數據,然後處理,最終將處理結果(如html文檔)發回給浏覽器,這裡可能用到類似Socket.Send()、Socket.BeginSend()等方法;
5)Web服務器發送完處理結果後,關閉Socket;
6)浏覽器接收Web服務器發回的數據(如html),將其顯示在浏覽器UI界面。關閉socket;
7)一次“浏覽器到Web服務器”的http請求結束;
8)下一次浏覽器需要請求Web服務器,跳轉到第1)步循環開始。
用圖表示以上過程:
圖1