一、http協議
1、為何要學http協議?
用戶用瀏覽器訪問網頁,默認走的都是http協議,所以要深入研究web層,必須掌握http協議
2、什么是http協議
1、全稱Hyper Text Transfer Protocol(超文本傳輸協議)
### 一個請求得到一個響應包
普通文本:文件內存放的是一些人類認識的文字符號(漢字、英語、阿拉伯數字)
超級文本:除了普通文本內容之外,還有視頻、圖片、語音、超鏈接
超文本包含:html文件、css、js、圖片、視頻、語音
http協議都能傳輸上述內容,所以說http協議是專用于傳輸超文本的協議
2、http主要用于B/S架構
3、http是基于tcp協議的
強調:基于http協議發包之前,必須先建立tcp協議的雙向通路
http協議的發展史
網景瀏覽器(萬能客戶端)------》各種各樣的服務端
http0.9
請求方法:只支持GET方法
請求頭:不支持
響應信息:只支持純文本,不支持圖片
無連接/短連接/非持久連接:利用完tcp連接之后會立即回收,所以無連接指的不是說沒有連接,而是說沒有持久連接/長連接
http協議通信,先建立tcp連接,然后客戶端發請求包,服務端收到后發送響應包,服務端一旦發送完響應包之后,服務端會立即主動斷開tcp連接,下次http通信還需要重新建立tcp連接
無狀態:(一個http協議的請求無法標識自己的身份)
http無法保存狀態,比如登錄狀態----登錄之后再次發送的請求無法識別身份
總結:(0.9的時代,下面兩個問題都不是問題)
無連接/短連接/非持久連接---->引發的問題
同一個用戶在短期內訪問多次服務端,那大量的時候都會消耗在重復創建tcp連接上
在高并發場景下,對服務端是非常大的消耗,客戶端的訪問速度也會非常的慢
無狀態:一個http協議的請求無法標識自己的身份---》引發的問題
如果是登錄狀態的話,http協議無法保存,那意味著每次請求都需要重新輸出一次賬號 密碼來認證
http1.0
請求方法:支持GET(查)、POST(改)、DELETE(刪)、PUT(增)
請求頭:支持
響應信息:支持超文本
支持緩存
無連接/短連接/非持久連接
問題:
同一個用戶在短期內訪問多次服務端,那大量的時候都會消耗在重復創建tcp連接上
在高并發場景下,對服務端是非常大的消耗,客戶端的訪問速度也會非常的慢
目標:
同一個用戶在短期內訪問多次服務端,不要重復建立tcp連接,而是能夠共用一個tcp鏈接
解決方案:支持持久連接/長連接 keep-alive
前提:
發送完http響應包之后,服務端立即斷tcp連接,這是服務端的默認行為
要改變這種默認行為,要客戶端通知服務端才行
實現:
客戶端在發送http的請求時,需要再請求頭里帶上connection: keep-alive這個參數
服務端的keepalive_timeout設置要大于0
服務端收到后讀取該參數,服務端會保持與這一個客戶端tcp連接一段時間,響應時也會響應頭里放connection: keep-alive這個參數
該tcp會保持一段時間 直到達到服務端設置的keepalive_timeout時間
補充:
在http1.0協議例還需要你發請求時你自己加上connection: keep-alive這個參數
在http1.1協議里所有的請求都會自動加上connection: keep-alive,也就是說在http1.1客戶端默認就開啟了長連接支持
配套的服務端也要開啟(服務端的keepalive_timeout設置要大于0,等于0相當于關掉)
----如果用的是nginx 修改/etc/nginx/nginx.conf
http1.1(主要)
1、默認所有請求都啟用長連接,對應服務端需要設置keepalive_timeout大于0
2、Pipelining(請求流水線化/管道化)-----可以連續發送多個請求,但響應也必須按照順序來
3、分塊傳輸編碼chunked----不使用分塊傳輸:先告知規定大小,當數據包大小到達指定值后就能知道到這里一個包的內容就結束了
使用分塊傳輸:允許服務器在不知道全部響應大小的情況,(比如由數據庫動態產生的數據)通過多個小"塊"的形式逐步發送HTTP響應給客戶端的技術。除非使用了分塊編碼Transfer-Encoding: chunked,否則響應頭首部必須使用Content-Length首部
http2.0(未來)
http協議的格式
儲備知識:什么是URI、URL
URI:統一資源標識符
# Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是一個來URI來定位的
URL:統一資源定位服務,是uri的一種具體實現
http://192.168.71.10:8080/a/b/1.txt?x=1&y=2&page=10#_label5
所有部分:
http:// 協議部分
不寫協議,默認http協議
192.168.71.10:8080 ip+port部分
不寫端口默認服務端的端口是80
/a/b/1.txt 路徑部分
不寫路徑,默認加一個/結尾
?x=1&y=2&page=10 請求參數部分 通常用于get請求
#_label5 錨 直接跳轉到頁面的某個部分
一個url地址的路徑部分也稱之為uri路徑
URN:也是uri的一種具體實現 例如:mailto:java-net@java.sun.com。
請求request
包含四部分:
請求首行
GET /a.txt HTTP/1.1
請求方法 請求的路徑部分及后續部分 使用http協議版本