第一章 深入淺出Web請求過程(筆記)

2021-08-08 05:05:20 字數 4405 閱讀 2796

當使用者在瀏覽器裡輸入url後,首先會請求dns把這個網域名稱解析成對應ip位址,然後根據ip位址在網上找到對應伺服器,向這個伺服器發起乙個get請求,由這個伺服器決定返回預設的資料資源給訪問的使用者。

在伺服器端實際上還有很複雜的業務邏輯:伺服器可能有多台,到底只用哪台伺服器來處理請求,還需要乙個負載均衡裝置來平均分配所有使用者的請求;還有請求的資料是儲存在分布式快取裡還是乙個靜態檔案中,或是在資料庫裡;當資料返回瀏覽器時,瀏覽器解析資料發現還有一些靜態資源(css、js、image等)時又會發起另外的http請求,而這些請求很可能會在cdn(內容分發網路)上,那麼cdn伺服器又會出來這個請求,大體上乙個使用者請求會涉及到這麼多操作。每個細節都會影響請求最終是否成功。發起乙個http請求和建立乙個socket連線區別並不大,只不過outputstream.write寫的二進位制位元組資料要符合http。瀏覽器在建立socket連線之前,必須根據瀏覽器位址列裡輸入的url的網域名稱dns解析出ip位址,再根據ip位址和預設的埠號80與遠端伺服器建立socket連線,然後瀏覽器根據這個url組裝成乙個get型別的http請求頭,通過outputstream.write傳送到目標伺服器,伺服器等待inputstream.read返回資料,最後斷開這個連線。一句話,發起乙個http請求過程就是建立乙個socket通訊的過程。

基本httpclient的呼叫示例如下:

/**

* httpclient測試

*@param args

*/public

static

void

main(string args) catch (exception e) finally

}

b/s 網路架構核心是http,要理解http,最重要的就是要熟悉http中的 http header,http header控制著網際網路成千上萬的使用者資料的傳輸。最關鍵的是,它控制著使用者瀏覽器的渲染行為和伺服器的執行邏輯(畫重點)。例如,當伺服器沒有使用者請求的資料就會返回乙個404狀態碼,告訴瀏覽器沒有請求的資料,通常瀏覽器就會展示乙個非常不願意看到的該頁面不存在的錯誤資訊。

常見http請求頭:

請求頭說明

accpet-charset

用於指定客戶端接收的字符集

accpet-encoding

用於指定可接受的字元編碼,如accept-encoding:gzip.deflate

accpet-language

用於指定一種自然語言,如accpet-language:zh-cn

host

用於指定被請求資源的internet主機和埠號,如host:www.taobao.com

user-agent

客戶端將它的作業系統、瀏覽器和其他屬性告訴伺服器

connection

當前連線是否保持,如connection:keep-alive

常見http響應頭:

響應頭說明

accpet-charset

用於指定客戶端接收的字符集

server

使用的伺服器名稱,如server:apache/1.3.3(unix)

content-type

用來指明傳送給接收者的實體正文的**模型,如content-type:text/html; charset=gbk

content-encoding

與請求報頭accpet-encoding對應,告訴瀏覽器服務端採用的是什麼壓縮編碼

content-language

描述資源所用的自然語言,與accept-language對應

content-length

指明實體正文長度,用以位元組方式儲存的十進位制數字來表示

keep-alive

保持連線的時間,如keep-alive:timeout=5, max=120

狀態碼說明200

客戶端請求成功

302臨時跳轉,跳轉的位址通過location指定

400客戶端請求語法有錯誤,不能被伺服器識別

403伺服器收到請求,但是拒絕提服務

404請求資源不存在

500伺服器發生不可預知的錯誤

step1、 當使用者瀏覽器輸入網域名稱並按下回車後,瀏覽器會檢查快取中有沒有這個網域名稱對應的解析過的ip位址,如果快取有,這個解析過程就結束。

step2、 如果瀏覽器快取中沒有,瀏覽器會查詢作業系統快取是否有這個網域名稱對應的dns解析結果。

(step1、 step2都是在本機完成,以下步驟對應上圖)

step3、 如果本機未完成dns解析,在我們的網路配置中都會有「dns伺服器位址」這一項,作業系統會把這個網域名稱傳送給這裡的ldns,也就是本地區的網域名稱伺服器。這個dns通常都提供本地網際網路接入的乙個dns解析服務,例如在學校接入網際網路,那麼dns伺服器肯定在你的學校,如果是在小區接入網際網路,那這個dns就是提供你接入的網際網路應用提供商,即電信或者聯通,也就是通常所說spa,那麼這個dns通常就在所在城市的某個角落,一般不會很遠。(大約80%的解析到這裡就完成了,所以ldns主要承擔了網域名稱解析工作)

step4、如果ldns仍然沒有命中,就直接到根網域名稱伺服器root server網域名稱伺服器進行請求解析。

step5、根網域名稱伺服器root server返回給本地網域名稱伺服器乙個所查詢域的主網域名稱伺服器(gtld server)位址。gtld是國際頂級網域名稱伺服器,如.com、.cn、.org等,全球只有13臺左右。

step6、本地網域名稱伺服器(local dns server)再向上一步返回的gtld伺服器傳送請求。

step7、接受請求的gtld伺服器查詢並返回此網域名稱對應的name server網域名稱伺服器的位址,這個name server通常就是你註冊的網域名稱伺服器,例如在某個網域名稱伺服器提供商申請的網域名稱,那麼這個網域名稱解析任務就由這個網域名稱提供商的伺服器來完成。

step8、name server網域名稱伺服器會查詢儲存的網域名稱和ip的對映關係表,在正常情況下都根據網域名稱得到對應目標ip記錄,連同乙個ttl值返回給dns server網域名稱伺服器。

step9、返回該網域名稱伺服器對應的ip和ttl值,ldns server會快取這個網域名稱和ip的對應關係,快取時間有ttl值控制。

step10、把解析結果返回給使用者,使用者根據ttl值快取在本地系統中,網域名稱解析過程結束。

注:在實際dns解析過程中,可能還不止這10個步驟,如name server也可能有多級,或者有乙個gtm來負載均衡控制,這都會影響網域名稱解析過程。cdn也就是內容分布網路(content delivery network),它是構築在現有 internet 上的一種先進的流量分配網路。其目的是通過現有的 internet中增加一層新的網路架構,將**內容發布到最接近使用者的網路「邊緣」,是使用者可以就近取得所需要的內容,提高使用者訪問**的相應速度。cdn比映象更智慧型,可以做這樣乙個比喻:*** = 映象(mirror) + 快取(cache) + 整體負載均衡(gslb)。因而,cdn可以明顯提高 internet中資訊流動的效率。

通常來說,cdn要達到以下幾個目標:

可擴充套件(scalability)。效能可擴充套件性:應對新增的大量資料、使用者和事務的擴充套件能力。成本可擴充套件性:用低廉的運營成本提供動態的服務能力和高質量的內容分發。

安全性(security)。強調提供物理裝置、網路、軟體、資料和服務過程的安全性,(趨勢)減少因為ddos攻擊或者其他惡意行為造成商業**的業務中斷。

可靠性、相應和執行(reliability、responsiveness 和 performance)。服務可用性指能夠處理可能的故障和使用者體驗下降的問題,通過負載均衡及時提供網路的容錯機制。

cdn架構(畫重點)

如上圖,乙個使用者訪問某個靜態檔案(如 css檔案),這個靜態檔案的網域名稱假如是cdn.taobao.com,那麼首先向ldns伺服器發起請求,一版經過迭代解析後回到這個網域名稱的註冊伺服器去解析,一般每個公司都會有乙個dns解析伺服器。這時這個dns解析伺服器通常會把它重新cname解析到另外乙個網域名稱,而這個網域名稱最終會被指向cdn全域性中dns負載均衡伺服器,再由這個gtm(廣域網負載均衡)來最終分配是那個地方的訪問使用者,返回給離這個訪問使用者最近的cdn節點。

拿到dns解析結果,使用者直接去這個cdn節點訪問這個靜態檔案,如果這個節點所請求的檔案不存在,就會再回到源站去獲取這個檔案,然後返回給使用者。

cdn動態加速(了解)

cdn的動態加速技術也是當前比較流行的一種優化技術,其原理就是在cdn的dns解析中通過動態鏈路探測來尋找回最好的一條路徑,然後通過dns的排程將所有請求排程到選選定的這條路上回源,從而加速使用者訪問效率。

深入淺出DPDK 第一章

用軟體的方式在通用多核處理器上,演繹著資料報處理的新篇章 1 硬體加速器 2 網路處理器 3 多核處理器 dpdk主要是以ia intel architecture 多核處理器為目標平台 問題1 cpu核數增多,然後核心驅動的收發包處理和使用者態執行緒,依舊由作業系統排程執行,這個會造成什麼新的問題...

深入淺出MFC 第一章

當使用者按下系統選單中的close命令項,系統送出wm close。通常程式的視窗函式不攔截次訊息,於是defwindowproc函式處理它。defwindowproc收到wm close後,呼叫destorywindow把視窗清除。destroywindow本身又會送出wm destroy。程式對...

第一章 深入Web請求過程

1.3.2 瀏覽器快取機制 1.請求頭欄位 pragma no cache 和 cache control no cache 優先順序高 用於指定快取機制在整個請求 響應鏈中必須服從的指令 2.expires 日期時間 瀏覽器在請求之前檢查整個字段,如果時間過期,就重新傳送請求 3.last mod...