1. 程式人生 > >經典問題之當用戶輸入一個URL會發生什麼?

經典問題之當用戶輸入一個URL會發生什麼?

輸入一個URL會發生什麼

1.DNS解析

使用者本地域名伺服器,你知道www.google.com是多少麼

本地域名伺服器說:等會兄弟,我去問問根域名伺服器COM頂級域名伺服器

根域名伺服器:兄弟我也不知道,但是你可以問COM頂級域名伺服器問問,他應該知道

COM頂級域名伺服器:兄弟我也不知道,但是你可以問google.com域名伺服器問問,他應該知道

google.com域名伺服器:兄弟我知道,他是64.233.189.104

也就是說他的解析順序是

. → .com. → google.com. → www.google.com.

2.DNS負載均衡

不知道大家有沒有思考過一個問題: DNS返回的IP地址是否每次都一樣?如果每次都一樣是否說明你請求的資源都位於同一臺機器上面,那麼這臺機器需要多高的效能和儲存才能滿足億萬請求呢?其實真實的網際網路世界背後存在成千上百臺伺服器,大型的網站甚至更多。但是在使用者的眼中,它需要的只是處理他的請求,哪臺機器處理請求並不重要。DNS可以返回一個合適的機器的IP給使用者,例如可以根據每臺機器的負載量,該機器離使用者地理位置的距離等等,這種過程就是DNS負載均衡,又叫做DNS重定向

。大家耳熟能詳的CDN(Content Delivery Network)就是利用DNS的重定向技術,DNS伺服器會返回一個跟使用者最接近的點的IP地址給使用者,CDN節點的伺服器負責響應使用者的請求,提供所需的內容。

3. TCP連線

HTTP的長連線和短連線本質上是TCP長連線和短連線。HTTP屬於應用層協議,在傳輸層使用TCP協議,在網路層使用IP協議。IP協議主要解決網路路由和定址問題,TCP協議主要解決如何在IP層之上可靠的傳遞資料包,使在網路上的另一端收到發端發出的所有包,並且順序與發出順序一致。TCP有可靠,面向連線的特點。

4.傳送HTTP請求

HTTPS協議

我不知道把HTTPS放在這個部分是否合適,但是放在這裡好像又說的過去。HTTP報文是包裹在TCP報文中傳送的,伺服器端收到TCP報文時會解包提取出HTTP報文。但是這個過程中存在一定的風險,HTTP報文是明文,如果中間被擷取的話會存在一些資訊洩露的風險。那麼在進入TCP報文之前對HTTP做一次加密就可以解決這個問題了。HTTPS協議的本質就是HTTP + SSL(or TLS)。在HTTP報文進入TCP報文之前,先使用SSL對HTTP報文進行加密。從網路的層級結構看它位於HTTP協議與TCP協議之間。

HTTP: HTTP→TCP→IP HTTPS: HTTP→SSL或TLS→TCP→IP

HTTP

其實這部分又可以稱為前端工程師眼中的HTTP,它主要發生在客戶端。傳送HTTP請求的過程就是構建HTTP請求報文並通過TCP協議中傳送到伺服器指定埠(HTTP協議80/8080, HTTPS協議443)。HTTP請求報文是由三部分組成也就是: 請求行, 請求報頭請求正文

5.伺服器處理請求並返回HTTP報文

HTTP請求報文是由三部分組成: 請求行, 請求報頭請求正文組成

請求行:

GET index.html HTTP/1.1

例如:GET, POST, PUT, DELETE, OPTIONS, HEAD。

請求報頭:

請求報頭允許客戶端向伺服器傳遞請求的附加資訊和客戶端自身的資訊。 PS: 客戶端不一定特指瀏覽器,有時候也可使用Linux下的CURL命令以及HTTP客戶端測試工具等。 常見的請求報頭有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。

請求正文:

當使用POST, PUT等方法時,通常需要客戶端向伺服器傳遞資料。這些資料就儲存在請求正文中。在請求包頭中有一些與請求正文相關的資訊,例如: 現在的Web應用通常採用Rest架構,請求的資料格式一般為json。這時就需要設定Content-Type: application/json。

伺服器處理請求並返回HTTP報文:

自然而然這部分對應的就是後端工程師眼中的HTTP。後端從在固定的埠接收到TCP報文開始,這一部分對應於程式語言中的socket。它會對TCP連線進行處理,對HTTP協議進行解析,並按照報文格式進一步封裝成HTTP Request物件,供上層使用。這一部分工作一般是由Web伺服器去進行,我使用過的Web伺服器有Tomcat, Jetty和Netty等等。

狀態碼

狀態碼是由3位陣列成,第一個數字定義了響應的類別,且有五種可能取值:

  • 1xx:指示資訊–表示請求已接收,繼續處理。
  • 2xx:成功–表示請求已被成功接收、理解、接受。
  • 3xx:重定向–要完成請求必須進行更進一步的操作。
  • 4xx:客戶端錯誤–請求有語法錯誤或請求無法實現。
  • 5xx:伺服器端錯誤–伺服器未能實現合法的請求。 平時遇到比較常見的狀態碼有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500(分別表示什麼請自行查詢)。
響應報頭

常見的響應報頭欄位有: Server, Connection…。

響應報文

伺服器返回給瀏覽器的文字資訊,通常HTML, CSS, JS, 圖片等檔案就放在這一部分。

6.瀏覽器解析渲染頁面

瀏覽器在收到HTML,CSS,JS檔案後,接下來可以參考我寫的那個部落格

相關推薦

經典問題輸入一個URL發生什麼?

輸入一個URL會發生什麼 1.DNS解析 使用者問本地域名伺服器,你知道www.google.com是多少麼 本地域名伺服器說:等會兄弟,我去問問根域名伺服器,COM頂級域名伺服器, 根域名伺服器:兄弟我也不知道,但是你可以問COM頂級域名伺服器問問

黑馬程式設計師C#程式設計基礎學習筆記:不斷要求使用者輸入一個數字,然後列印這個數字的二倍,輸入q的時候程式退出。

--------------------------------------------------- 2345王牌技術員聯盟、2345王牌技術員聯盟、期待與您交流!-----------------------------------------------------

.做一個登陸的介面,輸入正確的使用者名稱和密碼後,顯示登陸成功,並且顯示改使用者的詳細資訊。(sqldatasource)

<body style="height: 649px">     <form id="form1" runat="server">     <p>         <asp:SqlDataSource ID="SqlDataSource1" runat="server

【shell】Linux shell 判斷輸入的變量是否為數字

shell linux 腳本 編程 自動化運維 本文內容:判斷用戶輸入的參數是否為數字 在shell中如何進行計算? 方式一 [root@XiaoPeng scripts]# echo $((1+2)) 3 方式二 [root@XiaoPeng scripts]# expr

不定期更新的新問題(http協議你在瀏覽器裏輸入一個url發生了什麽?)

服務器 兩種 解釋 private 字段 互聯網 cookie值 求和 過期 HTTP協議: 超文本傳輸協議是互聯網上應用最為廣泛的一種網絡協議 https是以安全為目標的http通道,就是http的安全版。 為什麽會有這個協議呢? 為了建立客戶端與服務器

java入門練習題(三):讀入一組整數(不超過20個),輸入0時,表示輸入結束;然後程式將從這組整數中,把第二大的整數找出來,並把它打印出來。

 程式意義:讀入一組整數(不超過20個),當用戶輸入0時,表示輸入結束;然後程式將從這組整數中,把第二大的整數找出來,並把它打印出來。  說明:(1)0表示輸入結束,它本身並不計入這組整數中。            (2)在這組整數中,既有整數又有負數;          

猜數字大小遊戲,輸入一個數字,如果大了就顯示大了,如果小了就顯示小了, 如果對了就提示正確(補充難度,只有5次機會,限制數字的範圍在百位以內)

scan st2 imp 一次循環 提示 tip string 輸入一個數 ner 產生0-100之間的隨機數,包括0和100 double d = Math.random() * 100; int a = (int)Math.round(d); -------------

輸入一個URL之後發生了什麽?

建立連接 解析 報文 客戶 處理請求 關閉 log 輸入 客戶端 簡明扼要地說: DNS解析 TCP“三次握手”來建立連接 發送HTTP請求 服務器處理請求並返回HTTP報文 TCP“四次揮手”來關閉連接 客戶端拿到資源並解析渲染頁面 輸入一個UR

編寫一個Java應用程式,輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD,如1999年1月12日應輸入為19990112),程式將判斷兩個日期的先後順序,以及兩個日期之間的間隔天數(例

編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD, 如1999年1月12日應輸入為19990112), 程式將判斷兩個日期的先後順序, 以及兩個日期之間的間隔天數(例如1999年1月1日和1999年1月2日之間的間隔是1天。  

Pyhton編程(二)變量、輸入及條件語句

退出 import turn 進行 不能 exec 條件 求和 變量 一:變量   變量定義的規則   1)只能由數字、字母、下劃線組成(不能以數字開頭)   2)不能使用關鍵字作為變量名   [‘and‘, ‘as‘, ‘assert‘, ‘break‘, ‘class‘

python路:輸入(一)

老師 用法 inf 代碼 用戶輸入 display 用戶 -- class python之路:用戶輸入(一) 好了,現在我學了點博客的用法,現在不會像以前的那麽土了。好吧,不多說,我要講課了。 今天,我會用情景實例給大家說這個用戶輸入。 情景是:你是IT教育的python帶

我們在瀏覽器中輸入一個URL後,發生了什麼?

寫在開頭:這篇文章被我歸入部落格效能優化類別,是因為我認為如果我們要優化網站效能、提升使用者體驗,首要目標就是要知道使用者在本地請求並載入你的網頁的過程中,到底發生了什麼,在此基礎上我們才能更好的優化網頁。 圖源:知乎-張秋怡 瀏覽器解析並查詢快取 DNS查詢

在瀏覽器中輸入一個url後回車,後臺發生了什麼?

這個問題之前、最近、我想以後肯定還會被問到,或者問到這樣的題目,如果在百度框裡輸入查詢的字串開始,是怎麼返回你需要的東西呢。 那這什麼個過程呢(這個問題我在之後的部落格中在寫)? 網上各種的說法,不外乎這麼幾種 第一種簡單的說呢就是這樣的: 第一步:客戶機

你在瀏覽器位址列輸入一個URL後回車,將發生的事情?

                這道題目沒有所謂的完全的正確答案,這個題目可以讓你在任意的一個點深入下去, 只要你對這個點是熟悉的。以下是一個大概流程:瀏覽器向DNS伺服器查詢輸入URL對應的IP地址。DNS伺服器返回網站的IP地址。瀏覽器根據IP地址與目標web伺服器在80埠上建立TCP連線瀏覽器獲取請求頁

輸出一個空心的等腰三角形,高度由輸入

inpu for string out class put 一個 sys int 1 //解法一 2 public static void main(String[] args) { 3 Scanner input = new Scanner(Sys

在瀏覽器中輸入一個url後回車,後臺發生了什麼?比如輸入url後,你看到了百度的首頁,那麼這一切是如何發生的呢?

簡單來說有以下步驟:1、查詢域名對應的IP地址。這一步會依次查詢瀏覽器快取,系統快取,路由器快取,ISPDNS快取,根域名伺服器。2、向IP對應的伺服器傳送請求。3、伺服器響應請求,發回網頁內容。4、瀏覽器解析網頁內容。當然,由於網頁可能有重定向,或者嵌入了圖片,AJAX,

華萊士的 第一個python程序登錄)

用戶名 word true sha shang print 密碼 tin pri Name = "shangzb"password = 43while True:   _Name = input("Name:")   if _Name == Name:

你從瀏覽器地址輸入一個URL回車後發生了什麼

1.瀏覽器輸入url,按下回車鍵 2.瀏覽器根據域名查詢對應的IP地址 3.瀏覽器開啟TCP連線(預設埠是80),向該ip傳送一個http請求。如果瀏覽器儲存了該域名下的cookie,那麼cookie也會放在瀏覽器中 4.伺服器給瀏覽器進行一個306的永久重定向響應。