1. 程式人生 > >Java web程式設計之基礎理論詳解(計算機網路基礎,HTTP請求的完成過程)

Java web程式設計之基礎理論詳解(計算機網路基礎,HTTP請求的完成過程)

1.計算機網路基礎知識

首先我們需明確通訊系統互聯參考模型:

OSI/RM模型與TCP/IP模型:

                

OSI/RM模型是一種事實上被TCP/IP模型淘汰的模型,在當今世界上沒有大規模使用。當發生HTTP請求時,傳送方傳送的資料是由最頂層向下層進行封包,接收方是由最下層向最頂層進行拆包。

下面說明一下各個層級的作用:

 物理層:主要定義物理裝置標準,如網線的介面型別、光纖的介面型別、各種傳輸介質的傳輸速率等。它的主要作用是傳輸位元流(就是將1、0轉化為強弱電流來進行輸出,到達目的後在轉化為1、0,也就是數字訊號與模擬訊號的轉換)。這一層的資料叫做位元(bit)。

資料鏈路層:主要將從物理層接收到的資料進行MAC地址的封裝與解封裝。常把這一層的資料叫做幀。在這一層工作的裝置是交換機,資料通過交換機來傳輸。資料鏈路層在不可靠的物理介質上提供可靠的傳輸。該層的作用包括:實體地址定址、資料的封裝成幀、流量控制、資料的檢錯、重發等。

網路層:主要是將從資料鏈路層接收到的資料進行IP地址的封裝與解封裝。在這一層工作的裝置是路由器,常把這一層的資料叫做資料包。網路層還可以實現擁塞控制、網際互連等功能。

傳輸層:定義傳輸資料的協議和埠號,如TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,資料量大的資料),UDP(使用者資料報協議,與TCP恰好相反,用於傳輸可靠性不高,資料量小的資料)。主要是將從網路層接收到資料進行分段和傳輸,到達目的地址後再進行重組。常常把這一層資料叫做段。傳輸層

是第一個端到端,即主機到主機的層次。傳輸層還要處理端到端的差錯控制和流量控制問題。

會話層:通過傳輸層建立資料傳輸的通路。主要在系統之間發起會話或者接受會話請求。

表示層:主要是對接收的資料進行解釋、加密或解密、壓縮與解壓縮等,也就是把計算機識別的東西轉換成人能夠識別的東西。

應用層:作業系統或網路應用程式提供訪問網路服務的介面,直接向用戶提供介面。

2.HTTP請求過程

1)解析URL

  在http請求過程中,首先進行url的解析,其中,http代表傳輸協議,www代表的是全球資訊網伺服器,baidi.com代表的是域名,80代表的是埠號(80埠預設不顯示,瀏覽器預設http請求埠為80),select/index.html便是訪問資源的邏輯路徑,最後則是引數。

   下面對http和https進行說明:http協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此,http協議不適合一些敏感資訊的傳輸。為了解決http協議的這一缺陷,需要使用另一種協議:安全套接字層超文字傳輸協議https。為了資料傳輸的安全,https在http的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。

      https的請求過程為:

  1. 客戶端的瀏覽器向伺服器傳送客戶端SSL 協議的版本號,加密演算法的種類,產生的隨機數,以及其他伺服器和客戶端之間通訊所需要的各種資訊。
  2. 伺服器向客戶端傳送SSL協議的版本號,加密演算法的種類,隨機數以及其他相關資訊,同時伺服器還將向客戶端傳送自己的證書。
  3. 客戶端利用伺服器傳過來的資訊驗證伺服器的合法性,伺服器的合法性包括:證書是否過期,發行此證書的CA機構是否可靠,發行者證書的公鑰能否正確解開伺服器證書的“發行者的數字簽名”,伺服器證書上的域名是否和伺服器的實際域名相匹配。如果合法性驗證沒有通過,通訊將斷開。
  4. 使用者端隨機產生一個用於後面通訊的“對稱密碼”,然後用伺服器的公鑰(伺服器的公鑰從伺服器傳來的證書中獲得)對其加密,然後將加密後的“預主密碼”傳給伺服器。
  5. 如果伺服器要求客戶的身份認證(在握手過程中為可選),使用者可以建立一個隨機數然後對其進行資料簽名,將這個含有簽名的隨機數和客戶自己的證書以及加密過的“預主密碼”一起傳給伺服器。
  6. 如果伺服器要求客戶的身份認證,伺服器必須檢驗客戶證書和簽名隨機數的合法性。
  7. 伺服器和客戶端用相同的主密碼即“通話密碼”,一個對稱金鑰用於SSL 協議的安全資料通訊的加解密通訊。
  8. 客戶端向伺服器端發出資訊,指明後面的資料通訊將使用的步驟7中的主密碼為對稱金鑰,同時通知伺服器客戶端的握手過程結束。
  9. 伺服器向客戶端發出資訊,指明後面的資料通訊將使用的步驟⑦中的主密碼為對稱金鑰,同時通知客戶端伺服器端的握手過程結束。
  10. SSL 的握手部分結束,SSL 安全通道的資料通訊開始,客戶和伺服器開始使用相同的對稱金鑰進行資料通訊,同時進行通訊完整性的檢驗。

2)DNS解析

   域名方便記憶,但機器間互相只認IP地址,域名與IP地址之間是多對一的關係,一個ip地址不一定只對應一個域名,且一個域名只可以對應一個ip地址,它們之間的轉換工作稱為域名解析,域名解析需要由專門的域名解析伺服器來完成,整個過程是自動進行的。

     dns域名解析的大致過程如下:

  1. 瀏覽器會檢查快取中有沒有這個域名對應的解析過的IP地址,如果快取中有,這個解析過程就結束。
  2. 如果使用者瀏覽器快取中沒有資料,瀏覽器會查詢作業系統快取中是否有這個域名對應的DNS解析結果。
  3. 如果作業系統快取中沒有這個快取,則進行路由快取查詢:在路由器中查詢域名快取。
  4. 如果路由快取沒有這個快取,則在ISP的DNS伺服器進行查詢:ISP是網際網路服務提供商(Internet Service Provider,如移動、聯通機房)的簡稱,ISP有專門的DNS伺服器應對DNS查詢請求。 
  5. 如果ISP的DNS伺服器還找不到的話,它就會向根伺服器發出請求,進行遞迴查詢。

    下面說明一下域名的遞迴解析:

    

   假設我們需要查詢app.baidu.com的ip地址,遞迴查詢的流程為:首先在根域名伺服器中查詢,如果查詢得到,則返回;如果查詢不到,則到com頂級域名伺服器查詢,如果com頂及域名伺服器查詢得到,則返回;如果com頂級域名伺服器查詢不到,則到baidu.com二級域名伺服器查詢,如果查詢到,則返回;如果baidu.com二級域名伺服器查詢不到,則到app.baidu.com權威域名伺服器查詢。通俗的講,域名的遞迴解析為先父再子進行查詢。

3)瀏覽器與伺服器建立TCP連線

   瀏覽器通過DNS解析得到的IP地址與伺服器建立TCP連線,這裡說明一下三次握手:

                                                 

  1. 第一次握手:客戶端向伺服器端傳送請求(SYN=k) 等待伺服器確認;
  2. 第二次握手:伺服器收到請求並確認,回覆一個指令(SYN=j,ACK=k+1);
  3. 第三次握手:客戶端收到伺服器的回覆指令並返回確認(ACK=j+1)。

4)請求和傳輸資料

  tcp連線完成後,http請求開始,請求有多種方式,常見的有get,post等。http請求包含請求頭和請求體兩部分,請求頭中包含我們希望對請求檔案的操作的資訊,請求體中包含傳遞給後臺的引數。伺服器收到http請求後,便開始進行處理(涉及問題如跨域:跨協議、跨埠、跨域名中的一個)。伺服器處理完畢後,生成響應資料包,響應也包含兩部分,響應頭和響應體,響應體就是我們所請求的檔案。經過網路傳輸,檔案被下載到本地瀏覽器,瀏覽器開始載入。

     這裡列舉一下http的相應程式碼(部分常用):

200(成功)伺服器已成功處理了請求。通常,這表示伺服器提供了正確的響應。

     301(請求重定向)請求的地址已永久定向到新地址。

     400(請求錯誤)伺服器不理解請求的語法,通常是引數錯誤造成的。

     403(禁止)伺服器拒絕請求。

     404(未找到)伺服器找不到請求的地址。

     408(請求超時)伺服器等候請求時發生超時。

     500(伺服器內部錯誤)伺服器遇到錯誤,無法完成請求,一般是程式碼有bug。

5)html頁面渲染

 瀏覽器渲染html程式碼,如果遇到類似於<link>或<script>等資源標籤,會再次進行http請求。注意:由於http1.1協議增加了Connection: keep-alive宣告,故tcp連線不會關閉,可以複用。

6)釋放連線

  資料完成傳輸後,通訊的雙方可以釋放。下面說明一下四次握手:

                                   

  1. TCP客戶端傳送一個FIN,用來關閉客戶到伺服器的資料傳輸。
  2. 伺服器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。
  3. 伺服器關閉客戶端的連線,傳送一個FIN給客戶端。
  4. 客戶端發回ACK確認,並將確認序號設定為收到序號加1。

 為什麼建立連線需要三次握手而關閉連線需要四次握手呢?

 因為關閉連線的時候,伺服器可能還在傳送資料。關閉連線的時候,伺服器需要做好關閉連線的準備(例如資料中斷傳輸與儲存),這些準備完畢後,通知客戶端關閉連線,因此需要四次握手。