詳細介紹http
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用于從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議,點擊這里了解 http 1.0 vs 2.0 區別,在 OSI 七層模型中,HTTP協議位于最頂層的應用層中,通過瀏覽器訪問網頁就直接使用了 HTTP 協議,使用 HTTP 協議時,客戶端首先與服務端的 80 埠建立一個 TCP 連接,然后在這個連接的基礎上進行請求和應答,以及資料的交換,
HTTP 有兩個常用版本,分別是 HTTP1.0和 HTTP1.1,主要區別在于 HTTP1.0 中每次請求和應答都會使用一個新的 TCP 連接,而從 HTTP1.1 開始,運行在一個 TCP 連接上發送多個命令和應答,因此大幅度減少了 TCP 連接的建立和斷開,提高了效率,
特點
- 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑,請求方法常用的有GET、HEAD、POST,每種方法規定了客戶與服務器聯系的型別不同,由于HTTP協議簡單,使得HTTP服務器的程式規模小,因而通信速度很快,
- 靈活:HTTP允許傳輸任意型別的資料物件,正在傳輸的型別由Content-Type加以標記,
- 無連接:無連接的含義是限制每次連接只處理一個請求,服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接,采用這種方式可以節省傳輸時間,
- 無狀態:HTTP協議是無狀態協議,無狀態是指協議對于事務處理沒有記憶能力,缺少狀態意味著如果后續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連接傳送的資料量增大,另一方面,在服務器不需要先前資訊時它的應答就較快,
- 支持B/S及C/S模式,
請求訊息Request
- 請求行,用來說明請求型別,要訪問的資源以及所使用的HTTP版本.
- 請求頭部,緊接著請求行(即第一行)之后的部分,用來說明服務器要使用的附加資訊從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器型別檢測邏輯的重要基礎.該資訊由你的瀏覽器來定義,并且在每個請求中自動發送等等
- 空行,請求頭部后面的空行是必須的
- 請求資料也叫主體,可以添加任意的其他資料,
回應訊息Response
- 狀態行,由HTTP協議版本號, 狀態碼, 狀態訊息 三部分組成,
- 訊息報頭,用來說明客戶端要使用的一些附加資訊
- 空行,訊息報頭后面的空行是必須的
- 回應正文,服務器回傳給客戶端的文本資訊,
狀態碼
- 200 OK //客戶端請求成功
- 301 Moved Permanently //永久重定向,使用域名跳轉
- 302 Found // 臨時重定向,未登陸的用戶訪問用戶中心重定向到登錄頁面
- 400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
- 401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
- 403 Forbidden //服務器收到請求,但是拒絕提供服務
- 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
- 500 Internal Server Error //服務器發生不可預期的錯誤
- 503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
http的方法
- get:客戶端向服務端發起請求,獲得資源,請求獲得URL處所在的資源,
- post:向服務端提交新的請求欄位,請求URL的資源后添加新的資料,
- head:請求獲取URL資源的回應報告,即獲得URL資源的頭部
- patch:請求區域修改URL所在資源的資料項
- put:請求修改URL所在資源的資料元素,
- delete:請求洗掉url資源的資料
https是如何保證資料傳輸的安全
https實際就是在TCP層與http層之間加入了SSL/TLS來為上層的安全保駕護航,主要用到對稱加密、非對稱加密、證書,等技術進行客戶端與服務器的資料加密傳輸,最終達到保證整個通信的安全性,點擊這里弄懂 https 的 9 個問題,
SSL/TLS協議作用:
- 認證用戶和服務器,確保資料發送到正確的客戶機和服務器;
- 加密資料以防止資料中途被竊取;
- 維護資料的完整性,確保資料在傳輸程序中不被改變,
Http協議由什么組成?
請求報文包括三部分:
(1).請求行:包含請求方法,URI,HTTP版本協議
(2).請求首部欄位
(3).請求內容物體
回應報文包含三部分:
(1).狀態行:包含HTTP版本,狀態碼,狀態碼原因短語
(2).回應首部欄位
(3).回應內容物體
冪等
一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同,冪等函式,或冪等方法,是指可以使用相同引數重復執行,并能獲得相同結果的函式,這些函式不會影響系統狀態,也不用擔心重復執行會對系統造成改變,例如,“getUsername()和setTrue()”函式就是一個冪等函式.
長連接
一、基于http協議的長連接
在HTTP1.0和HTTP1.1協議中都有對長連接的支持,其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能夠支持,而HTTP1.1默認支持.
http1.0請求與服務端的互動程序:
- 客戶端發出帶有包含一個header:”Connection: keep-alive“的請求
- 服務端接收到這個請求后,根據http1.0和”Connection: keep-alive“判斷出這是一個長連接,就會在response的header中也增加”Connection: keep-alive“,同是不會關閉已建立的tcp連接.
- 客戶端收到服務端的response后,發現其中包含”Connection: keep-alive“,就認為是一個長連接,不關閉這個連接,并用該連接再發送request.轉到a),點擊這里了解 http 1.0 vs 2.0 區別,
二、發心跳包,每隔幾秒就發一個資料包過去
Http協議中Http1.0和1.1區別?
在http1.0中,當建立連接后,客戶端發送一個請求,服務器端回傳一個資訊后就關閉連接,當瀏覽器下次請求的 時候又要建立連接,顯然這種不斷建立連接的方式,會造成很多問題,
Http協議實作的原理機制
(2)域名決議程序:
(3).三次握手程序
(4).發起Http請求
(5).回應Http請求并得到HTML代碼
(6).瀏覽器決議HTML代碼
(7).瀏覽器對頁面進行渲染呈現給用戶
Cookie是否會被覆寫,localStorage是否會被覆寫
Cookie是可以覆寫的,如果重復寫入同名的Cookie,那么將會覆寫之前的Cookie
如果要洗掉某個Cookie,只需要新建一個同名的Cookie,并將maxAge設定為0,并添加到response中覆寫原來的Cookie,注意是0而不是負數,負數代表其他的意義,
localStorage存盤在一個物件中. 有鍵值對
什么是localStorage,在HTML5中,新加入了一個localStorage特性,這個特性主要是用來作為本地存盤來使用的,解決了cookie存盤空間不足的問題(cookie中每條cookie的存盤空間為4k),localStorage中一般瀏覽器支持的是5M大小,這個在不同的瀏覽器中localStorage會有所不同,
localStorage的優勢
1、localStorage拓展了cookie的4K限制
2、localStorage會可以將第一次請求的資料直接存盤到本地,這個相當于一個5M大小的針對于前端頁面的資料庫,相比于cookie可以節約帶寬,但是這個卻是只有在高版本的瀏覽器中才支持的
localStorage的局限
1、瀏覽器的大小不統一,并且在IE8以上的IE版本才支持localStorage這個屬性
2、目前所有的瀏覽器中都會把localStorage的值型別限定為string型別,這個在對我們日常比較常見的JSON物件型別需要一些轉換
3、localStorage在瀏覽器的隱私模式下面是不可讀取的
4、localStorage本質上是對字串的讀取,如果存盤內容多的話會消耗記憶體空間,會導致頁面變卡
5、localStorage不能被爬蟲抓取到
localStorage與sessionStorage的唯一一點區別就是localStorage屬于永久性存盤,而sessionStorage屬于當會話結束的時候,sessionStorage中的鍵值對會被清空
Cookie和Session的區別
HTTP 是一種無狀態的連接,客戶端每次讀取 web頁面時,服務器都會認為這是一次新的會話,但有時候我們又需要持久保持某些資訊,比如登錄時的用戶名、密碼,用戶上一次連接時的資訊等,這些資訊就由 Cookie 和 Session 保存,
Cookie
cookie實際上是一小段文本資訊,客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個cookie,客戶端瀏覽器會把cookie保存起來,當瀏覽器再次請求訪問該網站時,瀏覽器把請求的網站連同該cookie一同提交給服務器,服務器檢查該cookie,以此來辨認用戶狀態,
簡單來說,cookie的作業原理可總結如下:
1,client連接server
2,client生成cookie(有效期),再次訪問時攜帶cookie
3, server根據cookie的資訊識別用戶身份
Session
Session是服務器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,同一個客戶端每次和服務端互動時,不需要每次都傳回所有的 Cookie 值,而是只要傳回一個 ID,這個 ID 是客戶端第一次訪問服務器的時候生成的,而且每個客戶端是唯一的,這樣每個客戶端就有了一個唯一的 ID,客戶端只要傳回這個 ID 就行了,這個 ID 通常是 name為 JSESIONID 的一個 Cookie,Session依據這個id來識別是否為同一用戶(只認ID不認人),
Cookies是一種能夠讓網站服務器把少量資料儲存到客戶端的硬碟或記憶體,或是從客戶端的硬碟讀取資料的一種技術,Cookies是當你瀏覽某網站時,由Web服務器置于你硬碟上的一個非常小的文本檔案,它可以記錄你的用戶ID、密碼、瀏覽過的網頁、停留的時間等資訊,session: 當用戶請求來自應用程式的 Web 頁時,如果該用戶還沒有會話,則 Web 服務器將自動創建一個 Session 物件,當會話過期或被放棄后,服務器將終止該會話,cookie機制:采用的是在客戶端保持狀態的方案,而session機制采用的是在服務端保持狀態的方案,同時我們看到由于服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助cookie機制來達到保存標識的目的,
- Session是服務器用來跟蹤用戶的一種手段,每個Session都有一個唯一標識:session ID,當服務器創建了Session時,給客戶端發送的回應報文包含了Set-cookie欄位,其中有一個名為sid的鍵值對,這個鍵值Session ID,客戶端收到后就把Cookie保存瀏覽器,并且之后發送的請求報表都包含SessionID,HTTP就是通過Session和Cookie這兩個發送一起合作來實作跟蹤用戶狀態,Session用于服務端,Cookie用于客戶端
1、cookie資料存放在客戶的瀏覽器上,session資料放在服務器上,
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙,考慮到安全應當使用session,
3、session會在一定時間內保存在服務器上,當訪問增多,會比較占用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE,
4、單個cookie保存的資料不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie,
Http與Https的區別:
Http與Https的區別:
- HTTP 的URL 以http:// 開頭,而HTTPS 的URL 以https:// 開頭
- HTTP 是不安全的,而 HTTPS 是安全的
- HTTP 標準埠是80 ,而 HTTPS 的標準埠是443
- 在OSI 網路模型中,HTTP作業于應用層,而HTTPS 的安全傳輸機制作業在傳輸層
- HTTP 無法加密,而HTTPS 對傳輸的資料進行加密
- HTTP無需證書,而HTTPS 需要CA機構wosign的頒發的SSL證書
什么是Http協議無狀態協議?怎么解決Http協議無狀態協議?
無狀態協議對于事務處理沒有記憶能力,缺少狀態意味著如果后續處理需要前面的資訊
也就是說,當客戶端一次HTTP請求完成以后,客戶端再發送一次HTTP請求,HTTP并不知道當前客戶端是一個”老用戶“,
可以使用Cookie來解決無狀態的問題,Cookie就相當于一個通行證,第一次訪問的時候給客戶端發送一個Cookie,當客戶端再次來的時候,拿著Cookie(通行證),那么服務器就知道這個是”老用戶“,
URI和URL的區別
URI,是uniform resource identifier,統一資源識別符號,用來唯一的標識一個資源,
- Web上可用的每種資源如HTML檔案、影像、視頻片段、程式等都是一個來URI來定位的
- URI一般由三部組成:
- ①訪問資源的命名機制
- ②存放資源的主機名
- ③資源自身的名稱,由路徑表示,著重強調于資源,
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何locate這個資源,
- URL是Internet上用來描述資訊資源的字串,主要用在各種WWW客戶程式和服務器程式上,特別是著名的Mosaic,
- 采用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、服務器的地址和目錄等,URL一般由三部組成:
- ①協議(或稱為服務方式)
- ②存有該資源的主機IP地址(有時也包括埠號)
- ③主機資源的具體地址,如目錄和檔案名等
URN,uniform resource name,統一資源命名,是通過名字來標識資源,比如mailto:java-net@java.sun.com,
- URI是以一種抽象的,高層次概念定義統一資源標識,而URL和URN則是具體的資源標識的方式,URL和URN都是一種URI,籠統地說,每個 URL 都是 URI,但不一定每個 URI 都是 URL,這是因為 URI 還包括一個子類,即統一資源名稱 (URN),它命名資源但不指定如何定位資源,上面的 mailto、news 和 isbn URI 都是 URN 的示例,
在Java的URI中,一個URI實體可以代表絕對的,也可以是相對的,只要它符合URI的語法規則,而URL類則不僅符合語意,還包含了定位該資源的資訊,因此它不能是相對的,
在Java類別庫中,URI類不包含任何訪問資源的方法,它唯一的作用就是決議,
相反的是,URL類可以打開一個到達資源的流,
HTTP之URL
HTTP使用統一資源識別符號(Uniform Resource Identifiers, URI)來傳輸資料和建立連接,URL是一種特殊型別的URI,包含了用于查找某個資源的足夠的資訊
URL,全稱是UniformResourceLocator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址,以下面這個URL為例,介紹下普通URL的各部分組成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
從上面的URL可以看出,一個完整的URL包括以下幾部分:
1.協議部分:該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議,在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議,在"HTTP"后面的“//”為分隔符
2.域名部分:該URL的域名部分為“www.aspxfans.com”,一個URL中,也可以使用IP地址作為域名使用
3.埠部分:跟在域名后面的是埠,域名和埠之間使用“:”作為分隔符,埠不是一個URL必須的部分,如果省略埠部分,將采用默認埠
4.虛擬目錄部分:從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分,虛擬目錄也不是一個URL必須的部分,本例中的虛擬目錄是“/news/”
5.檔案名部分:從域名后的最后一個“/”開始到“?”為止,是檔案名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是檔案部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是檔案名部分,本例中的檔案名是“index.asp”,檔案名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的檔案名
6.錨部分:從“#”開始到最后,都是錨部分,本例中的錨部分是“name”,錨部分也不是一個URL必須的部分
7.引數部分:從“?”開始到“#”為止之間的部分為引數部分,又稱搜索部分、查詢部分,本例中的引數部分為“boardID=5&ID=24618&page=1”,引數可以允許有多個引數,引數與引數之間用“&”作為分隔符,
(原文:http://blog.csdn.net/ergouge/article/details/8185219 )
URI和URL的區別
URI,是uniform resource identifier,統一資源識別符號,用來唯一的標識一個資源,
Web上可用的每種資源如HTML檔案、影像、視頻片段、程式等都是一個來URI來定位的
URI一般由三部組成:
①訪問資源的命名機制
②存放資源的主機名
③資源自身的名稱,由路徑表示,著重強調于資源,
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明了如何locate這個資源,
URL是Internet上用來描述資訊資源的字串,主要用在各種WWW客戶程式和服務器程式上,特別是著名的Mosaic,
采用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、服務器的地址和目錄等,
URL一般由三部組成:
①協議(或稱為服務方式)
②存有該資源的主機IP地址(有時也包括埠號)
③主機資源的具體地址,如目錄和檔案名等
URN,uniform resource name,統一資源命名,是通過名字來標識資源,比如mailto:java-net@java.sun.com,
URI是以一種抽象的,高層次概念定義統一資源標識,而URL和URN則是具體的資源標識的方式,URL和URN都是一種URI,籠統地說,每個 URL 都是 URI,但不一定每個 URI 都是 URL,這是因為 URI 還包括一個子類,即統一資源名稱 (URN),它命名資源但不指定如何定位資源,上面的 mailto、news 和 isbn URI 都是 URN 的示例,
在Java的URI中,一個URI實體可以代表絕對的,也可以是相對的,只要它符合URI的語法規則,而URL類則不僅符合語意,還包含了定位該資源的資訊,因此它不能是相對的,
在Java類別庫中,URI類不包含任何訪問資源的方法,它唯一的作用就是決議,
相反的是,URL類可以打開一個到達資源的流,
HTTPS作業原理
- 一、首先HTTP請求服務端生成證書,客戶端對證書的有效期、合法性、域名是否與請求的域名一致、證書的公鑰(RSA加密)等進行校驗;
- 二、客戶端如果校驗通過后,就根據證書的公鑰的有效, 生成亂數,亂數使用公鑰進行加密(RSA加密);
- 三、訊息體產生的后,對它的摘要進行MD5(或者SHA1)演算法加密,此時就得到了RSA簽名;
- 四、發送給服務端,此時只有服務端(RSA私鑰)能解密,
- 五、解密得到的亂數,再用AES加密,作為密鑰(此時的密鑰只有客戶端和服務端知道),
具體的參考鏈接:http://blog.csdn.net/sean_cd/article/details/6966130
一次完整的HTTP請求所經歷的7個步驟
HTTP通信機制是在一次完整的HTTP通信程序中,Web瀏覽器與Web服務器之間將完成下列7個步驟:
- 建立TCP連接
在HTTP作業開始之前,Web瀏覽器首先要通過網路與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建 Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網路,HTTP是比TCP更高層次的應用層協議,根據規則, 只有低層協議建立之后才能,才能進行更層協議的連接,因此,首先要建立TCP連接,一般TCP連接的埠號是80,
- Web瀏覽器向Web服務器發送請求行
一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令,例如:GET /sample/hello.jsp HTTP/1.1,
- Web瀏覽器發送請求頭
-
- 瀏覽器發送其請求命令之后,還要以頭資訊的形式向Web服務器發送一些別的資訊,之后瀏覽器發送了一空白行來通知服務器,它已經結束了該頭資訊的發送,
- Web服務器應答
-
- 客戶機向服務器發出請求后,服務器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼,
- Web服務器發送應答頭
-
- 正如客戶端會隨同請求發送關于自身的資訊一樣,服務器也會隨同應答向用戶發送關于它自己的資料及被請求的檔案,
- Web服務器向瀏覽器發送資料
-
- Web服務器向瀏覽器發送頭資訊后,它會發送一個空白行來表示頭資訊的發送到此為結束,接著,它就以Content-Type應答頭資訊所描述的格式發送用戶所請求的實際資料,
- Web服務器關閉TCP連接
-
- 一般情況下,一旦Web服務器向瀏覽器發送了請求資料,它就要關閉TCP連接,然后如果瀏覽器或者服務器在其頭資訊加入了這行代碼:
Connection:keep-alive
TCP連接在發送后將仍然保持打開狀態,于是,瀏覽器可以繼續通過相同的連接發送請求,保持連接節省了為每個請求建立新連接所需的時間,還節約了網路帶寬,
建立TCP連接->發送請求行->發送請求頭->(到達服務器)發送狀態行->發送回應頭->發送回應資料->斷TCP連接
最具體的HTTP請求程序:http://blog.51cto.com/linux5588/1351007
常見的HTTP相應狀態碼
- 200:請求被正常處理
- 204:請求被受理但沒有資源可以回傳
- 206:客戶端只是請求資源的一部分,服務器只對請求的部分資源執行GET方法,相應報文中通過Content-Range指定范圍的資源,
- 301:永久性重定向
- 302:臨時重定向
- 303:與302狀態碼有相似功能,只是它希望客戶端在請求一個URI的時候,能通過GET方法重定向到另一個URI上
- 304:發送附帶條件的請求時,條件不滿足時回傳,與重定向無關
- 307:臨時重定向,與302類似,只是強制要求使用POST方法
- 400:請求報文語法有誤,服務器無法識別
- 401:請求需要認證
- 403:請求的對應資源禁止被訪問
- 404:服務器無法找到對應資源
- 500:服務器內部錯誤
- 503:服務器正忙
HTTP作業原理
HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端,HTTP協議采用了請求/回應模型,客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求資料,服務器以一個狀態行作為回應,回應的內容包括協議的版本、成功或者錯誤代碼、服務器資訊、回應頭部和回應資料,
以下是 HTTP 請求/回應的步驟:
1、客戶端連接到Web服務器
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP埠(默認為80)建立一個TCP套接字連接,例如,http://www.oakcms.cn,
2、發送HTTP請求
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求資料4部分組成,
3、服務器接受請求并回傳HTTP回應
Web服務器決議請求,定位請求資源,服務器將資源復本寫到TCP套接字,由客戶端讀取,一個回應由狀態行、回應頭部、空行和回應資料4部分組成,
4、釋放連接TCP連接
若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
5、客戶端瀏覽器決議HTML內容
客戶端瀏覽器首先決議狀態行,查看表明請求是否成功的狀態代碼,然后決議每一個回應頭,回應頭告知以下為若干位元組的HTML檔案和檔案的字符集,客戶端瀏覽器讀取回應資料HTML,根據HTML的語法對其進行格式化,并在瀏覽器視窗中顯示,
例如:在瀏覽器地址欄鍵入URL,按下回車之后會經歷以下流程:
1、瀏覽器向 DNS 服務器請求決議該 URL 中的域名所對應的 IP 地址;
2、決議出 IP 地址后,根據該 IP 地址和默認埠 80,和服務器建立TCP連接;
3、瀏覽器發出讀取檔案(URL 中域名后面部分對應的檔案)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的資料發送給服務器;
4、服務器對瀏覽器請求作出回應,并把對應的 html 文本發送給瀏覽器;
5、釋放 TCP連接;
6、瀏覽器將該 html 文本并顯示內容;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229480.html
標籤:其他
上一篇:PIE/CPU中斷回應程序
