是個 url,叫作統一資源定位符。之所以叫統一,是因為它是有格式的。http 稱為協議,www.163.com 是乙個網域名稱,表示網際網路上的乙個位置。有的 url 會有更詳細的位置標識,例如 /index.html 。正是因為這個東西是統一的,所以當你把這樣乙個字串輸入到瀏覽器的框裡的時候,瀏覽器才知道如何進行統一處理。
http 的報文大概分為三大部分。第一部分是請求行,第二部分是請求的首部,第三部分才是請求的正文實體。
1、請求行
對於訪問網頁來講,最常用的型別就是get。顧名思義,get 就是去伺服器獲取一些資源。對於訪問網頁來講,要獲取的資源往往是乙個頁面。其實也有很多其他的格式,比如說返回乙個json 字串,到底要返回什麼,是由伺服器端的實現決定的。
例如,在雲計算中,如果我們的伺服器端要提供乙個基於 http 協議的 api,獲取所有雲主機的列表,這就會使用 get 方法得到,返回的可能是乙個 json 字串。字串裡面是乙個列表,列表裡面是一項的雲主機的資訊。
另外一種型別叫做post。它需要主動告訴服務端一些資訊,而非獲取。要告訴服務端什麼呢?一般會放在正文裡面。正文可以有各種各樣的格式。常見的格式也是 json。
例如,我們下一節要講的支付場景,客戶端就需要把「我是誰?我要支付多少?我要買啥?」告訴伺服器,這就需要通過 post 方法。
例如,雲主機已經建立好了,我想對這個雲主機打乙個標籤,說明這個雲主機是生產環境的,另外乙個雲主機是測試環境的。那怎麼修改這個標籤呢?往往就是用 put 方法。
再有一種常見的就是delete。這個顧名思義就是用來刪除資源的。例如,我們要刪除乙個雲主機,就會呼叫 delete 方法。
2、首部字段
1、請求首部字段
accept 使用者**可處理的**型別
accept-charset 優先的字符集
accept-encoding 優先的內容編碼
accept-language 優先的語言(自然語言)
authorization web認證資訊
expect 期待伺服器的特定行為
from 使用者的電子郵箱位址
host 請求資源所在伺服器
if-match 比較實體標記(etag)
if-modified-since 比較資源的更新時間
if-none-match 比較實體標記(與 if-match 相反)
if-range 資源未更新時傳送實體 byte 的範圍請求
if-unmodified-since 比較資源的更新時間(與if-modified-since相反)
max-forwards 最大傳輸逐跳數
proxy-authorization **伺服器要求客戶端的認證資訊
range 實體的位元組範圍請求
referer 對請求中 uri 的原始獲取方
te 傳輸編碼的優先順序
user-agent http 客戶端程式的資訊
2、響應首部字段
accept-ranges 是否接受位元組範圍請求
age 推算資源建立經過時間
etag 資源的匹配資訊
location 令客戶端重定向至指定uri
proxy-authenticate **伺服器對客戶端的認證資訊
retry-after 對再次發起請求的時機要求
server http 伺服器的安裝資訊
vary **伺服器快取的管理資訊
www-authenticate 伺服器對客戶端的認證資訊
3、實體首部字段
allow 資源可支援的http方法
content-encoding 實體主體適用的編碼方式
content-language 實體主體的自然語言
content-length 實體主體的大小(單位:位元組)
content-location 替代對應資源的uri
content-md5 實體主體的報文摘要
content-range 實體主體的位置範圍
content-type 實體主體的**型別
expires 實體主體過期的日期時間
last-modified 資源的最後修改日期時間
http 協議是基於 tcp 協議的,所以它使用面向連線的方式傳送請求,通過 stream 二進位製流的方式傳給對方。當然,到了 tcp 層,它會把二進位製流變成乙個的報文段傳送給伺服器。
在傳送給每個報文段的時候,都需要對方有乙個回應 ack,來保證報文可靠地到達了對方。如果沒有回應,那麼 tcp 這一層會進行重新傳輸,直到可以到達。同乙個包有可能被傳了好多次,但是 http 這一層不需要知道這一點,因為是 tcp 這一層在埋頭苦幹。
tcp 層傳送每乙個報文的時候,都需要加上自己的位址(即源位址)和它想要去的地方(即目標位址),將這兩個資訊放到 ip 頭裡面,交給 ip 層進行傳輸。
ip 層需要檢視目標位址和自己是否是在同乙個區域網。如果是,就傳送 arp 協議來請求這個目標位址對應的 mac 位址,然後將源 mac 和目標 mac 放入 mac 頭,傳送出去即可;如果不在同乙個區域網,就需要傳送到閘道器,還要需要傳送 arp 協議,來獲取閘道器的 mac 位址,然後將源 mac 和閘道器 mac 放入 mac 頭,傳送出去。
這樣路由器一跳一跳終於到達目標的區域網。這個時候,最後一跳的路由器能夠發現,目標位址就在自己的某乙個出口的區域網上。於是,在這個區域網上傳送 arp,獲得這個目標位址的mac 位址,將包發出去。
目標的機器發現 mac 位址符合,就將包收起來;發現 ip 位址符合,根據 ip 頭中協議項,知道自己上一層是 tcp 協議,於是解析 tcp 的頭,裡面有序列號,需要看一看這個序列包是不是我要的,如果是就放入快取中然後返回乙個 ack,如果不是就丟棄。
tcp 頭裡面還有埠號,http 的伺服器正在監聽這個埠號。於是,目標機器自然知道是http 伺服器這個程序想要這個包,於是將包發給 http 伺服器。http 伺服器的程序看到,原來這個請求是要訪問乙個網頁,於是就把這個網頁發給客戶端。
狀態碼會反應 http 請求的結果。「200」意味著大吉大利;而我們最不想見的,就是「404」,也就是「服務端無法響應這個請求」。然後,短語會大概說一下原因。
接下來是返回首部的key value。這裡面,retry-after表示,告訴客戶端應該在多長時間以後再次嘗試一下。「503 錯誤」是說「服務暫時不再和這個值配合使用」。在返回的頭部裡面也會有content-type,表示返回的是 html,還是 json。
構造好了返回的 http 報文,接下來就是把這個報文傳送出去。還是交給 socket 去傳送,還是交給 tcp 層,讓 tcp 層將返回的 html,也分成乙個個小的段,並且保證每個段都可靠到達。
這些段加上 tcp 頭後會交給 ip 層,然後把剛才的傳送過程反向走一遍。雖然兩次不一定走相同的路徑,但是邏輯過程是一樣的,一直到達客戶端。
客戶端發現 mac 位址符合、ip 位址符合,於是就會交給 tcp 層。根據序列號看是不是自己要的報文段,如果是,則會根據 tcp 頭中的埠號,發給相應的程序。這個程序就是瀏覽器,瀏覽器作為客戶端也在監聽某個埠。
當瀏覽器拿到了 http 的報文。發現返回「200」,一切正常,於是就從正文中將 html 拿出來。html 是乙個標準的網頁格式。瀏覽器只要根據這個格式,展示出乙個絢麗多彩的網頁。這就是乙個正常的 http 請求和返回的完整過程。
極客時間 應用層 P2P好玩
ftp ftp也即檔案傳輸協議。ftp 採用兩個 tcp 連線來傳輸乙個檔案。控制連線 伺服器以被動的方式,開啟眾所周知用於 ftp 的埠 21,客戶端則主動發起連線。該連線將命令從客戶端傳給伺服器,並傳回伺服器的應答。常用的命令有 list 獲取檔案目錄 reter 取乙個檔案 store 存乙個...
應用層學習筆記二 Web和HTTP
http hypertext transfer protocal 超文字傳輸協議 http由兩個程式實現 乙個客戶端程式和乙個伺服器程式,執行在不同的端系統中,通過交換http報文進行會話。http定義了報文結構和報文交換的方式。一些術語 web瀏覽器 實現了http的客戶端 web伺服器 實現了h...
應用層(HTTP協議)
應用層 負責應用程式之間的溝通 結構化傳輸協議 方便資料式的組織與解析 1.作用 傳輸檔案,網頁 採用tcp協議 tcp協議詳解 2.url 統一資源定位符 相對路徑是根目錄下的相對路徑 3.urlencode 編碼 和urldecode 解碼 乙個字元8位,前4位 編成1位,後4位 編成1位,再加...