1 概述
本文將對HTTP協(xié)議的發(fā)展,相關(guān)術(shù)語方妖,工作機(jī)制進(jìn)行介紹
2 HTTP協(xié)議發(fā)展介紹
.http/0.9:
1991狭魂,原型版本,功能簡陋吁断,只有一個命令GET
GET /index.html ,服務(wù)器只能回應(yīng)HTML格式字符串趁蕊,不能回應(yīng)別的格式
.http/1.0:
1996年5月,支持cache, MIME, method
每個TCP連接只能發(fā)送一個請求坞生,發(fā)送數(shù)據(jù)完畢仔役,連接就關(guān)閉,如果還要請求其他資源是己,就必須再新建一個連接又兵,http/1.0引入了POST命令和HEAD命令
POST上傳
HEAD只看頭部信息,不看數(shù)據(jù)
頭信息是ASCII碼卒废,后面數(shù)據(jù)可為任何格式沛厨。服務(wù)器回應(yīng)時會告訴客戶端,數(shù)據(jù)是什么格式摔认,即Content-Type字段的作用逆皮。這些數(shù)據(jù)類型總稱為MIME多用途互聯(lián)網(wǎng)郵件擴(kuò)展,每個值包括一級類型和二級類型参袱,預(yù)定義的類型电谣,也可自定義類型。
常見Content-Type值:text/xml image/jpegaudio/mp3
.http/1.1:
1997年1月抹蚀,HTTP/1.1是目前的主流
.引入了持久連接(persistent connection)剿牺,即TCP連接默認(rèn)不關(guān)閉,可以被多個請求復(fù)用环壤,不用聲明Connection:keep-alive晒来。對于同一個域名,大多數(shù)瀏覽器允許同時建立6個持久連接
.引入了管道機(jī)制(pipelining)郑现,即在同一個TCP連接里湃崩,客戶端可以同時發(fā)送多個請求荧降,進(jìn)一步改進(jìn)了HTTP協(xié)議的效率
.新增方法:PUT、PATCH攒读、OPTIONS誊抛、DELETE
.同一個TCP連接里面,所有的數(shù)據(jù)通信是按次序進(jìn)行的整陌。服務(wù)器只能順序處理回應(yīng)拗窃,前面的回應(yīng)慢,會有許多請求排隊泌辫,造成"隊頭堵塞"(Head-of-lineblocking)
.為避免上述問題随夸,兩種方法:一是減少請求數(shù),二是同時多開持久連接震放。網(wǎng)頁優(yōu)化技巧宾毒,比如合并腳本和樣式表、將圖片嵌入CSS代碼殿遂、域名分片(domain sharding)等域名分片(domain sharding)指把不同的資源放在不同的域里
.HTTP協(xié)議不帶有狀態(tài)诈铛,每次請求都必須附上所有信息。請求的很多字段都是重復(fù)的墨礁,浪費帶寬幢竹,影響速度
.Spdy:
2009年,谷歌研發(fā),解決HTTP/1.1效率不高問題
.http/2.0:
2015年,基于Spdy技術(shù)恩静,
.頭信息和數(shù)據(jù)體都是二進(jìn)制焕毫,稱為頭信息幀和數(shù)據(jù)幀
.復(fù)用TCP連接,在一個連接里驶乾,客戶端和瀏覽器都可以同時發(fā)送多個請求或回應(yīng)邑飒,且不用按順序一一對應(yīng),避免了“隊頭堵塞“,此雙向的實時通信稱為多工(Multiplexing)
.引入頭信息壓縮機(jī)制(header compression),頭信息使用gzip或compress壓縮后再發(fā)送级乐;客戶端和服務(wù)器同時維護(hù)一張頭信息表疙咸,所有字段都會存入這個表,生成一個索引號风科,不發(fā)送同樣字段撒轮,只發(fā)送索引號,提高速度
.HTTP/2允許服務(wù)器未經(jīng)請求丐重,主動向客戶端發(fā)送資源腔召,即服務(wù)器推送(serverpush)
3 HTTP協(xié)議介紹
http協(xié)議
http/0.9, http/1.0, http/1.1,http/2.0,目前主流的版本是1.1扮惦,協(xié)議查看或分析的工具:tcpdump,wireshark,tshark(wireshare的命令行版)
.http協(xié)議:stateless無狀態(tài)
無狀態(tài)指不能判斷用戶的來源臀蛛。服務(wù)器無法持續(xù)追蹤訪問者來源
.解決http協(xié)議無狀態(tài)方法
cookie客戶端存放,由服務(wù)器生成,把用戶的信息浊仆,如編號進(jìn)行封裝后發(fā)給客戶端保存客峭,當(dāng)客戶端下次在訪問同一網(wǎng)站的時候,就會把上次生成的cookie一起發(fā)給服務(wù)器端抡柿。此時服務(wù)器又會生成新的cookie舔琅,再次發(fā)給客戶端保存
cookie是一段文本文件,相當(dāng)于是小型數(shù)據(jù)庫洲劣,http協(xié)議是無法實現(xiàn)身份驗證的,cookie配合http協(xié)議實現(xiàn)身份的驗證
cookie分成多種:輕量級和重量級的cookie
重量級备蚓,把所有的信息,如范圍網(wǎng)站的行為囱稽,都放到cookie里
重cookie有個缺點時郊尝,換了機(jī)器,cookie就不存在了战惊。而且按照cookie的原理流昏,cookie會一直增大,造成了麻煩吞获,所以一般不會采用重cookie
輕量級cookie之后將服務(wù)器生成的id(如用戶登錄的用戶名)封裝在cookie里發(fā)給用戶况凉。
瀏覽器中查看cookie
在谷歌網(wǎng)頁的? “設(shè)置-->內(nèi)容設(shè)置”,可以直接打開cookie查看
在Firefox中查看cookie, 可以選擇”工具 > 選項 >隱私 >移除特定網(wǎng)站的Cookie各拷〉笕蓿”可以查看cookie。
session服務(wù)端存放撤逢。
session可以理解成時服務(wù)器端的小型數(shù)據(jù)庫膛锭,這個會根據(jù)id來記錄這個session,配合輕量級cookie來實現(xiàn)粮坞。session是放在服務(wù)器的磁盤里的蚊荣。
session有個問題是,當(dāng)有多臺服務(wù)器提供統(tǒng)一服務(wù)時莫杈,這個時候存在seesion同步的問題互例。
解決session同步的方法
1.自動同步session,這個會造成服務(wù)器壓力筝闹,僅適合小環(huán)境媳叨,如三五臺機(jī)器
2.在web服務(wù)器前設(shè)置一個調(diào)度器(反向代理),當(dāng)用戶發(fā)起請求的時候关顷,首先訪問到調(diào)度器糊秆,該調(diào)度器不提供服務(wù),但是轉(zhuǎn)發(fā)請求到對應(yīng)的服務(wù)器上议双,用戶請求的時候痘番,是同一ip,訪問到調(diào)度器,此時要根據(jù)算法來實現(xiàn)調(diào)度器分配請求汞舱。其中伍纫,調(diào)度器可以根據(jù)ip來分配該請求分配到哪一臺機(jī)器上
3.專門找一臺session服務(wù)器。這是主流的做法昂芜。
事務(wù)的概念
http事務(wù):一次訪問的過程莹规,有請求和響應(yīng),不同的協(xié)議報頭
請求:request
響應(yīng):response
請求和響應(yīng)的格式是通用的泌神,使用的服務(wù)器沒有關(guān)系良漱,如apacheh和nginx一樣,
響應(yīng)報文和請求報文格式類似欢际,開始行的格式有區(qū)別
關(guān)于請求和響應(yīng)報文的相關(guān)介紹债热,見博客http://ghbsunny.blog.51cto.com/7759574/1970485
4 HTTP服務(wù)器應(yīng)用
.http服務(wù)器程序
httpd? apache
nginx
lighttpd
.應(yīng)用程序服務(wù)器
IIS .asp:支持動態(tài)的程序
tomcat .jsp,tomcat屬于中間件的程序
jetty開源的servlet容器幼苛,基于Java的web容器窒篱,相對tomcat而言是輕量級的,適合云的環(huán)境
Resin CAUCHO公司舶沿,支持servlets和jsp的引擎
webshpere(IBM), weblogic(BEA),jboss,oc4j(Oracle)
.市場占有率統(tǒng)計墙杯,查看網(wǎng)站www.netcraft.com
5 HTTP相關(guān)術(shù)語
.http:
Hyper Text Transfer Protocol,80/tcp,超文本傳輸協(xié)議括荡。
.html:
Hyper Text Markup Language超文本標(biāo)記語言高镐,編程語言
html是一種文本語言,帶標(biāo)簽畸冲,
http協(xié)議是網(wǎng)絡(luò)協(xié)議嫉髓,網(wǎng)絡(luò)中傳輸可以是a.html,a.txt,a.mp3格式的文件。其中html格式比文本格式顯示會更漂亮邑闲。html是帶格式的文本算行。瀏覽器根據(jù)html的標(biāo)簽來顯示不同的字體或顏色,使得顯示更漂亮
.示例:
html語言
標(biāo)題1
sunny home歡迎你
標(biāo)題2
.MIME:MultipurposeInternet Mail Extensions
多用途互聯(lián)網(wǎng)郵件擴(kuò)展/etc/mime.types苫耸。
MIME(Multipurpose Internet Mail Extensions)多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型州邢。是設(shè)定某種擴(kuò)展名的文件用一種應(yīng)用程序來打開的方式類型,當(dāng)該擴(kuò)展名文件被訪問的時候褪子,瀏覽器會自動使用指定應(yīng)用程序來打開量淌。多用于指定一些客戶端自定義的文件名,以及一些媒體文件打開方式嫌褪。
它是一個互聯(lián)網(wǎng)標(biāo)準(zhǔn)呀枢,擴(kuò)展了電子郵件標(biāo)準(zhǔn),使其能夠支持:
非ASCII字符文本笼痛;非文本格式附件(二進(jìn)制裙秋、聲音、圖像等);由多部分(multipleparts)組成的消息體残吩;包含非ASCII字符的頭信息(Header information)财忽。
這個標(biāo)準(zhǔn)被定義在RFC 2045、RFC 2046泣侮、RFC 2047即彪、RFC 2048、RFC 2049等RFC中活尊。MIME改善了由RFC 822轉(zhuǎn)變而來的RFC 2822隶校,這些舊標(biāo)準(zhǔn)規(guī)定電子郵件標(biāo)準(zhǔn)并不允許在郵件消息中使用7位ASCII字符集以外的字符。正因如此蛹锰,一些非英語字符消息和二進(jìn)制文件深胳,圖像,聲音等非文字消息原本都不能在電子郵件中傳輸(MIME可以)铜犬。MIME規(guī)定了用于表示各種各樣的數(shù)據(jù)類型的符號化方法氛谜。此外播聪,在萬維網(wǎng)中使用的HTTP協(xié)議中也使用了MIME的框架般又,標(biāo)準(zhǔn)被擴(kuò)展為互聯(lián)網(wǎng)媒體類型适秩。
多用途互聯(lián)網(wǎng)郵件擴(kuò)展,它是一個互聯(lián)網(wǎng)標(biāo)準(zhǔn)纷宇,在1992年最早應(yīng)用于電子郵件系統(tǒng)夸盟,但后來也應(yīng)用到瀏覽器。服務(wù)器會將它們發(fā)送的多媒體數(shù)據(jù)的類型告訴瀏覽器像捶,而通知手段就是說明該多媒體數(shù)據(jù)的MIME類型上陕,從而讓瀏覽器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等拓春。服務(wù)器將MIME標(biāo)志符放入傳送的數(shù)據(jù)中來告訴瀏覽器使用哪種插件讀取相關(guān)文件释簿。
.格式:major/minor(大類別/細(xì)分類別)
text/plain
text/html
text/css
image/jpeg
image/png
video/mp4
application/javascript
URI
.URI: Uniform Resource Identifier統(tǒng)一資源標(biāo)識,分為URL和URN
.URN: Uniform Resource Naming痘儡,統(tǒng)一資源命名
示例:P2P下載使用的磁力鏈接是URN的一種實現(xiàn)
magnet:?xt=urn:btih:660557A6890EF888666辕万,URN下載的資源是不確定在哪里的,即下載的位置不固定沉删。
.URL: Uniform ResorceLocator,統(tǒng)一資源定位符醉途,用于描述某服務(wù)器某特定資源位置
.兩者區(qū)別:URN如同一個人的名稱矾瑰,而URL代表一個人的住址。換言之隘擎,URN定義某事物的身份殴穴,而URL提供查找該事物的方法。URN僅用于命名,而不指定地址
URL組成
URL組成可以用以下截圖來說明
URL不一定是http協(xié)議采幌,可以是ftp或郵件協(xié)議等
.://:@:/;?#
.schame:方案劲够,訪問服務(wù)器以獲取資源時要使用哪種協(xié)議
.user:用戶,某些方案訪問資源時需要的用戶名
.password:密碼休傍,用戶對應(yīng)的密碼征绎,中間用:分隔
.Host:主機(jī),資源宿主服務(wù)器的主機(jī)名或IP地址
.port:端口,資源宿主服務(wù)器正在監(jiān)聽的端口號磨取,很多方案有默認(rèn)端口號
.path:路徑,服務(wù)器資源的本地名人柿,由一個/將其與前面的URL組件分隔
路徑可以不是服務(wù)器的的實際路徑,比如該url被重定向到其他位置
.params:參數(shù),指定輸入的參數(shù)忙厌,參數(shù)為名/值對凫岖,多個參數(shù),用;分隔
.query:查詢逢净,傳遞參數(shù)給程序哥放,如數(shù)據(jù)庫,用爹土?分隔,多個查詢用&分隔
.frag:片段,一小片或一部分資源的名字婶芭,此組件在客戶端使用,用#分隔
#用于定位着饥,文檔的內(nèi)容地址定位
URL示例
.http://www.magedu.com:8080/images/logo.jpg
.ftp://mage:password@172.16.0.1/pub/linux.ppt
.rtsp://videoserver/video_demo/
Real Time Streaming Protocol
.http://www.magedu.com/bbs/hello;gender=f/send;type=title
.https://list.jd.com/list.html?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1
.http://apache.org/index.html#projects-list
網(wǎng)站訪問量
.IP(獨立IP):即Internet Protocol,指獨立IP數(shù)犀农。一天內(nèi)來自相同客戶機(jī)IP地址只計算一次,記錄遠(yuǎn)程客戶機(jī)IP地址的計算機(jī)訪問網(wǎng)站的次數(shù)宰掉,是衡量網(wǎng)站流量的重要指標(biāo)呵哨。
用ip138.com就可以查看到主機(jī)對外的端口
如局域網(wǎng)對外就一個ip,所以通過ip來統(tǒng)計可能不準(zhǔn)確
.PV(訪問量):即Page View,頁面瀏覽量或點擊量轨奄,用戶每次刷新即被計算一次孟害,PV反映的是瀏覽某網(wǎng)站的頁面數(shù),PV與來訪者的數(shù)量成正比挪拟,PV并不是頁面的來訪者數(shù)量挨务,而是網(wǎng)站被訪問的頁面數(shù)量
.UV(獨立訪客):即Unique Visitor,訪問網(wǎng)站的一臺電腦為一個訪客。一天內(nèi)相同的客戶端只被計算一次玉组』驯可以理解成訪問某網(wǎng)站的電腦的數(shù)量。網(wǎng)站判斷來訪電腦的身份是通過來訪電腦的cookies實現(xiàn)的惯雳。如果更換了IP后但不清除cookies朝巫,再訪問相同網(wǎng)站,該網(wǎng)站的統(tǒng)計中UV數(shù)是不變的
.網(wǎng)站統(tǒng)計:http://www.alexa.cn/rank/
網(wǎng)站訪問統(tǒng)計示例
.示例:
.甲乙丙三人在同一臺通過ADSL上網(wǎng)的電腦上(中間沒有斷網(wǎng))石景,分別訪問www.magedu.com網(wǎng)站劈猿,并且每人各瀏覽了2個頁面拙吉,那么網(wǎng)站的流量統(tǒng)計是:
IP:1?? PV:6??UV:1
.若三人都是ADSL重新?lián)芴柡?各瀏覽了2個頁面,則
IP:3?? PV:6??UV:1
6 HTTP工作機(jī)制
.工作機(jī)制:
http請求:httprequest
客戶端發(fā)過來的請求
http響應(yīng):httpresponse
一次http事務(wù):請求<-->響應(yīng)
.Web資源:webresource
一個網(wǎng)頁由多個資源構(gòu)成揪荣,打開一個頁面筷黔,會有多個資源展示出來,但是每個資源都要單獨請求仗颈。因此佛舱,一個“Web頁面”通常并不是單個資源,而是一組資源的集合
每個資源都有對應(yīng)的地址
.靜態(tài)文件:無需服務(wù)端做出額外處理揽乱,在客戶端生成
文件后綴:.jpg,.html, .txt, .js, .css, .mp3, .avi
.動態(tài)文件:服務(wù)端執(zhí)行程序名眉,返回執(zhí)行的結(jié)果,在服務(wù)器端生成凰棉。
文件后綴:.asp,.php, .jsp
.提高HTTP連接性能
.并行連接:通過多條TCP連接發(fā)起并發(fā)的HTTP請求损拢,瀏覽器是并行連接
.持久連接:keep-alive,長連接,重用TCP連接撒犀,以消除連接和關(guān)閉的時延,以事務(wù)個數(shù)和時間來決定是否關(guān)閉連接
一個tcp連接可以下載多個資源福压,叫持久連接
.管道化連接:通過共享TCP連接發(fā)起并發(fā)的HTTP請求
一個連接里可以發(fā)起多個鏈接
.復(fù)用的連接:交替?zhèn)魉驼埱蠛晚憫?yīng)報文(實驗階段)
交替?zhèn)鬏斦埱蠛晚憫?yīng)報文,目前還是實驗階段
7 HTTP服務(wù)通信過程
http的端口是80.基于socket通信或舞,是應(yīng)用層的協(xié)議荆姆。服務(wù)通信過程見以下兩張截圖
串行,并行映凳,持久連接胆筒,管道連接 圖形說明
串行是一次連接只能下載一個資源
并行是第一次建立一個連接,連接成功后诈豌,并發(fā)創(chuàng)建多個連接
持久連接是建立第一次連接后仆救,之后的下載是利用第一次的連接來下載,不需要重新創(chuàng)建連接矫渔。
管道化連接彤蔽,即創(chuàng)建一個連接后,可以并行發(fā)起多個請求
?