1. 程式人生 > >http 基礎與通訊原理

http 基礎與通訊原理

apach n) 關系 某服務 internet 郵件服務 class second 例如

目錄

  • http 基礎與通訊原理
    • Internet 與中國
      • 1990年10月 註冊CN頂級域名
      • 1993年3月2日 接入第一根專線
      • 1994年4月20日 實現與互聯網的全功能連接
      • 1994年5月21日 設置CN域名服務器
      • 1996年1月 正式進入Internet
    • TCP/IP協議
    • socket 套接字
      • 套接字轉發過程
      • 套接字連接過程
      • 套接字相關系統函數
    • HTTP 服務
      • 通訊過程
      • 相關術語
      • 工作機制
      • HTTP的多種連接模式
    • URL
      • URL的組成
    • 網站訪問量
      • IP
      • PV
      • UV
      • QPS
      • PV,QPS,並發連接數換算公式
      • 峰值時間
    • http 完整請求處理過程
      • 建立連接
      • 接收請求
      • 處理請求
      • 構建響應報文
      • 發送響應報文
      • 記錄日誌
      • 簡述

http 基礎與通訊原理

技術分享圖片

Internet 與中國

1990年10月 註冊CN頂級域名

錢天白教授代表中國正式在國際互聯網絡信息中心的前身DDN-NIC註冊登記了我國的頂級域名CN,並且從此開通了使用中國頂級域名CN的國際電子郵件服務。由於當時中國尚未正式連入Internet,所以委托德國卡爾斯魯厄大學運行CN域名服務器

1993年3月2日 接入第一根專線

中國科學院高能物理研究所租用AT&T公司的國際衛星信道接入美國斯坦福線性加速器中心(SLAC)的64K專線正式開通,專線開通後,美國政府以Internet上有許多科技信息和其它各種資源,不能讓社會主義國家接入為由,只允許這條專線進入美國能源網而不能連接到其它地方。盡管如此,這條專線仍是我國部分連入Internet的第一根專線

1994年4月20日 實現與互聯網的全功能連接

中國實現與互聯網的全功能連接,被國際上正式承認為有互聯網的國家

1994年5月21日 設置CN域名服務器

在錢天白教授和德國卡爾斯魯厄大學的協助下,中國科學院計算機網絡信息中心完成了中國國家頂級域名(CN)服務器的設置,改變了中國的CN頂級域名服務器一直放在國外的歷史

1996年1月 正式進入Internet

中國互聯網全國骨幹網建成並正式開通,開始提供服務

TCP/IP協議

技術分享圖片

http 屬於應用層協議

socket 套接字

什麽是套接字?
在建立通信連接的每一端,進程間的傳輸要有兩個標誌,IP地址和端口號,合稱為套接字地址 socket address。他是進程間通信IPC的一種實現,允許位於不同主機(或同一主機)上不同進程之間進行通信和數據交換,SocketAPI出現於1983年,4.2 BSD實現
客戶機套接字地址定義了一個唯一的客戶進程。
服務器套接字地址定義了一個唯一的服務器進程。

技術分享圖片

套接字轉發過程

技術分享圖片

根據每個應用的端口號,socket 會將該數據轉發給對應端口的服務,當客戶端與服務端在同一臺主機上,且為不同的程序之間進行通訊時,Socket的存在方式為:UNIX套接字文件。這樣就無須層層封裝解封裝數據包,提高連接效率。

套接字中的幾個名詞含義:

Socket API:封裝了內核中所提供的socket通信相關的系統調用
Socket Domain :根據其所使用的IP地址來顯示

  • AF_INET:Address Family,IPv4
  • AF_INET6:IPv6
  • AF_UNIX:同一主機上不同進程之間通信時使用

Socket Type:根據使用的傳輸層協議

  • SOCK_STREAM:流,tcp套接字,可靠地傳遞、面向連接
  • SOCK_DGRAM:數據報,udp套接字,不可靠地傳遞、無連接
  • SOCK_RAW: 裸套接字,無須tcp或tdp,APP直接通過IP包通信,相當於應用程序數據,不走TCP ,直接到IP層,繞過TCP,UDP。

套接字連接過程

技術分享圖片

具體過程描述:
服務器A首先開啟一個服務,創建流套接字描述符,之後,該服務會根據其配置文件,綁定使用的協議,網卡地址,端口。這時候,這個端口就開啟了socket請求監聽。
當客戶端發送一個請求給服務的時候,服務器通過解包後分析該數據庫的目標地址是哪個地址,哪個端口,就會發送給對應的服務。這個時候,根據協議,如果是TCP的話,就會進行三次握手,建立連接。建立連接後,不在關註客戶端和服務器端,他們就可以雙向傳送數據。

套接字相關系統函數

  • socket(): 創建一個套接字
  • bind():綁定IP和端口
  • listen():監聽
  • accept():接收請求
  • connect():請求連接建立
  • write():發送
  • read():接收
  • close():關閉連接

HTTP 服務

通訊過程

技術分享圖片

技術分享圖片

相關術語

html: Hyper Text Markup Language 超文本標記語言
CSS: Cascading Style Sheet 層疊樣式表
js: javascript

示例:

<html>
    <head>
       <title>html語言</title>
    </head>
<body>
    <img src="http://www.magedu.com/wp-content/uploads/2017/09/logo.png" >
    <h1>標題1</h1>
    <p><a href=http://www.magedu.com>馬哥教育</a>歡迎你</p>
</body>
</html>

MIME:Multipurpose Internet Mail Extensions多用途互聯網郵件擴展。在http協議中,MIME用於區分數據類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。常見的類型有:

  • text/plain
  • text/html
  • text/css
  • image/jpeg
  • image/png
  • video/mp4
  • application/javascript

工作機制

http請求:http request
http響應:http response

所以,通常一次http事務: 請求 <-->響應

Web資源:web resource
一個網頁由多個資源構成,打開一個頁面,會有多個資源展示出來,但是每個資源都要單獨請求。因此,一個“Web 頁面”通常並不是單個資源,而是一組資源的集合

靜態文件:無需服務端做出額外處理,用戶通過瀏覽器,訪問web服務器,獲取web數據的時候,如果獲取到的文件,和服務器端的一模一樣,那麽說明,這是一個靜態文件。靜態頁面不意味著不為變。
文件後綴:.jpg, .html, .txt, .js, .css, .mp3, .avi
動態文件:服務端執行程序,返回執行的結果,本質區別為:服務器端是否要執行該頁面,轉換為相應頁面後返還給客戶端,是否為同一個文件。
文件後綴:.asp, .php, .jsp

提高HTTP連接性能

  • 並行連接:通過多條TCP連接發起並發的HTTP請求
  • 持久連接:keep-alive,長連接,重用TCP連接,以消除連接和關閉的時延,以事務個數和時間來決定是否關閉連接
  • 管道化連接:通過共享TCP連接發起並發的HTTP請求
  • 復用的連接:交替傳送請求和響應報文(實驗階段)

HTTP的多種連接模式

假設用戶現在要訪問magedu.com這個地址。這個地址有四個資源需要下載。

串行連接

需要4次TCP 握手回收
建立連接1 --> 請求資源1 --> 服務器響應請求,返還資源1 --> 斷開連接
建立連接2 --> 請求資源2 --> 服務器響應請求,返還資源2 --> 斷開連接
。。。
。。。

直到所有資源都獲取完,每個資源都要握手揮手,效率低下。

並行連接

客戶端會一次性建立多個連接,同時獲取多個資源 有多少可能就建立多少個。每個連接之間都會有一小段軟件時延遲。

建立連接1-4 --> 同時請求 --> 同時下載 -> 一一斷開

持久化連接

表示客戶端與服務器只建立一次TCP連接,然後按照串行下載的方式,下載所有的資源。就是一個個按順序下載。

管道化持久連接

客戶端與服務器建議一次TCP連接,並且同時發起多個下載請求,同時並行下載多個資源

用比如的方式來說的話,A到B城市需要運送一批貨物

普通的串行就是 每次建立一條道路,只運送一箱子,然後拆了這條路,如此循環,直到貨全部運輸完
普通並行就是 一次性建立100條 ,100箱貨全部一起運過去,然後全拆了
持久化串行就是 建立的這條路不是一次性的,可以多次來運輸使用,但是一次性只能運一箱
持久化並行就是 建立的這條路不是一次性的,可以一次性運輸多個箱子

具體圖例

技術分享圖片

技術分享圖片

URL

Uniform Resource Identifier 統一資源標識,分為URL和URN

URN: Uniform Resource Naming,統一資源命名
示例: P2P下載使用的磁力鏈接是URN的一種實現,URN只是名稱,而不代表具體的地址,所以這樣P2P才會從多個服務器來下載該名稱的資源。相當於一個標記。
magnet:?xt=urn:btih:660557A6890EF888666

URL: Uniform Resorce Locator,統一資源定位符,用於描述某服務器某特定資源位置

兩者區別:URN如同一個人的名稱,而URL代表一個人的住址。換言之,URN定義某事物的身份,而URL提供查找該事物的方法。URN僅用於命名,而不指定地址。

URL的組成

通常一個URL的組成部分有以下內容:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

schame:方案,訪問服務器以獲取資源時要使用哪種協議,比如:http,https,ntp,ftp.....
user:用戶,某些方案訪問資源時需要的用戶名 
password:密碼,用戶對應的密碼,中間用:分隔
Host:主機,資源宿主服務器的主機名或IP地址
port:端口,資源宿主服務器正在監聽的端口號,很多方案有默認端口號
path:路徑,服務器資源的本地名,由一個/將其與前面的URL組件分隔
params:參數,指定輸入的參數,參數為名/值對,多個參數,用;分隔
query:查詢,傳遞參數給程序,如數據庫,用?分隔,多個查詢用&分隔
frag:片段,一小片或一部分資源的名字,此組件在客戶端使用,用#分隔

URL案例

  • http://www.magedu.com:8080/images/logo.jpg
  • ftp://mage:[email protected]/pub/linux.ppt
  • rtsp://videoserver/video_demo/Real Time Streaming Protocol
  • http://www.magedu.com/bbs/hello;gender=f/send;type=title
  • https://list.jd.com/list.html?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1
  • http://apache.org/index.html#projects-list

schame 協議類型

網站訪問量

IP

IP(獨立IP):即Internet Protocol,指獨立IP數。一天內來自相同客戶機IP地址只計算一次,記錄遠程客戶機IP地址的計算機訪問網站的次數,是衡量網站流量的重要指標

PV

PV(訪問量): 即Page View, 頁面瀏覽量或點擊量,用戶每次刷新即被計算一次,PV反映的是瀏覽某網站的頁面數,PV與來訪者的數量成正比,PV並不是頁面的來訪者數量,而是網站被訪問的頁面數量

UV

UV(獨立訪客):即Unique Visitor,訪問網站的一臺電腦為一個訪客。一天內相同的客戶端只被計算一次。可以理解成訪問某網站的電腦的數量。網站判斷來訪電腦的身份是通過來訪電腦的cookies實現的。如果更換了IP後但不清除cookies,再訪問相同網站,該網站的統計中UV數是不變的

QPS

QPS:request per second,每秒請求數

PV,QPS,並發連接數換算公式

QPS= PV* 頁?衍?連接次數/ 統計時間(86400)
並發連接數 =QPS * http平均響應時間

峰值時間

峰值時間:每天80%的訪問集中在20%的時間裏,這20%時間為峰值時間
峰值時間每秒請求數(QPS)=( 總PV數 頁?衍?連接次數)80% ) / ( 每天秒數* 20% )

http 完整請求處理過程

技術分享圖片

建立連接

接收或拒絕連接請求,如果拒絕則請求結束

接收請求

接收客戶端請求報文中對某資源的一次請求的過程,服務器端收到的客戶請求不是一個,一次性會收到多個並發請求,所以在web端,就有不同的訪問響應模型,來一次性處理多個請求。

單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
多進程I/O模型:並行啟動多個進程,每個進程響應一個連接請求 (apache 使用該模型)
復用I/O結構:啟動一個進程,同時響應N個連接請求
實現方法:多線程模型和事件驅動
多線程模型:一個進程生成N個線程,每線程響應一個連接請求
事件驅動:一個進程處理N個請求

復用的多進程I/O模型:啟動M個進程,每個進程響應N個連接請求,同時接收M*N個請求

由於apache使用多線程I/O結構,每來一個用戶請求,就開一個線程或進程進行響應,那麽在同一臺設備上。同一程序的進程與線程數是有上限了,這就導致了apache 在處理多個請求的時候,當請求數過多,達到峰值,性能就會急劇下降,這個問題被稱為c10k問題

c代表連接數,10k 表示並發10000連接 ,對於單設備來說,創建1W個進程,可想而知是根本無法承受的。所以就需要使用別的模型來解決這個問題。

處理請求

處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
元數據:請求報文首部

HEADERS 格式 name:value

示例:

  • Host: www.magedu.com 請求的主機名稱
  • Server: Apache/2.4.7

HTTP常用請求方式,Method
GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

訪問資源

服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源。事實上訪問資源是通過向內核發送訪問請求,內核獲取資源後,回傳給web服務。

假設資源放置於本地文件系統特定的路徑:DocRoot
DocRoot /var/www/html

這時候用戶需要訪問該資源:/var/www/html/images/logo.jpg
那麽在瀏覽器中輸入的地址就是:

http://www.magedu.com/images/logo.jpg

構建響應報文

一旦Web服務器識別除了資源,就執行請求方法中描述的動作,並返回響應報文。響應報文中包含有:響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體

響應實體

1)響應實體:如果事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中通常包括:
描述了響應主體MIME類型的Content-Type首部
描述了響應主體長度的Content-Length
實際報文的主體內容

URL重定向

URL重定向:web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑。例如用戶想訪問www.ddz.com/images/logo.jpg ,但是該圖片的位置已經更改,並且服務器已經設置了重定向,那麽當用戶訪問該路徑時,就會重定向到新的路徑 。

例如:
永久重定向:http://www.360buy.com
臨時重定向:http://www.taobao.com

MIME類型

Web 服務器要負責確定響應主機的MIME類型。多種配置服務器的方法可將MIME類型與資源管理起來。
魔法分類:Apache web 服務器可以掃描每個資源的內容,並將其與一個已知模式表(被稱為魔法文件)進行匹配,以決定每個文件的MIME類型。這樣做可能比較慢,但是很方便,尤其是文件沒有標準擴展名時。(這裏要註意一點,當文件有擴展名時,他會直接匹配,當文件沒有擴展名時,他就會掃描文件頭信息。所以如果一個jpg文件的後綴為txt,那麽他會認為這是一個txt文件。
顯式分類:可以對Web服務器進行配置,使其不考慮文件的擴展名或內容,強制特定文件或目錄內容擁有某個MIME類型
類型協商: 有些Web服務器經過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置Web服務器,使其可以通過與用戶的協商來決定使用哪種格式(及相關的MIME類型)"最好"。

發送響應報文

Web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。服務器可能有很多條到各個客戶端的連接,有些是空閑的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄連接的狀態,還要特別註意對持久連接的處理。對非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連接。對持久連接來說,連接可能仍保持打開狀態,在這種情況下,服務器要正確地計算Content-Length首部,不然客戶端就無法知道響應什麽時候結束了。

記錄日誌

最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務

簡述

  1. 客戶端向服務器發送TCP 連接請求,三次握手,同一後建立連接
  2. 服務器接收客戶端請求報文中對某資源的一次請求的過程,這個響應過程通常有多種模型 ,單線程IO 多線程IO
  3. 服務器對客戶端發送的請求報文進行解析,也就是我們通常說的網址。並獲取請求的資源及請求方法等相關信息,分割報文,來解析請求,通常一個報文是包含 請求方式,請求主機名,端口(默認80),詳細頁面等等
  4. 服務器根據這個解析的信息,訪問這些存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
  5. 資源獲取完成後,服務器構建響應報文,有後綴。MIME會根據文件後綴來判斷類型,沒有後綴,就通過自己識別來判斷。然後發送該響應報文
  6. 客戶端接收到該報文後,解析出來,顯示給用戶。

http 基礎與通訊原理