B/S網絡架構從前端到后端都得到了簡化,都基於統一的應用層協議HTTP來交互數據,HTTP協議采用無狀態的短鏈接的通信方式,通常情況下,一次請求就完成了一次數據交互,通常也對應一個業務邏輯,然后這次通信連接就斷開了。采用這種方式是為了能夠同時服務更多的用戶,因為當前互聯網應用每天都會處理上億的用戶請求,不可能每個用戶訪問一次后就一直保持住這個連接。
①輸入URL:www.google.com;
②DNS域名解析:域名與IP映射(發送到DNS(域名服務器)獲得域名對應的WEB服務器的IP地址);
③建立TCP連接: 客戶端瀏覽器與WEB服務器建立TCP(傳輸控制協議)連接,三次握手;
④發送Http Request:請求信息(客戶端瀏覽器向對應IP地址的WEB服務器發送相應的HTTP或HTTPS請求);
⑤WEB服務器:Nginx反向代理(客戶端本來可以直接通過HTTP協議訪問某網站應用服務器,網站管理員可以在中間加上一個Nginx,客戶端請求Nginx,Nginx請求應用服務器,然后將結果返回給客戶端,此時Nginx就是反向代理服務器);
⑥應用服務器:Server處理請求(數據庫等交互.....);
⑦用戶瀏覽器:渲染響應頁面(客戶端瀏覽器下載數據,解析HTML源文件,解析的過程中實現對頁面的排版,解析完成后,在瀏覽器中顯示基礎的頁面);
⑧關閉TCP連接:響應完成(非持久連接);
一句話概括:瀏覽器本身是一個客戶端,當你輸入URL的時候,首先瀏覽器會去請求DNS服務器,通過DNS獲取相應的域名對應的IP,然后通過IP地址找到IP對應的服務器后,要求建立TCP連接,等瀏覽器發送完HTTP Request(請求)包后,服務器接收到請求包之后才開始處理請求包,服務器調用自身服務,返回HTTP Response(響應)包;客戶端收到來自服務器的響應后開始渲染這個Response包里的主體(body),等收到全部的內容隨后斷開與該服務器之間的TCP連接;
一些具體詳細的補充:
瀏覽器是怎么查找域名對應的IP地址的?
1) 請求一旦發起,瀏覽器首先要做的事情就是解析這個域名,一般來說,瀏覽器會首先查看本地硬盤的 hosts 文件,看看其中有沒有和這個域名對應的規則,如果有的話就直接使用 hosts 文件里面的 ip 地址。
2) 如果在本地的 hosts 文件沒有能夠找到對應的 ip 地址,瀏覽器會發出一個 DNS請求到本地DNS服務器 。本地DNS服務器一般都是你的網絡接入服務器商提供,比如中國電信,中國移動。
3) 查詢你輸入的網址的DNS請求到達本地DNS服務器之后,本地DNS服務器會首先查詢它的緩存記錄,如果緩存中有此條記錄,就可以直接返回結果,此過程是遞歸的方式進行查詢。如果沒有,本地DNS服務器還要向DNS根服務器進行查詢。
4) 根DNS服務器沒有記錄具體的域名和IP地址的對應關系,而是告訴本地DNS服務器,你可以到域服務器上去繼續查詢,並給出域服務器的地址。
5) 本地DNS服務器繼續向域服務器發出請求,在這個例子中,請求的對象是.com域服務器。.com域服務器收到請求之后,也不會直接返回域名和IP地址的對應關系,而是告訴本地DNS服務器,你的域名的解析服務器的地址。
6) 最后,本地DNS服務器向域名的解析服務器發出請求,這時就能收到一個域名和IP地址對應關系,本地DNS服務器不僅要把IP地址返回給用戶電腦,還要把這個對應關系保存在緩存中,以備下次別的用戶查詢時,可以直接返回結果,加快網絡訪問。
瀏覽器向 web 服務器發送一個 HTTP 請求的過程大概是?
拿到域名對應的IP地址之后,瀏覽器會以一個隨機端口(1024<端口<65535)向服務器的WEB程序(常用的有httpd,nginx等)80端口發起TCP的連接請求。這個連接請求到達服務器端后(這中間通過各種路由設備,局域網內除外),進入到網卡,然后是進入到內核的TCP/IP協議棧(用於識別該連接請求,解封包,一層一層的剝開),還有可能要經過Netfilter防火牆(屬於內核的模塊)的過濾,最終到達WEB程序,最終建立了TCP/IP的連接。
建立了TCP連接之后,發起一個http請求。一個典型的 http request header 一般需要包括請求的方法,例如 GET 或者 POST 等,不常用的還有 PUT 和 DELETE 、HEAD、OPTION以及 TRACE 方法,一般的瀏覽器只能發起 GET 或者 POST 請求。
客戶端向服務器發起http請求的時候,會有一些請求信息,請求信息包含三個部分:
-------請求方法URI協議/版本
-------請求頭(Request Header)
-------請求正文:
GET/sample.php
HTTP/1.1 Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
注意:最后一個請求頭之后是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭。
服務器是如何處理請求的呢?
后端從在固定的端口接收到TCP報文開始,它會對TCP連接進行處理,對HTTP協議進行解析,並按照報文格式進一步封裝成HTTP Request對象,供上層使用。
一些大一點的網站會將你的請求到反向代理服務器中,因為當網站訪問量非常大,網站越來越慢,一台服務器已經不夠用了。於是將同一個應用部署在多台服務器上,將大量用戶的請求分配給多台機器處理。此時,客戶端不是直接通過HTTP協議訪問某網站應用服務器,而是先請求到Nginx,Nginx再請求應用服務器,然后將結果返回給客戶端,這里Nginx的作用是反向代理服務器。同時也帶來了一個好處,其中一台服務器萬一掛了,只要還有其他服務器正常運行,就不會影響用戶使用。
通過Nginx的反向代理,我們到達了web服務器,服務端腳本處理我們的請求,訪問我們的數據庫,獲取需要獲取的內容。
服務器返回一個 HTTP 響應大概包括哪些?
HTTP響應與HTTP請求相似,HTTP響應也由3個部分構成,分別是:
----- 狀態行
----- 響應頭(Response Header)
----- 響應正文
HTTP/1.1 200 OK Date: Sat, 31 Dec 2005 23:59:59 GMT Content-Type: text/html;charset=ISO-8859-1 Content-Length: 122 <html> <head> <title>http</title> </head> <body> <!-- body goes here --> </body> </html>