本節主要講解http協議相關的內容,作為后期講述的一個預備知識。深入了解Http協議,對你今后的JavaSE,JavaEE學習都大有裨益,本節難度不是很大,卻很重要。
早期的Http協議是1.0版本的,基於TCP協議。Http協議是一種基於請求、響應模式的無狀態的文件傳輸協議。什么叫做基於請求、響應模式呢?舉一個例子,比如我訪問 www.xiaotublog.com ,就在瀏覽器輸入這一個字符串,然后敲一下回車。
網站首頁:
刷的一下,博客首頁就被打開了,而且地址欄自動給我加上了http:// ,雖然瀏覽器上可能看不到,但實際上肯定是有的。你有意識到剛才發生了什么嗎?沒錯,我通過瀏覽器這一個客戶端,向某個遠程服務器發送了一個http請求,因為我是通過域名來訪問的。所以,為了解析這個域名,我剛才敲的這一下回車肯定是先走到了某一個DNS服務器,然后這個DNS服務器將域名解析后拿到一個IP地址,最終才傳送到對應的服務器上。博客網站的服務器只有IP地址,沒有域名的說法。實際上,在這個服務器上,也就是跑了一個Tomcat,Tomcat里面有一個博客的web項目,服務器原則上一直在開機狀態,tomcat也一直在運行着。它處於一種等待狀態,一直在等着有外部的Http請求過來。比如,我剛才就敲了一下回車,一個http請求就被發送過去了,tomcat軟件接收到這個請求,並且解析這個請求。經過解析,就把其中的一個頁面資源找到,並且通過響應的方式回執給我的客戶端 - 瀏覽器。
讓我們右鍵查看源代碼,就能看到服務器給我們返回的其實就是html文本。
利用瀏覽器的調試工具,我們可以看到更多關於本次http請求的信息。
再來說說無狀態,什么叫無狀態呢?就是說,我剛才訪問了一個網頁,如果我馬上再次刷新一下,是不是又對服務器發送了一次Http請求啊?是的,可是,對服務器而言,它並不知道兩次的請求是否是同一個人,或者說同一台電腦發出來的,他不知道。這個就叫做無狀態。
在早期的時候,Http請求還是1.0版本,他會給每一次的請求都建立一個連接,當請求結束,連接也就是自動關閉了。如果用戶所請求的資源僅僅是一些純文本,包括嵌入在頁面中的css,和js代碼,那么問題不是很大。可是在現在,網頁內容越做越豐富,大量的外部css被引用,比如bootstrap.min.css。大量的外部js被引入,比如jQuery.min.css , 還有就是一個網站,往往會引入大量的圖片。比如,我現在有一個網站的首頁是這樣子的。
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<link type="text/css" rel="stylesheet" href="1.css" />
<link type="text/css" rel="stylesheet" href="2.css" />
<link type="text/css" rel="stylesheet" href="3.css" />
</head>
<body>
</body>
</html>
在http1.0版本的時候,它是這樣的,首先,和服務器建立連接,請求html文本,然后服務器把上面的這段代碼發過來,本地的瀏覽器接收,OK,連接關閉。接下來,有趣的事情發生了,瀏覽器一行一行解析這些代碼,當解析到 這一句的時候,再次向服務器發送一條請求,專門請求 1.css 這個文件。然后,服務器把1.css的純文本發送給瀏覽器,瀏覽器緩存下來,接着,第二次連接關閉。同理,對於2.css和3.css,都會再分別建立一個連接,獲取資源,然后又把連接關閉。不但是外部的css文件會這樣,就連js文件,還有哪怕是一張圖片,img標簽等等,都會如此。
我們知道,隨着網站的內容越來越豐富,圖片動輒幾十張,顯然這種方式會持續不斷的浪費性能,不可取。所以,這才有了http2.0。http2.0最重要的一點,就是新增了一個持續連接的功能,就比如上面那個HTML文件,正常情況下,它只會連接一次,在本次連接的過程中,會負責所有文件的請求和返回操作,當一段時間用戶沒有任何操作的話,這個鏈接才會自動斷開。這就是所謂的http2.0