国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

HTTP就是這么簡單

yzd / 1443人閱讀

摘要:是不保存狀態的協議是無狀態的,也就是說,它是不對通信狀態進行保存的。提升傳輸效率在說明之前,首先我們要知道什么是實體主體實體主體就是作為數據在中傳輸的數據。一般地,實體主體可以等價為報文主體,報文主體是中的一部分。

為什么要學HTTP?

我們絕大多數的Web應用都是基于HTTP來進行開發的。我們對Web的操作都是通過HTTP協議來進行傳輸數據的。

簡單來說,HTTP協議就是客戶端和服務器交互的一種通迅的格式

HTTP的誕生主要是為了能夠讓文檔之間相互關聯,形成超文本可以互相傳閱

可以說,Http就是Web通信的基礎,這是我們必學的。

HTTP基礎概念

我們學計算機網絡的時候就知道,我們把計算機網絡分層了5層,一般我們現在用的都是TCP/IP這么一個分層結構。

雖然官方的是ISO 提出的7層結構,但是僅僅是理論基礎,在實際上大多人都是使用TCP/IP的分層結構

首先,我們先得知道,為什么我們要在計算機網絡中分層次???

因為如果兩臺計算機能夠相互通信的話,實際實現起來是非常困難操作的...我們分層的目的就是為了將困難的問題簡單化,并且如果我們分層了,我們在使用的時候就可以僅僅關注我們需要關注的層次,而不用理會其他層

如果需要改動設計的時候,我們只需要把變動的層替換即可,并不用涉及到其他的層次。這與我們程序設計中的低耦合是一個概念。

而我們的HTTP協議是在最上層,也就是應用層。這是最貼近我們的程序員的層次。

網站通信粗略過程

我們知道HTTP是在應用層中的,顯然,我們在Web通信的過程中,不僅僅是需要HTTP協議的,還會涉及到其他的協議的

DNS:負責解析域名

我們訪問一個網頁的時候,往往是通過域名來訪問的www.zhongfucheng.site,而計算機通信只認的是我們的主機地址(192.168.xxx.xxx),因此,當我們輸入域名的時候,需要DNS把域名解析成主機來進行訪問。

HTTP:產生請求報文數據

當我們對Web頁面進行操作的時候,就會產生HTTP報文數據,請求對應的服務端進行響應。

TCP協議:分割HTTP數據,保證數據運輸

TCP協議采用了三次握手的方式來保證數據的準確運輸,在運輸的數據的時候,發送標識過去給服務器,服務器也返回標識給客戶端,而客戶端收到消息后再次返回標識給服務器。這樣一來就保證了數據運輸是可靠的。

IP協議:傳輸數據包,找到通信目的地地址。

IP協議把我們的產生的數據包發送給對方,IP地址指明了節點被分配的地址,但IP地址可能會變換,我們可以使用ARP協議來將IP地址反射為MAC地址。MAC地址是不會更改的,是網卡所屬的固定地址。

在找到通信目的地之前,我們是需要不斷的中轉的,這過程我們稱作為:“路由中轉”,我們并不知道路由中轉了多少次的。因此是不能全面了解到互聯網中的傳輸狀況的。

接下來就離我們比較遠了,屬于硬件相關的了,也就是鏈路層和物理層。以后復習到計算機網絡的時候再來補充吧!

我們網頁上請求數據就是上邊這么一個流程

告知服務器請求的意圖

我們如果開發過Web程序的話,我們知道常用的提交方式有POST和GET方法

我們也知道GET是用來獲取數據的,POST是用來提交數據的。

其實HTTP協議中還支持著其他的方法,比如:Input、Delete、OPTIONS很多這樣的方法。而由于常用,于是我們也可能僅僅知道GET和POST方法了。

HTTP提供方法的目的就是為了告知服務器該客戶端想進行什么操作。當HTTP是OPTIONS方法的時候,服務器端就會返回它支持什么HTTP方法。

當然了,現在RESTful盛行,也就是充分利用了HTTP協議的這些方法

HTTP是不保存狀態的協議

HTTP是無狀態的,也就是說,它是不對通信狀態進行保存的。它并不知道之前通信的對方是誰。這樣設計的目的就是為了讓HTTP簡單化,能夠快速處理大量的事務!

但是,我們經常是需要知道訪問的人是誰,于是就有了Cookie技術了。

要是服務器端想要記住客戶端是誰,那么就頒發一個cookie給客戶端

客戶端把Cookie保存在硬盤中,當下次訪問服務器的時候,瀏覽器會自動把客戶端的cookie帶過去。

就這樣,服務器就能夠知道這家伙是誰了。

持久連接

在HTTP1.0的時候,每一次進行HTTP通信就會斷開一次連接。如果容量很少的文本傳輸是沒有問題的。但是如果我們訪問一個網頁,該網頁有非常多的圖片。一個圖片就算上一個HTTP請求了。那么在中途中就不斷地建立TCP連接、獲取圖片、斷開TCP連接。

這樣是非常浪費資源的,因此在HTTP1.1版本,就是持久連接了。一次HTTP連接能夠處理多個請求

持久連接為“管線化”方式發送成為了可能:在一次HTTP連接里面,不需要等待服務器響應請求,就能夠繼續發送第二次請求

提升傳輸效率

在說明之前,首先我們要知道什么是實體主體

實體主體就是作為數據在HTTP中傳輸的數據

一般地,實體主體可以等價為報文主體,報文主體是HTTP中的一部分

我們如果不使用任何手段,服務器返回的數據實體主體是原樣返回的。我們可以使用兩種方式來提高傳輸效率

使用壓縮技術把實體主體壓小,在客戶端再把數據解析

使用分塊傳輸編碼,將實體主體分塊傳輸,當瀏覽器解析到實體主體就能夠顯示了。

我們如果在下載東西的過程中斷了,按照以前我們是需要重新下載的,但是現在可以在中斷中繼續下載。我們可以使用到獲取范圍數據,這種叫做范圍請求

這種請求只會下載資源的一部分。

比如我的圖片下載到一半了,我們只需要下載另一半就可以組成一張完整的圖片了。那么請求的時候請求沒有下載的一部分即可。

常用的狀態碼簡述 2XX

一般是請求成功

200 正常處理

204 成功處理,但服務器沒有新數據返回,顯示頁面不更新

206 對服務器進行范圍請求,只返回一部分數據

3XX

一般表示重定向

301 請求的資源已分配了新的URI中,URL地址改變了。【永久重定向】

302 請求的資源臨時分配了新的URI中,URL地址沒變【臨時重定向】

303 與302相同的功能,但明確客戶端應該采用GET方式來獲取資源

304 發送了附帶請求,但不符合條件【返回未過期的緩存數據】

307 與302相同,但不會把POST請求變成GET

4XX

表示客戶端出錯了。

400 請求報文語法錯誤了

401 需要認證身份

403 沒有權限訪問

404 服務器沒有這個資源

5XX

服務器出錯了

500 內部資源出錯了

503 服務器正忙

服務器與客戶端之間的應用程序

首先要說的是,一個HTTP服務器可以擁有多個站點,也就是說:HTTP下可以配置多個虛擬主機。當用戶訪問不同主機的時候,實際上都是訪問同一臺HTTP服務器。

在客戶端和服務器中還有一些用于通信數據轉發的應用程序

代理

可以用來緩存數據,當代理緩存了數據以后,客戶端就可以直接用代理獲取數據

可以用來對網站進行訪問控制,獲取訪問日志記錄

網關

能夠提供非HTTP請求的操作,訪問數據庫什么的

隧道

建立一條安全的通信路徑,可以使用SSL等加密手段進行通信。

HTTP首部簡述 HTTP請求報文

HTTP請求報文:在請求中,HTTP報文由方法、URI、HTTP版本、HTTP首部字段等部分組成。

請求行【描述客戶端的請求方式請求的資源名稱,以及使用的HTTP協議版本號

首部字段【描述客戶端請求哪臺主機,以及客戶端的一些環境信息等】

一個空行

首部字段例子:

Accept: text/html,image/* 【瀏覽器告訴服務器,它支持的數據類型】

Accept-Charset: ISO-8859-1 【瀏覽器告訴服務器,它支持哪種字符集

Accept-Encoding: gzip,compress 【瀏覽器告訴服務器,它支持的壓縮格式

Accept-Language: en-us,zh-cn 【瀏覽器告訴服務器,它的語言環境】

Host: www.it315.org:80【瀏覽器告訴服務器,它的想訪問哪臺主機】

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【瀏覽器告訴服務器,緩存數據的時間】

Referer: http://www.it315.org/index.jsp【瀏覽器告訴服務器,客戶機是從那個頁面來的---反盜鏈

8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【瀏覽器告訴服務器,瀏覽器的內核是什么】

Cookie【瀏覽器告訴服務器,帶來的Cookie是什么

Connection: close/Keep-Alive 【瀏覽器告訴服務器,請求完后是斷開鏈接還是保持鏈接】

Date: Tue, 11 Jul 2000 18:23:51 GMT【瀏覽器告訴服務器,請求的時間】

HTTP響應報文

HTTP響應報文:在響應中,HTTP報文由HTTP版本、狀態碼(數字和原因短語)、HTTP首部字段3部分組成。

一個狀態行【用于描述服務器對請求的處理結果。

首部字段【用于描述服務器的基本信息,以及數據的描述服務器通過這些數據的描述信息,可以通知客戶端如何處理等一會兒它回送的數據

一個空行

實體內容【服務器向客戶端回送的數據

狀態行:

格式: HTTP版本號 狀態碼 原因敘述

狀態行:HTTP/1.1 200 OK

狀態碼用于表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分為5類

首部字段例子:

Location: http://www.it315.org/index.jsp 【服務器告訴瀏覽器要跳轉到哪個頁面

Server:apache tomcat【服務器告訴瀏覽器,服務器的型號是什么】

Content-Encoding: gzip 【服務器告訴瀏覽器數據壓縮的格式

Content-Length: 80 【服務器告訴瀏覽器回送數據的長度】

Content-Language: zh-cn 【服務器告訴瀏覽器,服務器的語言環境】

Content-Type: text/html; charset=GB2312 【服務器告訴瀏覽器,回送數據的類型

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服務器告訴瀏覽器該資源上次更新時間】

Refresh: 1;url=http://www.it315.org【服務器告訴瀏覽器要定時刷新

Content-Disposition: attachment; filename=aaa.zip【服務器告訴瀏覽器以下載方式打開數據

Transfer-Encoding: chunked 【服務器告訴瀏覽器數據以分塊方式回送】

Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服務器告訴瀏覽器要保存Cookie

Expires: -1【服務器告訴瀏覽器不要設置緩存

Cache-Control: no-cache 【服務器告訴瀏覽器不要設置緩存

Pragma: no-cache 【服務器告訴瀏覽器不要設置緩存

Connection: close/Keep-Alive 【服務器告訴瀏覽器連接方式】

Date: Tue, 11 Jul 2000 18:23:51 GMT【服務器告訴瀏覽器回送數據的時間】

對于HTTP首部這一部分是非常龐大的一個章節,知識點也很多,我就沒有一一去記錄了。用到的時候再查吧。我看的是《圖解HTTP》。

HTTPS簡述

HTTP在安全上是不足的

通信使用明文【沒有加密過內容的】

不驗證通信方身份,無論是客戶端和服務器,都是隨意通信的

無法證明報文的完整性【別人監聽后,可以篡改】

我們一般在上網時,使用抓包工具就很容易獲取到HTTP請求的信息了,這是TCP/IP在網絡通信中無法避免的。

假設我們對HTTP報文進行加密了, 那也僅僅是是內容的加密。別人獲取到了HTTP內容了,即使無法破解HTTP內容,還是能夠篡改的。

我們最好就是使用SSL建立安全的通信線路,就可以在這條線路上進行HTTP通信了。

其實HTTPS就是披著SSL的HTTP...

HTTPS使用的是共享密鑰和公開私有密鑰混合來進行加密的。由于公開私有密鑰需要太多的資源,不可能一直以公開私有密鑰進行通信。因此,HTTP在建立通信線路的時候使用公開私有密鑰,當建立完連接后,隨后就使用共享密鑰進行加密和解密了

對于認證方面,HTTPS是基于第三方的認證機構來獲取認受認可的證書、因此,可以從中認證該服務器是否是合法的。

而客戶端方面則需要自己購買認證證書、這實施起來難度是很大的【認證證書需要錢】。

所以,一般的網站都是使用表單認證就算了,這是用得最廣泛的客戶端認證了。

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68459.html

相關文章

  • Java3y文章目錄導航

    摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...

    KevinYan 評論0 收藏0
  • SpringBoot就是這么簡單

    摘要:熱加載代表的是我們不需要重啟服務器,就能夠類檢測得到,重新生成類的字節碼文件無論是熱部署或者是熱加載都是基于類加載器來完成的。驗證階段字節碼文件不會對造成危害準備階段是會賦初始值,并不是程序中的值。 一、SpringBoot入門 今天在慕課網中看見了Spring Boot這么一個教程,這個Spring Boot作為JavaWeb的學習者肯定至少會聽過,但我是不知道他是什么玩意。 只是大...

    whinc 評論0 收藏0
  • SpringMVC入門就這么簡單

    摘要:也就是說映射器就是用于處理什么樣的請求提交給處理。這和是一樣的提交參數的用戶名編號提交配置處理請求注冊映射器包框架接收參數設置無參構造器,里邊調用方法,傳入要封裝的對象這里的對象就表示已經封裝好的了對象了。 什么是SpringMVC? SpringMVC是Spring家族的一員,Spring是將現在開發中流行的組件進行組合而成的一個框架!它用在基于MVC的表現層開發,類似于struts...

    SKYZACK 評論0 收藏0
  • Maven就是這么簡單

    摘要:軟件項目的管理就會變得簡單很多。比如說的驅動程序,,在是獲取不到的,就需要手工上傳到里是倉庫組,在里沒有這個概念,是特有的。 什么是Maven Maven是一個采用純Java編寫的開源項目管理工具, Maven采用了一種被稱之為Project Object Model (POM)概念來管理項目,所有的項目配置信息都被定義在一個叫做POM.xml的文件中.. Maven是一款跨平臺的項目...

    leonardofed 評論0 收藏0
  • SpringDataJPA入門就這么簡單

    摘要:一入門在上次學的時候,那時候的教程就已經涉及到了一點的知識了。入門只是中的一個子模塊是一套標準接口,而是的實現底層默認實現是使用的首個接口就是,它是一個標記接口。這也導致了我出現這個錯誤的原因。 一、SpringData入門 在上次學SpringBoot的時候,那時候的教程就已經涉及到了一點SpringData JPA的知識了。當時還是第一次見,覺得也沒什么大不了,就是封裝了Hiber...

    MasonEast 評論0 收藏0

發表評論

0條評論

yzd

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<