超文本傳輸協議(HTTP
)是用於傳輸諸如HTML
的超媒體文檔的應用層協議。它被設計用於Web
瀏覽器和Web
服務器之間的通訊,但它也能夠用於其餘目的。HTTP
遵循經典的客戶端-服務端模型,客戶端打開一個鏈接以發出請求,而後等待它收到服務器端響應。HTTP
是無狀態協議,意味着服務器不會在兩個請求之間保留任何數據(狀態)。雖然一般基於TCP / IP
層,但能夠在任何可靠的傳輸層上使用
URI
:uniform resource identifier 統一資源標識符,一種資源的標識,它是一種抽象的資源標識,便可以是相對的,也能夠是絕對的。URL
:uniform resource location 統一資源定位符,一用來標識抽象或物理資源的一個緊湊字符串。HTTP
報文由報文首部、空行、報文主體構成:web
其中的空行用於區分報文首部和報文主體內容,是由一個回車符和一個換行符組成的。
不管是請求報文仍是響應報文都須要有報文首部,而報文主體有些請求報文是沒有的。而請求報文的通常格式以下:瀏覽器
而響應報文的格式是這樣的:安全
其中最多見的屬性以下:服務器
URL
, 即http
訪問的地址request method
, 報文的請求方式status code
, 狀態碼以及狀態短語Accept Encoding
, 內容編碼Connection
, 鏈接方式Cookie
, 添加的cookie
內容Host
, 目標主機User-Agent
, 客戶端瀏覽器的相關信息Set-Cookie
, 指定想要在Cookie
中保存的內容
請求方式(request method
)——常見GET
和POST
cookie
GET
方法能夠用來請求訪問已經被URL
識別的資源。指定的資源通過服務端解析後返回響應的內容。簡單來講,就是請求的資源是文本的話,那麼就保持原樣返回。
POST
方法能夠用來傳輸實體的主體。網絡
二者區別:ide
POST
與GET
都用於獲取信息,可是GET
方式僅僅是查詢,並不對服務器上的內容產生任何做用結果;每次GET
的內容都是相同的。POST
則經常使用於發送必定的內容進行某些修改操做。
因爲不一樣的瀏覽器對URL
的長度大小有必定的字符限制,所以因爲GET
方式放在URL
的首部中,具體的大小要依瀏覽器而定。POST
方式則是把內容放在報文內容中,所以只要報文的內容沒有限制,它的大小就沒有限制。
上面也說了GET
是直接添加到URL
後面的,直接就能夠在URL
中看到內容。而POST
是放在報文內部的,用戶沒法直接看到。
總的來講,GET
用於獲取某個內容,POST
用於提交某種數據請求,從使用場景來看,通常用戶註冊的內容是私密的,應該使用POST
方式來保持私密,而當須要查詢某個內容時,須要快速響應,則使用GET
。post
200
一般的成功 OK
GET
:請求的對應資源會做爲響應返回。響應將包含描述或操做的結果。 POST
:返回處理對應請求的結果測試
204
成功處理請求,沒有返回任何內容 No Content
表示服務器接收到的請求已經處理完畢,可是服務器不須要返回響應。好比,客戶端是瀏覽器的話,那麼瀏覽器顯示的頁面不會發生更新。網站
206
Partial Content
成功處理了部分GET請求
301
Moved Permanently
請求的網頁已永久移動到新位置,永久性重定向
302
Found
網站臨時性重定向,暫時不能訪問(備案、被查)
303
See Other
該狀態碼錶示因爲請求對應的資源存在另外一個URI
,並指定必須使用GET
方法定向獲取請求的資源。和302
不一樣的是,302
是不會改變上次的請求方法
304
Not Modified
訪問不了,並返回和上次同樣的話,表示資源未被修改過,仍是和上次訪問時同樣。
307
Temporary Redirect
臨時重定向,和302
、303
相似,不一樣的是,不會指定客戶端要用什麼樣的方法請求,
400
Bad Request
表示客戶端中存在語法錯誤,致使服務器沒法理解該請求。客戶端須要修改請求的內容後再次發送請求。
401
Unauthorized
即用戶沒有必要的憑據。該狀態碼錶示當前請求須要用戶驗證。
403
Forbidden
服務器已經理解請求,可是拒絕執行它。
404
Not Found
服務器找不到請求的網頁。
500
Internal Server Error
服務器遇到錯誤,沒法完成請求。
503
Service Unavailable
因爲臨時的服務器維護或者過載,服務器當前沒法處理請求。這個情況是暫時的.
內容編碼 Accept Encoding
因爲有些報文的內容會過大,爲了減小傳輸時間,HTTP
會採起一些壓縮的措施,例如上面的報文信息中,Accept-Encoding
就定義了內容編碼的格式gzip
。
總的來講內容編碼的格式有如下幾種:gzip
:GNU
壓縮格式compress
:UNIX
系統的標準壓縮格式deflate
:是一種同時使用了LZ77
和哈夫曼編碼的無損失壓縮格式identity
:不進行壓縮
持久化connection
正常發送HTTP
時,咱們須要創建TCP
的鏈接,而後再發送報文:
若是每次都要發送HTTP
報文都須要經歷上面的拿過過程,無疑將會耗費不少時間在創建和斷開鏈接的過程當中,所以HTTP
使用了connection
屬性,用於指定鏈接的方式,噹噹設置成keep-alive
時,就會創建一條持久化的鏈接。這樣就不須要每次都創建鏈接在中斷鏈接:
(HTTP1.1
中connection
默認開啓keep-alive
)
報文首部總結
HTTP
支持幾種不一樣的請求命令,這些命令被稱爲HTTP
方法(HTTP method
)。每 條HTTP
請求報文都包含一個方法。這個方法會告訴服務器要執行什麼動做(獲取 一個Web
頁面、運行一個網關程序、刪除一個文件等)。
下表是一些常見的HTTP
方法:
PUT
方法用於傳輸文件,就像FTP
協議的上傳同樣,要求在請求報文的主題中包含文件內容,而後保存到請求URI
指定的位置。因爲PUT
方法不帶驗證機制,任何人均可以任何人均可以上傳文件,存在安全性問題,所以通常的web
網站不適用該方法。
DELETE
方法用來刪除文件,是與put
相反的方法,DELETE
方法按照請求url
刪除指定的資源。其本質和PUT
方法同樣不帶驗證機制,因此建議少用DELETE
方法。
HEAD
和GET
方法同樣,只是不返回報文主體部分,一般用於確認url
的有效性及資源更新的日期時間等。
HTTPS
(全稱:Hyper Text Transfer Protocol over Secure Socket Layer
),是以安全爲目標的HTTP
通道,簡單來講就是是HTTP
的安全版本,即在HTTP
下加入SSL
層,HTTPS
的安全基石是SSL
,所以加密的詳細內容就須要SSL
。
因爲HTTP
有如下幾個缺點:
傳輸的時候使用明文,這顯然會被不法者截取幹一些見不得人的勾當。
沒有認證機制,這樣咱們就能夠僞造一些HTTP
訪問,這顯然會形成一些困擾。好比Jmeter
就是典型的例子,僞造一大堆的HTTP URL
而後壓力測試,這也就是DOS
攻擊的一種。
沒法驗證報文的完整性,好比一個HTTP
的報文已經被不法者截取而且篡改,而服務器端卻沒法驗證。
正是因爲以上這些缺點,HTTPS
做出瞭如下一些改變:
HTTP
是明文傳輸,HTTPS
經過 SSL\TLS
進行了加密;HTTP
的端口號是 80
,HTTPS
是 443
;HTTPS
須要到 CA
申請證書,通常免費證書不多,須要交費;HTTP
的鏈接很簡單,是無狀態的。而 HTTPS
協議則是由 SSL+HTTP
; 協議構建的可進行加密傳輸、身份認證的網絡協議,比 HTTP
協議安全;HTTPS
的缺點:
通訊的速度變慢,因爲須要加密,一個握手就多了好幾個往返;
對用戶的機器負載的增長。
TCP
協議對應於傳輸層,而HTTP
協議對應於應用層,從本質上來講,兩者沒有可比性。Http
協議是創建在TCP
協議基礎之上的,當瀏覽器須要從服務器獲取網頁數據的時候,會發出一次Http
請求。Http
會經過TCP
創建起一個到服務器的鏈接通道,當本次請求須要的數據完畢後,Http
會當即將TCP
鏈接斷開,這個過程是很短的。因此Http
鏈接是一種短鏈接,是一種無狀態的鏈接。所謂的無狀態,是指瀏覽器每次向服務器發起請求的時候,不是經過一個鏈接,而是每次都創建一個新的鏈接。若是是一個鏈接的話,服務器進程中就能保持住這個鏈接而且在內存中記住一些信息狀態。而每次請求結束後,鏈接就關閉,相關的內容就釋放了,因此記不住任何狀態,成爲無狀態鏈接。
TCP
面向鏈接(如撥打電話要先撥號創建鏈接);UDP
是無鏈接的,即發送數據以前不須要創建鏈接;TCP
提供可靠的服務。即經過TCP鏈接傳送的數據,無差錯,不重複,且按序到達;UDP
盡最大努力交付,即不保證可靠交付;TCP
面向字節流,其實是把TCP
數據當作一連串無結構的字節流;UDP
是面向報文的,UDP
沒有擁塞控制,所以網絡上出現擁塞不會使源主機的發送效率下降(對實時應用頗有用,如IP電話,實時視頻會議等);TCP
鏈接只能是點到點;UDP
支持一對一,一對多,多對一,多對多的交互通訊;TCP
的首部開銷20
字節;UDP
的首部開銷小,只有8
個字節;TCP
的邏輯通訊信道是全雙工的可靠信道;UDP
則是不可靠信道;RTP、RTCP、RTSP、MMS、HLS、HTTP progressive streaming
當前在internet
上傳送音頻和視頻等信息主要有兩種方式:
下載,完整下載一個視頻,再去播放
流式傳輸,如優酷、愛奇藝等視頻網址
做用:RTP
位於傳輸層(一般是UDP
)之上,應用程序之下,實時語音、視頻數據通過模數轉換和壓縮編碼處理後,先送給RTP
封裝成爲RTP
數據單元,RTP
數據單元被封裝爲UDP
數據報,而後再向下遞交給IP
封裝爲IP
數據包。這麼說RTP
是沒有保證傳輸成功的,要保證成功,就要用到RTCP
,RTCP
消息含有已發送數據的丟包統計和網絡擁塞等信息,服務器能夠利用這些信息動態的改變傳輸速率,甚至改變淨荷的類型。RTCP
消息也被封裝爲UDP
數據報進行傳輸。