本章將介紹:
- http時如何使用tcp連線的
- tcp連線的時延,瓶頸以及存在的障礙
- http的優化,包括並行連線,keep-alive(持久連線)和管道化連線
- 管理連線時應該以及不應該做的事情
1. tcp連線
tcp為http提供了一條可靠的位元傳輸管道,從tcp連線的一端填入的位元組會從另一端以原有的順序,正確的傳送出來
http要傳送一條報文時,會以流的形式將報文資料的內容通過一條開啟的tcp連線按序傳輸。tcp受到資料流之後,會講資料流砍成被稱作為段的小資料塊,並將段封裝在ip分組中,通過網際網路進行傳輸,所有這些工作都由tcp/ip軟體來處理,http程式設計師什麼都看不到
每個tcp段都是由ip分組承載,從乙個ip位址傳送到另乙個ip位址。每個ip分組包括:
- 乙個ip分組首部(通常20個位元組)
- 乙個tcp段首部(通常20個位元組)
- 乙個tcp資料塊(0個或多個位元組)
ip首部:源和目的ip位址,長度和其它一些標記
tcp段首部:tcp埠號,tcp控制標記,資料排序和完整性檢查的一些數字值
在任意時刻計算機都可以有幾條tcp連線處於開啟狀態,tcp是通過埠號來保持所有這些連線的正確執行。ip位址可以將我們連線到正確的計算機,埠號可以將我們連線到正確的應用程式上。tcp連線通過4個值來識別:
《源ip位址,源埠號,目的ip位址,目的埠號》這四個值唯一的定義一條連線
作業系統提供了一些操縱其tcp連線的工具,套接字api向http程式設計師隱藏了tcp和ip的所有細節。套接字api允許使用者建立tcp的端點資料結構,將這些端點與遠端伺服器的tcp端點進行連線,並對資料流進行讀寫
2. 對tcp效能的考慮
http緊挨tcp,位於其上層,所以http事務的效能在很大程度上取決於底層tcp通道的效能。
http事務的時延由以下原因:
- 客戶端首先根據uri確定web伺服器的ip位址和埠號,如果最近沒有對uri中的主機進行訪問,通過dns解析系統將uri中的主機名轉換
- 客戶端向伺服器傳送一條tcp連線請求,並等待伺服器回送乙個請求接受應答
- 一旦連線建立起來,客戶端就會通過新建立的tcp管道傳送http請求,web伺服器會從tcp連線中讀取請求報文,並對請求進行處理
- web伺服器回送http響應,這也需要時間
常見tcp相關時延為:
- tcp連線建立握手
tcp連線握手需要經過以下幾個步驟:
1. 請求新的tcp連線時,客戶端要向伺服器傳送乙個小的tcp分組,這個分組中設定乙個特殊的syn標記,說明這是乙個連線請求
2. 如果伺服器接收了連線,就會對一些連線引數進行計算,並向客戶端回送乙個tcp分組,這個分組中的syn和ack標記都被置位,說明連線請求已被接受
3. 最後客戶端向伺服器回送一條確認資訊,通知它連線已建立。現在的tcp都允許客戶端在這個確認分組中傳送資料
- tcp慢啟動擁塞控制
tcp資料傳輸的效能還取決於tcp連線的使用期。tcp連線會隨著時間進行自我「調諧」,起初會限制連線的最大速度,如果資料成功傳輸,會隨著時間的推移提高傳輸的速度,這種調諧別稱為tcp慢啟動,用於防止網際網路的突然重載荷擁塞。所以新連線的傳輸速度會比已經交換過一定資料的「已調諧」連線慢一些
- 資料聚集的nagle演算法
nagle演算法試圖在傳送乙個分組之前,將大量tcp資料繫結在一起,以提高網路效率。nagle演算法鼓勵傳送全尺寸的段,只有當所有其它分組都被確認之後,nagle演算法才允許傳送非全尺寸分組,如果其它分組還在傳輸過程中,就將那部分資料快取起來。只有當掛起分組被確認,或者快取中積累了足夠傳送乙個全尺寸分組的資料時,才會將快取的資料傳送出去。
http應用程式常常在自己的棧中設定引數tcp_nodelay,禁用nagle演算法,提高效能。
- 用於捎帶確認的tcp延遲確認演算法
小的http事務可能會在tcp建立上花費很多時間。tcp將返回的確認資訊與輸出的資料分組結合在一起,可以更有效的利用網路。為了增加確認報文找到通向傳輸資料分組的可能性,很多tcp棧都實現了一種「延遲確認」演算法。延遲確認演算法會在乙個特定的視窗時間(通常100-200毫秒)內將輸出確認存放在緩衝區中,以尋找能夠捎帶它的輸出資料分組,如果在那段時間內沒有輸出資料分組,就將確認資訊放在單獨的分組中傳送
- time_wait時延和埠耗盡
time_wait埠耗盡時很嚴重的效能問題,會影響到效能基準,現實中相對較少出現
當某個tcp端點關閉tcp連線時,會在記憶體中維護乙個小的控制塊,用來記錄最近所關閉連線的ip位址和埠號,這類資訊只會維持一小段時間,以確保在這段時間內不會建立具有相同位址和埠號的新連線。
3. http連線的處理
- 常被誤解的connection首部
http允許在客戶端和最終的源端伺服器之間存在一串中間實體(**,快取記憶體等)。可以從客戶端開始,逐條的講http報文經過這些中間裝置,**到源端伺服器上去
connection首部可以承載3中不同型別的標籤:
- http首部欄位名,列出了只與此連線有關的首部
- 任意標籤值,用於描述此連線的非標準選項
- 值close,說明操作完成後需要關閉這條持久連線
在將報文**出去之前,必須刪除connection首部列出的所有首部字段,因此將逐跳首部名放入connection首部被稱為「對首部的保護「
- 序列事務處理時延
序列事務的時延可能會疊加起來,幾種現存和新興的方法可以提高http的連線效能:
1. 並行連線
- 並行連線可能會提高頁面的載入速度
因為時延會重疊
- 並行連線不一定更快
因為頻寬有限,而且大量連線消耗記憶體資源,引發效能下降
- 並行連線可能讓人「感覺」更快一些
因為多個元件物件同時出現在螢幕上,使用者能夠看到載入的進展
2. 持久連線
初始化了對某伺服器http請求的應用程式很可能會在不久的將來對那台伺服器發起更多的請求,這種性質被稱為站點本地性。因此http/1.1允許http裝置在事務處理結束之後將tcp連線保持在開啟狀態,以便為未來的http請求重用現存的連線,這稱為持久連線。非持久連線會在每個事務結束之後關閉。
並行連線的一些缺點:
- 每個事務都會開啟/關閉一條新的連線,會耗費時間和頻寬
- 由於tcp慢啟動特性的存在,每條新連線的效能都會有所下降
- 可開啟的並行連線數量是有限的
持久連線和並行連線配合使用時最高效的方式,現在很多web應用程式都會開啟少量的並行連線,其中每乙個都是持久連線。持久連線有兩種型別:
- 比較老的http/1.0+ keep-alive連線
- 現代的http/1.1 persistent連線
3. 管道化連線
http/1.1允許在持久連線上可選地使用請求管道。在響應到達之前,可以將多條請求放入佇列,當第一條請求通過網路流向伺服器時,第二條河第三條請求也可以開始傳送了,這樣做可以降低網路的環迴時間,提高效能
4. 復用的連線
交替傳送請求和響應報文(實驗階段)
HTTP權威指南 連線管理(2)
知識點 特點 連線時延的重疊 並行連線讓使用者感覺 更快 了 因為多個元件物件同時出現在螢幕上時,使用者能夠看到載入的進展 http 1.1 以及 http 1.0 的各種增強版本 允許 http 裝置在事務處理結束 之後將 tcp 連線保持在開啟狀態,以便為未來的 http 請求重用現存的連線。在...
HTTP權威指南之連線管理
tcp連線 世界上幾乎所有的 http 通訊都是由 tcp ip 承載的,tcp ip 是全球計算機及網路 裝置都在使用的一種常用的分組交換網路分層協議集。客戶端應用程式可以開啟一 條 tcp ip 連線,連線到可能執行在世界任何地方的伺服器應用程式。一旦連線建 立起來了,在客戶 端和伺服器的計算機...
HTTP連線管理
http通訊是由tcp ip承載的,tcp ip是全球計算機及網路裝置都在使用的一種常用的分組交換網路分層協議集。http連線實際上就是tcp連線和一些使用連線的規則。tcp的資料是通過名為ip分組 或ip資料報 的小資料塊來傳送的。http要傳送一條報文時,會以流的形式將報文資料的內容通過一條開啟...