http 基礎與通訊原理
目錄
- 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 完整請求處理過程
- 建立連接
- 接收請求
- 處理請求
- 構建響應報文
- 發送響應報文
- 記錄日誌
- 簡述
- Internet 與中國
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服務器會在日誌文件中添加一個條目,來描述已執行的事務
簡述
- 客戶端向服務器發送TCP 連接請求,三次握手,同一後建立連接
- 服務器接收客戶端請求報文中對某資源的一次請求的過程,這個響應過程通常有多種模型 ,單線程IO 多線程IO
- 服務器對客戶端發送的請求報文進行解析,也就是我們通常說的網址。並獲取請求的資源及請求方法等相關信息,分割報文,來解析請求,通常一個報文是包含 請求方式,請求主機名,端口(默認80),詳細頁面等等
- 服務器根據這個解析的信息,訪問這些存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
- 資源獲取完成後,服務器構建響應報文,有後綴。MIME會根據文件後綴來判斷類型,沒有後綴,就通過自己識別來判斷。然後發送該響應報文
- 客戶端接收到該報文後,解析出來,顯示給用戶。
http 基礎與通訊原理