HTTP相關知識
1.HTTP的概念
超文本傳輸協議(
HTTP
)是用于傳輸諸如HTML
的超媒體文檔的應用層協議。它被設計用于Web
瀏覽器和Web
服務器之間的通信,但它也可以用于其他目的。HTTP
遵循經典的客戶端-服務端模型,客戶端打開一個連接以發出請求,然后等待它收到服務器端響應。HTTP
是無狀態協議,意味著服務器不會在兩個請求之間保留任何數據(狀態)。雖然通常基于TCP / IP
層,但可以在任何可靠的傳輸層上使用
2.URL和URI
-
URI
:uniform resource identifier 統一資源標識符,一種資源的標識,它是一種抽象的資源標識,即可以是相對的,也可以是絕對的。 -
URL
:uniform resource location 統一資源定位符,一用來標識抽象或物理資源的一個緊湊字符串。
3.HTTP報文
HTTP
報文由報文首部、空行、報文主體構成:
其中的空行用于區分報文首部和報文主體內容,是由一個回車符和一個換行符組成的。
無論是請求報文還是響應報文都需要有報文首部,而報文主體有些請求報文是沒有的。而請求報文的一般格式如下:
而響應報文的格式是這樣的:
其中最常見的屬性如下:
-
URL
, 即http
訪問的地址 -
request method
, 報文的請求方式 -
status code
, 狀態碼以及狀態短語 -
Accept Encoding
, 內容編碼 -
Connection
, 連接方式 -
Cookie
, 添加的cookie
內容 -
Host
, 目標主機 -
User-Agent
, 客戶端瀏覽器的相關信息 -
Set-Cookie
, 指定想要在Cookie
中保存的內容
請求方式(request method
)——常見GET
和POST
GET
方法可以用來請求訪問已經被URL
識別的資源。指定的資源經過服務端解析后返回響應的內容。簡單來說,就是請求的資源是文本的話,那么就保持原樣返回。
POST
方法可以用來傳輸實體的主體。
兩者區別:
1.使用目標不同
POST
與GET
都用于獲取信息,但是GET
方式僅僅是查詢,并不對服務器上的內容產生任何作用結果;每次GET
的內容都是相同的。POST
則常用于發送一定的內容進行某些修改操作。
2.大小不同
由于不同的瀏覽器對
URL
的長度大小有一定的字符限制,因此由于GET
方式放在URL
的首部中,具體的大小要依瀏覽器而定。POST
方式則是把內容放在報文內容中,因此只要報文的內容沒有限制,它的大小就沒有限制。
3.安全性不同
上面也說了
GET
是直接添加到URL
后面的,直接就可以在URL
中看到內容。而POST
是放在報文內部的,用戶無法直接看到。
總的來說,GET
用于獲取某個內容,POST
用于提交某種數據請求,從使用場景來看,一般用戶注冊的內容是私密的,應該使用POST
方式來保持私密,而當需要查詢某個內容時,需要快速響應,則使用GET
。
常見status code狀態碼
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
)
報文首部總結
4.HTTP方法
HTTP
支持幾種不同的請求命令,這些命令被稱為HTTP
方法(HTTP method
)。每 條HTTP
請求報文都包含一個方法。這個方法會告訴服務器要執行什么動作(獲取 一個Web
頁面、運行一個網關程序、刪除一個文件等)。
下表是一些常見的HTTP
方法:
PUT傳輸文件
PUT
方法用于傳輸文件,就像FTP
協議的上傳一樣,要求在請求報文的主題中包含文件內容,然后保存到請求URI
指定的位置。由于PUT
方法不帶驗證機制,任何人都可以任何人都可以上傳文件,存在安全性問題,因此一般的web
網站不適用該方法。
DELETE刪除文件
DELETE
方法用來刪除文件,是與put
相反的方法,DELETE
方法按照請求url
刪除指定的資源。其本質和PUT
方法一樣不帶驗證機制,所以建議少用DELETE
方法。
HEAD獲取報文首部
HEAD
和GET
方法一樣,只是不返回報文主體部分,通常用于確認url
的有效性及資源更新的日期時間等。
5.HTTPS的概念
HTTPS
(全稱:Hyper Text Transfer Protocol over Secure Socket Layer
),是以安全為目標的HTTP
通道,簡單來說就是是HTTP
的安全版本,即在HTTP
下加入SSL
層,HTTPS
的安全基石是SSL
,因此加密的詳細內容就需要SSL
。
由于HTTP
有以下幾個缺點:
傳輸的時候使用明文,這顯然會被不法者截取干一些見不得人的勾當。
沒有認證機制,這樣我們就可以偽造一些HTTP
訪問,這顯然會造成一些困擾。比如Jmeter
就是典型的例子,偽造一大堆的HTTP URL
然后壓力測試,這也就是DOS
攻擊的一種。
無法驗證報文的完整性,比如一個HTTP
的報文已經被不法者截取并且篡改,而服務器端卻無法驗證。
HTTP與HTTPS的區別
正是由于以上這些缺點,HTTPS
作出了以下一些改變:
-
HTTP
是明文傳輸,HTTPS
通過SSL\TLS
進行了加密; -
HTTP
的端口號是80
,HTTPS
是443
; -
HTTPS
需要到CA
申請證書,一般免費證書很少,需要交費; -
HTTP
的連接很簡單,是無狀態的。而HTTPS
協議則是由SSL+HTTP
; 協議構建的可進行加密傳輸、身份認證的網絡協議,比HTTP
協議安全;
HTTPS
的缺點:
通信的速度變慢,由于需要加密,一個握手就多了好幾個往返;
對用戶的機器負載的增加。
補充:HTTP協議與TCP協議
TCP
協議對應于傳輸層,而HTTP
協議對應于應用層,從本質上來說,二者沒有可比性。Http
協議是建立在TCP
協議基礎之上的,當瀏覽器需要從服務器獲取網頁數據的時候,會發出一次Http
請求。Http
會通過TCP
建立起一個到服務器的連接通道,當本次請求需要的數據完畢后,Http
會立即將TCP
連接斷開,這個過程是很短的。所以Http
連接是一種短連接,是一種無狀態的連接。所謂的無狀態,是指瀏覽器每次向服務器發起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。如果是一個連接的話,服務器進程中就能保持住這個連接并且在內存中記住一些信息狀態。而每次請求結束后,連接就關閉,相關的內容就釋放了,所以記不住任何狀態,成為無狀態連接。
6.TCP與UDP的區別
-
TCP
面向連接(如撥打電話要先撥號建立連接);UDP
是無連接的,即發送數據之前不需要建立連接; -
TCP
提供可靠的服務。即通過TCP連接傳送的數據,無差錯,不重復,且按序到達;UDP
盡最大努力交付,即不保證可靠交付; -
TCP
面向字節流,實際上是把TCP
數據看成一連串無結構的字節流;UDP
是面向報文的,UDP
沒有擁塞控制,因此網絡上出現擁塞不會使源主機的發送效率降低(對實時應用很有用,如IP電話,實時視頻會議等); - 每一條
TCP
連接只能是點到點;UDP
支持一對一,一對多,多對一,多對多的交互通信; -
TCP
的首部開銷20
字節;UDP
的首部開銷小,只有8
個字節; -
TCP
的邏輯通信信道是全雙工的可靠信道;UDP
則是不可靠信道;
7.流媒體協議:
RTP、RTCP、RTSP、MMS、HLS、HTTP progressive streaming
當前在internet
上傳送音頻和視頻等信息主要有兩種方式:
下載,完整下載一個視頻,再去播放
流式傳輸,如優酷、愛奇藝等視頻網址
作用:
RTP
位于傳輸層(通常是UDP
)之上,應用程序之下,實時語音、視頻數據經過模數轉換和壓縮編碼處理后,先送給RTP
封裝成為RTP
數據單元,RTP
數據單元被封裝為UDP
數據報,然后再向下遞交給IP
封裝為IP
數據包。這么說RTP
是沒有保證傳輸成功的,要保證成功,就要用到RTCP
,RTCP
消息含有已發送數據的丟包統計和網絡擁塞等信息,服務器可以利用這些信息動態的改變傳輸速率,甚至改變凈荷的類型。RTCP
消息也被封裝為UDP
數據報進行傳輸。
部分參考:
https://juejin.im/post/5afad7f16fb9a07abf72ac30?utm_medium=fe&utm_source=weixinqun