摘要:后者仍處于試驗階段,未大范圍使用。事務時延的有以下幾種主要原因客戶端首先需要根據確定服務器的地址和端口號。這種調諧被稱為慢啟動,用于防止因特網的突然過載和擁塞。
WilsonLiu"s blog 首發地址
概述HTTPHTTP協議是因特網的多媒體信使。HTTP可以從遍布世界的Web服務器上將這些信息快迅速,便捷,可靠地搬移到人們桌面上的Web瀏覽器上去。
HTTP協議主要分Web客戶端和服務器。其中Web服務器是Web資源的宿主。Web資源可以包含任意媒體類型內容,HTTP協議為了標識各種媒體類型,會給通過Web傳輸的對象都打上MIME類型的數據標簽格式。(MIME科普:最初設計MIME(Multipurpose Internet Mail Extension,多用途因特網郵件擴展)是為了解決在不同的電子郵件系統之間搬移報文時存在的問題。HTTP隨后也采用了它,用他來描述并標記多媒體內容。)
同時,每個web服務器資源都有一個名字去標識,這被稱為統一資源標識符(Uniform Resource Identifier)。URI有兩種類型,一種是我們常見的統一資源定位符URL,另外一種被稱為統一資源名URN。后者仍處于試驗階段,未大范圍使用。
web頁面可以包含多個對象,如一個頁面會包括許多圖片,視頻,音頻等內容。客戶端通過向Web服務器發送請求命令來進行事務處理。服務器響應客戶端請求,并傳送相應數據。
請求和響應報文都有固定的規范。報文由一行一行簡單字符串組成的。HTTP報文都是純文本,而不是二進制代碼,所以人們可以很方便的進行讀寫(但難以解析)。報文分為三部分
起始行 GET /index.html HTTP/1.0
首部字段 每個首部字段包含一個名字和一個值,為了便于解析,兩者之間用冒號來分割。首部以一個空行結束。
主體 起始行和首部都是文本形式且都是結構化的,主體則可以包含任意的二進制數據,當然也可以包含文本。
HTTP協議的報文是通過傳輸控制協議(Transmission Control Protocol,TCP)連接從一個地方搬移到另外一個地方去的。
TCP提供了
無差錯的數據傳輸
按序傳輸 (數據總是會按照發送的順序到達)
未分段的數據流 (可以在任意時刻以任意尺寸將數據發送出去)
在HTTP客戶端向服務器發送報文之前,需要用網際協議(Internet Protocol,IP)地址和端口號在客戶端和服務器之間建立一條TCP/IP連接。首先需要將URL進行DNS解析成IP地址,再用IP地址連接Web服務器,默認端口是80。
除了客戶端與服務器之外,還有許多比較重要的Web結構組件
代理 位于客戶端和服務器之間的HTTP中間實體
緩存 HTTP的倉庫,使常用頁面的副本可以保存在離客戶端更近的地方
網關 連接其他應用程序的特殊Web服務器
隧道 對HTTP通信報文進行盲轉發的特殊代理
Agent代理 發起自動HTTP請求的半智能Web客戶端
URL與資源URL提供了一種統一的資源命名方式,大多數URL都有同樣的:"方案://服務器位置/路徑"結構。
URL的語法
幾乎沒有哪個URL包含了所有這些組件。
URL最重要的3個部分是方案(scheme),主機(host)和路徑(path)。
轉義表示法包含一個百分號%,后面跟著兩個表示字符ASCII碼的十六進制數。
例子http://www.baidu.com/%7Ejoe ~ 126(0x7E)
HTTP報文是在HTTP應用程序之間發生的數據塊。這些數據塊以一些文本形式的元信息(meta-information)開頭,這些信息描述了報文的內容及含義,后面跟著可選的數據部分。這些報文在客戶端,服務器和代理之間流動。
報文的語法所有的報文都可以分為兩類:請求報文(request message)和響應報文(response message)。
請求報文
響應報文
起始行 方法
方法 | 描述 |
---|---|
GET | 從服務器獲取一份文檔 |
HEAD | 只從服務器獲取文檔的首部 |
POST | 向服務器發送需要處理的數據 |
PUT | 將請求的主體部分存儲在服務器上 |
PUT | 對可能經過代理服務器傳送到服務器上去的報文進行追蹤 |
OPTIONS | 決定可以在服務器上執行哪些方法 |
DELETE | 從服務器上刪除一份文檔 |
并不是所有服務器都實現了上述7種方法,而且,由于HTTP設計的易于擴展,所以其他服務器可能還會實現一些自己的請求方法。
狀態碼整體范圍 | 已定義范圍 | 分類 |
---|---|---|
100 ~ 199 | 100~101 | 信息提示 |
200~299 | 200~206 | 成功 |
300~399 | 300~305 | 重定向 |
400~499 | 400~415 | 客戶端錯誤 |
500~599 | 500~505 | 服務器錯誤 |
當前的HTTP版本只為每類狀態定義了幾個代碼,隨著協議的發展,HTTP規范中會正式的定義更多的狀態碼,如果收到了不認識的狀態碼,可能是有人將其作為當前協議的擴展定義的??梢愿鶕渌幏秶?,將它作為那個類別中一個普通的成員來處理。
首部首部分類:
通用首部 既可以出現在請求報文中又可以出現在響應報文中
請求首部 提供更多有關請求的信息
響應首部 提供更多有關響應的信息
實體首部 描述主體的長度和內容,或者資源自身
擴展首部 規范中沒有定義的新首部
實體的主體部分HTTP報文的第三部分是可選的實體主體部分。實體的主體是HTTP報文的負荷,就是HTTP要傳輸的內容。
連接管理世界上幾乎所有的HTTP通信都是由TCP/IP承載的,TCP/IP是全球計算機及網絡設備都在使用的一種常用的分組交換網絡分層協議集??蛻舳藨贸绦蚩梢源蜷_一條TCP/IP連接,連接到可能運行在世界任何地方的服務器應用程序。
web瀏覽器通過TCP連接與web服務器進行交互的流程https://github.com:80/WilsonLiu95
瀏覽器利用解析出主機名 github.com
瀏覽器查詢這個主機名的IP地址 192.30.252.122
瀏覽器獲得端口號 80
瀏覽器發起到192.30.252.122端口80的連接
瀏覽器向服務器發送一條HTTP GET報文
瀏覽器從服務器讀取HTTP響應報文
瀏覽器關閉TCP連接
HTTP事務的時延與建立TCP連接,以及傳輸請求和響應報文的時間相比,事務處理時間可能是很短的。除非客戶端或服務器超載,或正在處理復雜的動態資源,否則HTTP時延就是由TCP網絡時延構成的。
HTTP事務時延的有以下幾種主要原因
客戶端首先需要根據URI確定Web服務器的IP地址和端口號。其中IP地址需要通過DNS解析URL中的主機名獲得,這可能花費數十秒的時間。
客戶端向服務器發送TCP連接請求,即著名的"三次握手"。這個值通常最多只有一兩秒鐘,但如果有數百個HTTP事務的話,這個值就會快速疊加上去。
因特網傳輸報文,以及服務器處理請求報文都需要花費時間。
web服務器回送HTTP響應也需要時間。
這些TCP網絡時延取決于硬件速度,網絡和服務器的負載,請求和響應報文的尺寸,以及客戶端和服務器之間的距離。TCP協議的技術復雜性也會對時延產生巨大的影響。
一下是其余一些會對HTTP產生影響,最常見的相關時延
TCP連接建立握手
TCP慢啟動擁塞控制
數據聚焦的Nagle算法
用于捎帶確認的TCP延遲確認算法
TIME_WAIT時延和端口耗盡
TCP連接建立握手TCP連接握手需要經過一下幾個步驟
酷虎的向服務器發送一個小的TCP分組(通常是40-60字節)。這個分組中設置了一個特殊的SYN標記,說明這是一個連接請求。
如果服務器接收了連接,就會對一些連接參數進行計算,并向客戶端回送一個TCP分組,這個分組中的SYN和ACK標記都被置位了,說明連接請求已經被接收了。
最后,客戶端向服務器回送一條確認信息,通知它連接已成功建立。現代的TCP棧都允許客戶端在這個確認分組中發送數據。
如果連接只用來傳送少量的數據,這些交換過程就會嚴重降低HTTP的性能。小的HTTP事務可能會在TCP建立上花費50%或者更多的時間。
延遲確認每個TCP段都有一個序列號和數據完整性校驗和。每個段的接收者收到完好的段時,都會向發送者回送小的確認分組。如果發送者沒有在指定的窗口時間內收到確認信息,發送者就認為分為已被破壞或損毀,并重發數據。
為了增加確認報文找到同向傳輸數據分組的可能性,很多TCP棧都實現了一種"延遲確認"算法。延遲確認算法會在一個特定的窗口時間(通常是100~200毫秒)內將輸出確認存放在緩沖區中,以尋找能夠捎帶它的輸出數據分組。如果在那個時間段內沒有輸出數據分組,就講確認信息放在多帶帶的分組中傳送。
通常,延遲確認算法會引入相當大的時延,所以可以調整或者禁止延遲確認算法。
TCP數據傳輸的性能還取決于TCP連接的使用期(age)。TCP連接會隨著時間進行自我“調諧”,起初會限制連接的最大速度,如果數據成功傳輸,會隨著時間的推移提高傳輸的速度。這種調諧被稱為TCP慢啟動(slow start),用于防止因特網的突然過載和擁塞。
Nagle算法與TCP_NODELAYNagle算法鼓勵發送全尺寸(LAN上最大尺寸的分組大約是1500字節,在因特網上是幾百字節)的段。只有當所有其他的分組都被確認之后,Nagle才允許發送非全尺寸的分組,如果其他分仍然在傳輸過程中,就將那部分數據緩存起來。只有當掛起分組被確認,或者緩存中積累了足夠發送一個全尺寸分組的數據時,才會將緩存的數據發送出去。
Nagle算法會引發幾種HTTP性能問題。首先小的HTTP報文無法填滿一個分組,可能會因為等待那些永遠不會到來的額外數據而產生時延。其次,Nagle算法與延時確認之間的交互存在問題——Nagle會阻止數據的發送,直到有確認分組抵達為止,但確認分組自身會被延遲確認算法延遲100-200毫秒。
因此,HTTP應用程序常常會在自己的棧中設置參數TCP_NODELAY,禁用Nagle算法,提高性能。
當某個TCP端點關閉TCP連接時,會在內存中維護一個小的控制塊,用來記錄最近所關閉連接的IP地址和端口號。這類信息會維持一小段時間,以確保在這段時間內不會創建于相同地址和端口號的新連接。
客戶端每次連接到服務器上去時,都會獲得一個新的端口號,以實現連接的唯一性。但由于可用的源端口數量有限,因此會出現端口耗盡的情況。就會無法建立新的連接。
解決辦法:增加客戶端負載生成機器的數量,或者確保客戶端和服務器在循環使用幾個虛擬的IP地址以增加更多的連接組合。
HTTP允許在客戶端和最終的源端服務器之間存在一串HTTP中間實體(代理,高速緩存等)。可以從客戶端開始,逐跳地將HTTP報文經過這些中間設備,轉發到源端服務器上去(或者進行反向傳輸)。
Connection首部在某些情況下,兩個相鄰的HTTP應用程序會為它們共享的連接應用一組選項。HTTP的Connection首部字段中有一個由逗號分隔的連接標簽列表,這些標簽為此連接指定了一些不會傳播到其他連接中去的選項。
Connection首部可以承載3種不同類型的標簽
HTTP首部字段名,列出了只與此連接有關的首部
任意標簽值,用于描述此連接的非標準選項
值close,說明操作完成之后需關閉這條持久連接
串行事務處理時延如果支隊連接進行簡單的管理,TCP的性能時延可能會疊加起來。串行加載的另外一個缺點是,有些瀏覽器在對象加載完畢之前無法獲知對象的尺寸,而且它們可能需要尺寸信息來決定將對象放在屏幕的什么位置上,所以在加載了足夠多的對象之前,無法在屏幕上顯示任何內容。
以下為4種提高HTTP連接性能的技術。
并行連接 通過多條TCP連接發起并發的HTTP請求
持久連接 重用TCP連接,以消除連接及關閉時延
管道化連接 通過共享的TCP連接發起并發的HTTP請求
復用的連接 交替傳送請求和響應報文 (實驗階段)
并行連接HTTP允許客戶端打開多條連接,并行地執行多個HTTP事務。
并行連接可以提高符合頁面的傳輸速度,但并行連接也有一些缺點:
每個事務都會打開/關閉一條新的連接,好耗費時間和帶寬
由于TCP慢啟動特性的存在,每條新連接的性能會有所降低
可打開的并行連接數量實際上是有限的
持久連接Web客戶端經常會打開到同一個站點的連接。因此,初始化了對某服務器的HTTP請求的應用程序很可能會在不久的將來對那臺服務器發起更多的請求。這種性質被稱為站點局部性。
因此,HTTP/1.1允許HTTP設備在事務處理結束之后將TCP連接保持在打開狀態,以便為將來的HTTP請求重用現存的連接。
在事務處理結束之后仍然保持在打開狀態的TCP連接被稱為持久連接。非持久連接會在每個事務結束之后關閉。持久連接會在不同事務之間保持打開狀態,直到客戶端或服務器決定將其關閉為止。
重用已對目標服務器打開的空閑持久連接,就可以避開緩慢的連接建立階段。而且,已經打開的連接還可以避免慢啟動的擁塞適應階段,以便更快速地進行數據的傳輸。
持久連接有一些比并行連接更好的地方。持久連接降低了時延和連接建立的開銷,將連接保持在已調諧狀態,而且減少了打開連接的潛在數量。(持久連接有兩種類型:比較老的HTTP/1.0+ "keep-alive"連接,以及現代的HTTP/1.1 "persistent"連接)
并行連接與持久連接配合使用可能是最高效的方式。
管道化連接允許在持久連接上可選的使用請求管道,這是相對于keep-alive連接的又一性能優化。
在響應到達之前,可以將多條請求放入隊列。當第一條請求通過網絡流向地球另一端的服務器時,第二條和第三條請求也可以開始發送了。在高時延網絡條件下,這樣做可以降低網絡的環回時間。
本文為《http權威指南》的第一部分,由第一到四章組成,介紹了HTTP的基礎構件和HTTP的核心技術。希望大家能夠喜歡。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80186.html
摘要:后者仍處于試驗階段,未大范圍使用。事務時延的有以下幾種主要原因客戶端首先需要根據確定服務器的地址和端口號。這種調諧被稱為慢啟動,用于防止因特網的突然過載和擁塞。 WilsonLius blog 首發地址 概述HTTP HTTP協議是因特網的多媒體信使。HTTP可以從遍布世界的Web服務器上將這些信息快迅速,便捷,可靠地搬移到人們桌面上的Web瀏覽器上去。 HTTP協議主要分Web客戶端...
摘要:寫在前面目前專注深入學習,特花了點時間整理了一些前端學習相關的書籍。大致分為以下大系列系列系列基礎系列應用系列進階系列類庫系列框架系列。這些書籍在這里免費提供下載,有興趣的一起學習。 寫在前面 目前專注深入JavaScript學習,特花了點時間整理了一些前端學習相關的書籍。 大致分為以下7大系列:CSS系列、DOM系列、JavaScript基礎系列、JavaScript應用系列、Ja...
摘要:以下知識點是前輩師兄總結基礎語義化標簽引進了一些新的標簽,特別注意等,注意的標題結構理解瀏覽器解析的過程,理解的樹形結構,及相應理解標簽在各個瀏覽器上的默認樣式代理樣式,理解中的重置樣式表的概念理解等功能性標簽理解標簽,理解文件提交過程推薦 以下知識點是前輩師兄總結 1、HTML/HTML5基礎: 1.0、語義化H5標簽1.1、H5引進了一些新的標簽,特別注意article...
摘要:以下知識點是前輩師兄總結基礎語義化標簽引進了一些新的標簽,特別注意等,注意的標題結構理解瀏覽器解析的過程,理解的樹形結構,及相應理解標簽在各個瀏覽器上的默認樣式代理樣式,理解中的重置樣式表的概念理解等功能性標簽理解標簽,理解文件提交過程推薦 以下知識點是前輩師兄總結 1、HTML/HTML5基礎: 1.0、語義化H5標簽1.1、H5引進了一些新的標簽,特別注意article...
摘要:首發地址內容分發主機托管對內容資源的存儲協調以及管理的職責統稱為主機托管。并且反向代理和攔截代理也都需要明確的站點信息。從主原始服務器接收內容的鏡像服務器稱為復制原始服務器。鏡像服務器可以在不同的地點包含同樣內容的副本。 WilsonLius blog 首發地址 內容分發 Web主機托管 對內容資源的存儲協調以及管理的職責統稱為Web主機托管。 虛擬服務器請求卻反主機信息 HTTP/1...
閱讀 2545·2023-04-26 01:44
閱讀 2558·2021-09-10 10:50
閱讀 1411·2019-08-30 15:56
閱讀 2250·2019-08-30 15:44
閱讀 512·2019-08-29 11:14
閱讀 3417·2019-08-26 11:56
閱讀 3018·2019-08-26 11:52
閱讀 909·2019-08-26 10:27