1. 程式人生 > >瀏覽器一個HTTP請求的過程

瀏覽器一個HTTP請求的過程

瀏覽器一個請求的過程

當我們在瀏覽器位址列輸入 www.xx.com ,然後回車, 這個請求背後經歷了什麼?以下是個人理解,如有偏差,請糾正!

首先重新溫習下網路模型:
  • 七層結構(至頂向下):應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層

這裡寫圖片描述

client(瀏覽器) 與Server 通過HTTP協議通訊,HTTP協議屬於”應用層協議”;HTTP基於TCP協議,TCP通過Socket進行通訊,TCP 被稱為“傳輸層協議”。而HTTPS 還需要走會話層SSL\TLS等協議;傳輸層之下是網路層,這裡主要是路由協議OSPF等進行路由選擇,轉發;再向下資料鏈路層主要是ARP、RARP協議完成IP和MAC地址互相解析,再向下是物理層主要是基於IEEE802.X等協議進行資料位元流轉成高低電平的定義;

當瀏覽器發出請求時候,首先通過應用層DNS協議得到對應IP地址,在這經歷全球路由大接力;而傳輸層TCP協議採用“三次握手”協議建立連線和“四次握手”協議斷開連線,然後資料鏈路層解析IP與MAC地址的對映;資料經過層層資料封包、解包過程,如下:
這裡寫圖片描述

這裡特別強調下三次握手建立連線,放圖作為參考:
這裡寫圖片描述

Wireshark中抓包圖,如下:
這裡寫圖片描述

四次握手斷開連線:
這裡寫圖片描述

客戶端發起 FIN ACK, 服務端應答 ACK, 待服務端資料傳送完成後,傳送FIN ACK, 客戶端應答 ACK, 連線斷開。
這裡寫圖片描述

注: WireShark中“四次握手“的資料並不一定會在一起。

從應用服務角度分析

資料交換主要通過HTTP 協議, HTTP協議是無狀態協議。多數通過GET、POST方法,GET與POST區別:
GET:請求獲取指定的資源,不改變伺服器狀態,GET方法是冪等的,GET方法的報文主體沒有任何語義。
POST: 根據請求報文主體對指定的資源做出處理,改變伺服器狀態,POST方法不冪等。

http方法不僅只有GET、POST, http1.1中含有如下方法:
這裡寫圖片描述

RESTful API 就是利用這組方法來統一表述資源的狀態轉化。

同時,由於http無狀態協議的特點,服務端需要記錄使用者時,就需要用某種機制來識具體的使用者, 通常採用cookies、session。

session 本意是會話,是一個抽象概念。將 clinet 和 server 之間一對一的互動,抽象為“會話”,開發者為了實現一對一的“隔離”,中斷和繼續等操作,進而衍生出“會話狀態”,也就是 session 的概念。

如何維護這個session概念,很自然的想到在http請求報文中加入登入標識就可以了,這個登入標識就是cookie。而 cookie 是一個實際存在的東西,http 協議中定義在 header 中的欄位。這種技術的實現就是利用了cookie技術。 cookie是儲存key-value對的一個檔案,務必記住,它是由伺服器將cookie新增到response裡一併返回給客戶端,然後客戶端會自動把response裡的cookie接收下來,並且儲存到本地,下次發出請求的時候,就會把cookie附加在request裡,伺服器在根據request裡的cookie遍歷搜尋是否有與之符合的資訊。

cookie 雖然很方便,但是使用 cookie 有兩個的弊端:

  1. cookie 中的所有資料在客戶端就可以被修改。這就意味著資料非常容易被偽造,一些重要的資料就不能存放在 cookie 中;
  2. 如果 cookie 中資料欄位太多會影響傳輸效率;

為了解決這些問題,就產生了 session,
session是一種伺服器機制,使用Hash散列表結構來儲存資訊。
1. 每個 session 都對應一個 session_id,通過 session_id 可以查詢到對應的 session;
2. session_id 通常是存放在客戶端的 cookie 中,服務端存好 session 之後將對應的 session_id 設定在 cookie 中傳送給客戶端;
3. 當請求到來時,服務端檢查 cookie 中儲存的 session_id 並通過這個 session_id 與伺服器端的 session 關聯起來,進行資料的儲存和修改;

這就是大多數人通常所說的session, 這裡其實是指的 session實現。

server 端通常採用Nginx、Apache;

這裡以PHP為例:
Nginx接收到請求,進行一些驗證,如黑白名單攔截等, 是否有限流限制,是否有負載均衡設定;
如果請求的是靜態內容,Nginx會將結果直接返回給使用者。
如果請求的是動態內容,Nginx會將請求交給fastcgi客戶端, 通過fastcgi_pass將這個請求傳送給程序php-fpm。Nginx 不支援對外部動態程式的直接呼叫或者解析 ,所有的外部程式必須通過FastCGI介面來呼叫。

相關推薦

瀏覽器一個HTTP請求過程

瀏覽器一個請求的過程 當我們在瀏覽器位址列輸入 www.xx.com ,然後回車, 這個請求背後經歷了什麼?以下是個人理解,如有偏差,請糾正! 首先重新溫習下網路模型: 七層結構(至頂向下):應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物

http請求過程(訪問一個頁面,發生了怎樣的網路請求?)

域名解析->域名 ->快取->根域dns->頂級域dns->本域dns->伺服器IP 1.搜尋瀏覽器自身DNS快取,如果不存在或者過期(>60s)放棄 2.搜尋作業系統自身的dns快取 3.讀取本地的HOST檔案 4.瀏覽器發起一個DNS的

如何判斷一個HTTP請求瀏覽器請求還是應用程式請求

1、獲取請求的request HttpServletRequest request=ServletActionContext.getRequest(); 2、攔截器中判斷請求頭 通常判斷來自手機端的請求還是PC端的請求只需要判斷: request.getHea

容器完整處理一個http請求過程

初學java web的朋友們應該都知道tomcat容器,但是tomcat是如何完成一次http請求的過程,這裡做一個記錄。 當用戶在客戶端點選一個連結,該連結的URL指向一個servlet,經過網路轉發到應用所在的web伺服器的,此時web伺服器不是直接把申請發給servlet本身,而是傳送給部署該s

一個http請求的詳細過程

首先http是一個應用層的協議,在這個層的協議,只是一種通訊規範,也就是因為雙方要進行通訊,大家要事先約定一個規範。 1.連線 當我們輸入這樣一個請求時,首先要建立一個socket連線,因為socket是通過ip和埠建立的,所以之前還有一個DNS解析過程,把www.m

SpringMVC:處理一個http請求的完整過程

SpringMVC是一個基於DispatcherServlet的MVC框架,每一個請求最先訪問的都是DispatcherServlet,DispatcherServlet負責轉發每一個Request請求給相應的Handler,Handler處理以後再返回相

Tomcat處理一個HTTP請求過程

一、Tomcat的組成 (1)Server伺服器元素代表整個catalina servlet容器。是單例模式。 (2)ServiceService是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine,負責處理所有Connector所獲得的客戶請求。

一個完整的HTTP請求過程詳細

一個完整的HTTP請求過程 整個流程 域名解析 —> 與伺服器建立連線 —> 發起HTTP請求 —> 伺服器響應HTTP請求,瀏覽器得到html程式碼 —> 瀏覽器解析html程式碼,並請求html程式碼中的資源(如js、css、

Tomcat Server處理一個http請求過程

查詢資料的時候先這個,有點用,摘錄下來 假設來自客戶的請求為:  http://localhost:8080/wsota/wsota_index.jsp 1) 請求被髮送到本機埠8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得  2) Conn

瀏覽器中輸入URL後,執行的全部過程。會用到哪些協議?(一次完整的HTTP請求過程

一次完整的HTTP請求過程: 1.首先進行域名解析,域名解析具體過程講一下: 瀏覽器搜尋自己的DNS快取,快取中維護一張域名與IP地址的對應表; 若沒有,則搜尋作業系統的DNS快取; 若沒有,則作業系統將域名傳送至本地域名伺服器(遞迴查詢方式),本地域名伺服器查詢自己

一個http請求傳送到後端的詳細過程

        首先HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是一個應用層的協議,是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議。HTTP是客戶端瀏覽器或其他程式與Web服務器 之間的應用層通訊協議。在Interne

怎麼檢視真實專案的http 請求請求報文和響應報文,即request和response?只有這樣,才能完全徹底明白一個http 請求整個過程,傳送和接收的是什麼東西。

IE瀏覽器,f12,網路,捕獲。 如,在前後端分離(即動靜分離,前端只有html程式碼,後端是介面返回json字串。這種方式,是最接近移動端專案即app專案的模式)方式,一個使用者儲存修改即savemodify為例: 因為是form提交是post方式,所以請求正文是

一個http請求處理過程

    1. 客戶發起情況到伺服器網絡卡;     2. 伺服器網絡卡接受到請求後轉交給核心處理;     3. 核心根據請求對應的套接字,將請求交給工作在使用者空間的Web伺服器程序     4. Web伺服器程序根據使用者請求,向核心進行系統呼叫,申請獲取相

Spring mvc 從一個http請求分析DispatcherServlet的工作過程

開發工具 Intellij IDEA  目標、除錯 請求http://localhost:8080/coffee/helloworld <servlet> <servlet-name>dispatcher</servlet-

Tomcat目錄結構及Tomcat Server處理一個http請求過程

1.Tomcat的結構概述 Tomcat伺服器是由一系列可配置的元件構成,其核心元件是Catalina Servlet容器,它是所有其他Tomcat元件的頂層容器。Tomcat的元件可以在< CATALINA_HOME>/conf/serv

Tomcat伺服器處理一個http請求過程

Tomcat容器就是一個Servlet,理解Servlet的執行過程。 (1)請求被髮送到本機埠8080,被在那裡監聽的Coyoto Http/1.1 Connector獲得。 (2)Connector把該請求交給它所在的Service的Engine

Tomcat如何處理一個HTTP請求過程

Tomcat是一個基於元件的伺服器,它的構成元件都是可配置的,Tomcat的各個元件是在<TOMCAT_HOME>\conf\server.xml檔案中配置的。 server.xml檔案的基本組成結構如下: <Server>             

網站開發進階(四)Tomcat Server處理一個http請求過程

Tomcat Server處理一個http請求的過程   假設來自客戶的請求為: http://localhost:8080/wsota/wsota_index.jsp 1) 請求被髮送到本機埠8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得

JS指令碼判斷一個http請求是來自瀏覽器還是其他終端

1.js判斷PC瀏覽器 [javascript] view plaincopy <script type="text/javascript">   var Sys = {};   var ua = navigator.userAgent.to

HTTP請求過程

spa 繼續 請求方式 方式 分享 空白 同構 通知 層次 1、HTTP請求和響應格式 1.1.http請求格式   http請求格式由四部分組成:請求行、請求頭、空行、消息體      請求行:是請求消息的第一行,由請求方式(GET/POST/DELETE/PUT)、請求