一. OSI七層模型
從上圖中可以清晰的看到OSI七層模型的分層情況,它是從最上面的應用層逐級往下的,下面對它們各自的作用做一概述:
- 第七層:應用層,提供為應用軟件而設的界面,以設置與另一應用軟件之間的通信,我們這里所討論到的HTTP協議也在該層,同時,應用層也想第六層表示層發出請求。
- 第六層:表示層,把數據轉換為能與接受者的系統格式兼容并適合傳輸的格式,該層已被棄用,應用層中向HTTP、FTP、Telnet等協議有類似功能,傳輸層也有協議具備該功能。
- 第五層:會話層,負責在數據傳輸中設置和維護電腦網絡中服務端和客戶端的通信連接,該層也被棄用,因為在應用層的HTTP和一些其它協議中也具備著類似的功能。
- 第四層:傳輸層,該層的協議為應用進程提供端到端的通信服務,我們經常提到的TCP(傳輸控制協議)就處于該層。
- 第三層:網絡層,該層提供路由和尋址功能,為兩端系統互聯提供最佳路徑,此外,該層還具備一定的擁塞控制和流量控制的能力,該層的協議是由IP(Internet Protocol 網際協議)規定和實現的,所以也被稱為IP層。
- 第二層:數據鏈路層,它在兩個網絡實體之間提供數據鏈路的創建、維持和釋放管理,聲名遠播的異步傳輸模式和IEEE 802.2協議都位于該層。
- 第一層:物理層,它是OSI七層模型中的最底層,它存在的意義是為數據段提供傳送數據通路,確保原始數據可在各種物理媒體上傳輸,常見物理層設備包括網卡,光纖、串口和并口等。局域網和廣域網皆屬于第1、2層。
二、 HTTP的工作原理
- 客戶端對用戶輸入的URI內容進行通過DNS協議查詢到對應的IP。
- 客戶端通過查詢到的IP、用戶提供的和默認的其他URI內容形成請求報文,向服務器端發送請求。
- 中間可能會經過一些代理服務器、網關和隧道,還有一些緩存服務器會將源服務器的部分內容進行緩存,當它在確定源服務器內容未進行更新,且客戶端沒有特定要求時,會直接將此內容向客戶端進行響應。
- 服務器端在接收到客戶端的請求報文后,根據HTTP方法,做出相應的響應,形成響應報文。
- 當需要使用Cookie時,客戶端第一次發送請求時,服務器就會生成Cookie,并將Cookie添加到響應中,返回給客戶端,客戶端就會將Cookie保存下來,當下一次發送請求時,客戶端所發送的請求中就會添加Cookie后再進行發送,這時服務器就會知道是誰在發送,并向客戶端返回相應的響應報文。
- 當客戶端接收到響應報文后,會將響應內容進行解析,呈現在網頁上。
三、URI的格式和常見的協議
常見的協議包括本文所講的HTTP,還有譬如FTP、mailto、Telnet,他們都是TCP/IP的子集。
IP查詢有DNS協議,數據鏈層還有異步傳輸模式和IEEE 802.2協議等。
四、 HTTP和服務器交互的方法
- GET:向服務器獲取資源,請求訪問已被URI識別的資源。
- POST:傳輸實體主體,返回服務器端接收數據傳回的結果。
- PUT:傳輸文件,要求將請求報文主題中包含文件內容,并將該文件內容保存到請求URI制定的位置,一般而言,服務器為了安全起見,一般不會使用該方法。
- DELETE:刪除文件,要求將URI中的指定資源刪除,和PUT方法一樣,服務器一般也不會使用該方法。
- HEAD:它也是向服務器獲取資源,但與GET方法不同的是,它不返回報文主題部分。
- OPTIONS:詢問支持的方法,服務器會相應它所支持的所有方法。
- TRACE:讓WEB服務器端將之前的請求通信環會給客戶端的方法。
- CONNECT:要求用隧道協議連接代理,隧道可按要求建立起一條魚其他服務器的通信線路,并使用SSL等加密手段,讓客戶端和服務器端進行安全的通信。
此外,還有LINK和UNLINK方法用來建立和斷開資源之間的聯系,在HTTP1.1中已被廢棄。
五、常見狀態碼
1.一般來講,1XX代表接收的請求正在處理,這個狀態碼一般是看不到的,2XX代表請求正常處理完畢,常見的包括200、204、206等,3XX標識需要進行附加操作以完成請求,常見301、302、303、304、307等,4XX代表服務器無法處理請求客戶端錯誤,常見400、403、404等,5XX表示服務器處理請求錯誤,常見500、502、503等。
2.2XX:
200:OK 表示客戶端發送的請求在服務器端被正常處理了。
204:No Content 表示服務器端正常處理了請求,但是返回的響應報文中沒有主體部分
206:Partial Content 該狀態碼表示客戶端進行了部分請求,服務器端完成了這個部分請求,在相應報文中,有Content-Range指定范圍的實體內容。
3.3XX:
301:Moved Prmanently 永久性重定向,表示資源已經被永久的分配到了一個新的URI上了。
302:Found 臨時性重定向,表示資源已經被分配了新的URI,但下次請求時可能還會使用原來的URI。
303:See Other 表示請求的資源存在著另一個URI,應使用GET方法定向獲取請求的資源。
304:Not Modified 表示服務器端已經確定,本地緩存是最新內容,使用本地緩存。
307:Temporary Redirect 臨時重定向,和302含義相同,和302不同,它會遵守瀏覽器標準,不會從POST變為GET。
4.4XX:
400:Bad Request 表示請求報文中存在語法錯誤。
401:Unauthorized 表示請求需要有通過HTTP認證的認證信息,若之前已經有過一次請求,則表示認證失敗。
403:forbidden 表示請求被服務器拒絕,客戶端可能不具備訪問該資源的權限信息。
404:Not Found 表示服務器上找不到該資源,此外,該狀態碼也可能出現在服務器拒絕訪問時。
5.5XX
500:Internal Server Error 服務器錯誤,表示可能服務器在執行請求時發生了錯誤。
502:Bad Gateway 無效網關,服務器當前鏈接太多,導致服務器無法給出正常的相應。
503:Service Unavailable 服務器處于超負載或者正在進行停機維護的狀態,無法處理請求。
六、報文的組成部分
七、請求頭的格式和作用
客戶端在向服務器端發送HTTP請求時,必須指明請求類型,一般包括HTTP方法、URI以及HTTP版本。
此外,客戶端會根據需要向服務器發送一些其它的請求頭:
上圖為某個頁面的請求頭,其中包括:
- Accept:設置瀏覽器可接受的MIME類型 以上為通配
- Accept-Encoding:設置瀏覽器能夠解碼的數據編碼方式 以上gzip、defalate、sdch
- Accept-Language:設置瀏覽器所支持的語言 以上為中文,q則表示權重
- Connection:表示是否需要持久連接 以上為需要
- Host:初始URI中的主機和端口
- If-Modified-Since:為資源指定一個日期,只有在這個日期之后進行訪問才需要重新進行請求,否則返回304狀態碼,使用緩存
- Referer:包含一個URI,用戶從該URI觸發訪問當前請求頁面。
- User-Agent:代表用戶現在正在使用的瀏覽器類型,以便服務器端進行資源的選擇。
此外,請求頭中還可以包括一些其它內容,如Content-length(請求消息正文長度)、Cookie、From(請求發送者的E-mail,一般不會在瀏覽器中用到)和Pragma(若指定no-cache,則表示無論是否有緩存,都不能使用,必須從服務器端重新進行數據的請求,才能使用)等。
八、首部的格式和作用
以上為一個報文的首部,它的前兩項為請求首部Request URL(請求的URL)和Request Method(方法),后兩項為相應的首部Status Code(狀態碼)和Remote Address(遠程地址)。
響應首部:
在以上響應首部中,規定了緩存控制的方式,指明資源創建的時間,服務器,狀態碼,Alt-Svc
(HTTP Alternative Services >HTTP 替代服務)和一些x-開頭的非標準參數。
九、主體的作用
報文主體分為請求主體和響應主體:
請求主體:一般為請求數據。
響應主體:響應主體是可選的,當使用HEAD方法進行請求時,沒有主體部分。
一般響應主體包括所有類型的數據。
十、簡述瀏覽器緩存是如何控制的(可選 難度*****)
在HTTP協議中,定義3種緩存機制:
- Freshness:允許客戶端無需檢查原始服務器上的內容就緩存當前相應,其對應字段常用Expires和Cache-Control
- Validation:允許在當前緩存內容”過期”后檢查原始內容是否已經更新,常用字段有Last-Modified和ETag。
- Invalidation:允許在訪問同一個資源時使之前的緩存內容失效,比如使用POST、PUT、DELETE方法請求數據,就會讓之前的數據失效。
當瀏覽器發送請求時,若請求首部中設置了pragma:no-cache,則默認所有的中間服務器不反回緩存的資源。
Cache-Control字段:
- no-cache指令:不緩存過期資源,該指令的作用是防止從緩存中返回過期資源。
- no-store指令:該指令規定緩存不能再本地存儲請求或相應的任意部分。
- max-age指令:該指令所指定的時間和緩存資源的緩存事件進行比對,若指令所指定的時間更大,則表示客戶端能夠接受緩存的資源。
- min-fresh指令:要求緩存服務器返回至少還未過指定時間的緩存資源。
- max-stale指令:指定資源過期后,在設定時間內仍可使用,若沒有指定時間,則一直可用。
- only-if-cached指令:要求緩存服務器不用重新加載,也不用確認,直接返回緩存,若緩存無響應,則返回狀態碼504:Gateway Timeout
- must-revalidate指令:要求向源服務器確定即將返回的相應緩存是否有效,且會忽略max-stale指令。
- proxy-revalidate指令:要求所有的緩存服務器在接受到客服端帶有該指令的請求返回相應之前,必須再次驗證緩存的有效性。
?Expires字段:
- 該字段會設置一個明確的時間,告訴客戶端相應的內容在指定的時間之前都不會產生變化。瀏覽器因此也不需要請求文檔內容,而直接從緩存內讀取數據,該字段存在著缺點,若客戶端和服務端時區不同可能造成時間不同,如果服務器在時間內內容發生改變,無法向客戶端發出通知。該字段在HTTP1.1中優先級較低,一般會優先處理max-age
條件請求字段Last-Modified和If-Modified-Since:
- Last-Modified是服務器端用以告訴客戶端在數據最后的更新時間,客戶端根據這個時間和原有資源進行比對,若在最后更新時間之后的數據,則可以直接使用,否則需要獲取。
- If-Modified-Since是客戶端去想服務器詢問在這個時間之后數據資源是否改變,若沒有改變,則可以直接使用緩存,否則重新進行數據的請求。
Connection字段:
- 控制不在轉發給代理的首部字段,將不再轉發的指定作為指令寫入Connection中。
- 管理持久連接:keep-alive表示持久連接,close表示關閉持久連接。
十一、圖中的參數的意思
General部分,起始行,描述報文的基本信息
Request URL 請求的統一資源定位符 方法為PUT 狀態碼:200 表示請求正常返回 Remote Address表示遠程服務器的地址
Response Headers 響應首部部分
連接為持久連接,Content-Length表示HTTP消息實體的傳輸長度為12
Content-Type表示實體主體的媒體類型 Date表示創建報文的時間
Server表示服務器類型和版本 X-Powered-By為非標準字段,表示PHP版本的信息
Request-Headers 請求首部
Accept表示用戶代理可處理的媒體類型
Accept-Encoding表示優先的內容分編碼
Accept-Language表示接受的語言
Connection、Content-Length和Content-Type為實體首部字段,和響應頭中意思相同
Cookie表示用戶的Cookie Host表示請求資源所在的服務器,Origin表示源服務器
Referer表示對請求中URI的原始獲取方 User-Agent表示HTTP客戶端信息。
X-Resquested-With:發送請求報文的方式
From Data 上傳文件的信息
article 資源的相關信息
本教程版權歸本人和饑人谷所有