前期用node.js簡單搭建了Web服務器,包含簡單的注冊登入功能。但對於其內部邏輯仍舊一知半解,今天把這個過程好好理一理。
客戶端抓包說明: 客戶端IP:192.168.1.7,內網服務器IP:172.16.28.89。
首先在本地運行服務器端程序,用到了express框架。
然后在谷歌瀏覽器端輸入URL(Uniform Resource Locator,統一資源定位符)地址,敲下回車鍵。URL(如http://172.16.28.89:3000/signin)包括協議(http)、網絡地址(172.16.28.89:3000)、資源路徑(/singin)三個部分。瀏覽器中輸入URL默認缺省http。
其交互過程如下:
一、查找到URL所在的服務器地址。
1、如果URL的地址是一個域名,不是IP地址,則通過DNS(Domain Name System,域名系統)將域名解析成IP地址。步驟如下:
1)瀏覽器緩存。如果存在,則解析過程結束;
2)系統緩存。如果瀏覽器未緩存,瀏覽器會檢查操作系統緩存中是否有這個這個域名對應的ip地址。windows系統中緩存路徑及文件部分內容如下:
3)路由器緩存。若本機中沒有解析到,則將請求發送給路由器。wireshark抓包截圖如下:
4)DNS提供商緩存。若仍未解析到,則檢查TCP/IP中設置的DNS服務器,將URL發送給DNS服務器,最終返回域名的Ip地址。windows下DNS服務器設置界面如下:
我是直接輸入的服務器ip地址(172.16.28.89:3000),故不需DNS解析。
2、如果URL中不包括端口號,則使用協議的默認端口號。如http協議的默認端口號為80。我在服務器端設置的監聽端口為3000,故瀏覽器訪問時輸入對應端口。
二、TCP三次握手,建立連接。
http應用層協議是建立在TCP傳輸層協議之上的。在瀏覽器發送http請求之前,會先通過三次握手建立TCP連接,提供可靠傳輸。
三、瀏覽器根據http規范,產生請求數據包。wireshark抓包如下:
http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。
其中最重要的兩種方法:GET是向服務器發索取數據的一種請求,而POST是向服務器提交數據的一種請求。
抓包顯示,第一次訪問服務器為GET請求,本地並未保存任何cookies信息,故http請求頭部中並未包含任何cookie信息。
關於http協議的具體細節后續再深入研究。
四、服務器與客戶端交互
1、服務器端響應: app.get('/'function (req, res) {}, 檢查請求消息中是否含有cookies信息,沒有則讓用戶重定向到/signin;
2、客戶端再次通過URL(http://172.16.28.89:3000/signin)像服務器發送GET請求;
3、服務器端響應:app.get('/signin', function (req, res) {},向客戶端發送signin.html文檔;
4、文檔中包含CSS式樣、圖片資源,故客戶端再次像服務器發起請求;
5、服務器返回請求的資源;
6、客戶端顯示注冊登入頁面,輸入用戶名后點擊登入。通過POST方法像服務器提交數據請求;
7、服務器端響應:app.post('/signin', function (req, res) {},檢查POST請求中的用戶名,若已經存在即該用戶名已注冊,則讓用戶重定向到/signin,再次輸入用戶名注冊登入;若用戶名不存在,則服務器通過Set-Cookie將用戶名存入Cookies並發送給瀏覽器,同時重定向到172.16.28.89:3000。
8、客戶端收到消息后,將Cookie存入本地,此后客戶端通過URL(http://172.16.28.89:3000)向服務器發送請求時,請求中都會自動包含這個Cookie。
9、重復第一步,服務器判斷請求消息中是否包含Cookies信息,有則返回index.html文檔。至此結束。
如有問題,歡迎交流指正。