1.1 Internet 因特網
因特網是“Internet”的中文譯名,它起源于美國的五角大樓,它的前身是美國國防部高級研究計劃局(ARPA)主持研制的ARPAnet。20世紀50年代末,正處于冷戰時期。當時美國軍方為了自己的計算機網絡在受到襲擊時,即使部分網絡被摧毀,其余部分仍能保持通信聯系,便由美國國防部的高級研究計劃局(ARPA)建設了一個軍用網,叫做“阿帕網”(ARPAnet)。阿帕網于1969年正式啟用,當時僅連接了4臺計算機,供科學家們進行計算機聯網實驗用,這就是因特網的前身。 到70年代,ARPAnet已經有了好幾十個計算機網絡,但是每個網絡只能在網絡內部的計算機之間互聯通信,不同計算機網絡之間仍然不能互通。為此, ARPA又設立了新的研究項目,支持學術界和工業界進行有關的研究,研究的主要內容就是想用一種新的方法將不同的計算機局域網互聯,形成“互聯網”。研究人員稱之為“internetwork”,簡稱“Internet” 在研究實現互聯的過程中,計算機軟件起了主要的作用。1974年,出現了連接分組網絡的協議,其中就包括了TCP/IP協議。TCP/IP有一個非常重要的特點,就是開放性,即TCP/IP的規范和Internet的技術都是公開的。目的就是使任何廠家生產的計算機都能相互通信,使Internet成為一個開放的系統,這正是后來Internet得到飛速發展的重要原因。ARPA在1982年接受了TCP/IP,選定Internet為主要的計算機通信系統,并把其它的軍用計算機網絡都轉換到TCP/IP。1983年,ARPAnet分成兩部分:一部分軍用,稱為MILNET;另一部分仍稱ARPAnet,供民用。
1986年,美國國家科學基金組織(NSF)將分布在美國各地的5個為科研教育服務的超級計算機中心互聯,并支持地區網絡,形成SNSFnet。1988 年,SNSFnet替代ARPAnet成為Internet的主干網。NSFnet主干網利用了在ARPAnet中已證明是非常成功的TCP/IP技術,準許各大學、政府或私人科研機構的網絡加入。1989年,ARPAnet解散,Internet從軍用轉向民用。
Internet的發展引起了商家的極大興趣。1992年,美國IBM、MCI、MERIT三家公司聯合組建了一個高級網絡服務公司(SNS),建立了一個新的網絡,叫做SNSnet,成為Internet的另一個主干網。它與SNSFnet不同,NSFnet是由國家出資建立的,而SNSnet則是SNS 公司所有,從而使Internet開始走向商業化。 1995年4月30日,SNSFnet正式宣布停止運作。而此時Internet的骨干網已經覆蓋了全球91個國家,主機已超過400萬臺。在最近,因特網更以驚人的速度向前發展,很快就達到了的規模
在90年代,超文本標識語言(HTML),即一個可以獲得因特網的圖像信息的超文本因特網協議被采用,使每一個人可以產生自己的圖像頁面(網址),然后成為一個巨大的虛擬超文本網絡的組成部分。這個增強型的因特網又被非正式地稱為萬維網,與此同時產生了數量龐大的新用戶群。于是,許多人用“因特網” 一詞指這個網絡的物理結構,包括連接所有事物的客戶機、服務器和網絡;而用“萬維網”一詞指利用這個網絡可以訪問的所有網站和信息。
1.2 Internet 和中國
北京時間1987年9月20日,錢天白建立起一個網絡節點,通過電話撥號連接到國際互聯網,向他的德國朋友發出來自中國的第一封電子郵件:Across the Great Wall we can reach every corner in the world,自此,中國與國際計算機網絡開始連接在一起
1990年10月, 錢天白教授代表中國正式在國際互聯網絡信息中心的前身DDN-NIC注冊登記了我國的頂級域名CN,并且從此開通了使用中國頂級域名CN的國際電子郵件服務。由于當時中國尚未正式連入Internet,所以委托德國卡爾斯魯厄大學運行CN域名服務器
1993年3月2日, 中國科學院高能物理研究所租用AT&T公司的國際衛星信道接入美國斯坦福線性加速器中心(SLAC)的64K專線正式開通,專線開通后,美國政府以Internet上有許多科技信息和其它各種資源,不能讓社會主義國家接入為由,只允許這條專線進入美國能源網而不能連接到其它地方。盡管如此,這條專線仍是我國部分連入Internet的第一根專線
1994年4月20日,中國通過一條64k的國際專線全功能接入國際互聯網,成為國際互聯網大家庭中的第77個成員,正式開啟了互聯網時代。隨后,中科院高能物理研究所推出第一個WWW網站和第一套網頁
1994年5月21日, 在錢天白教授和德國卡爾斯魯厄大學的協助下,中國科學院計算機網絡信息中心完成了中國國家頂級域名(CN)服務器的設置,改變了中國CN頂級域名服務器一直放在國外的歷史
1995年5月17日, 第27個世界電信日,郵電部正式宣布,向國內社會開放計算機互聯網接入服務
1995年5月,北京的中關村南大街上出現了一塊巨大的廣告牌,“中國離信息高速公路還有多遠?向北1500米?!蹦莻€位置就是一家叫“瀛海威”的網絡科教館,瀛海威正是information highway的音譯,作為中國第一個互聯網接入服務商,瀛海威幾乎就是當時互聯網的代名詞
1996年1月,中國互聯網全國骨干網建成并正式開通,開始提供服務
1995年4月,馬云湊了兩萬塊錢,成立杭州海博網絡公司,專門給企業做主頁
1997年5月,丁磊創立網易
1998年2月, 張朝陽創立搜狐
1998年6月18日,劉強東在中關村創辦京東公司,代理銷售光磁產品
1998年11月,馬化騰和張志東成立深圳市騰訊計算機系統有限公司,OICQ開通
1998年12月, 新浪網成立,關鍵人物:王志東
1999年5月18日,中國第一家電子商務企業8848.com成立,創始人王峻濤也曾被譽為“中國電子商務教父”。2000年底,調查顯示接近70%的人說上網買東西首選 8848
2000年1月,李彥宏創建了百度
2003年5月,阿里巴巴集團在創立淘寶網
2003年10月, 淘寶網首次推出支付寶服務
2004年1月,京東多媒體網正式開通,啟用域名www.jdlaser.com
2010年4月,雷軍創辦小米
2011年1月21日,騰訊公司推出微信 (WeChat)
2012年3月,今日頭條由張一鳴于創建
2012年7月10日,北京小桔科技有限公司成立,滴滴司機端3個月后北京上線
下一個又是誰呢?
中國互聯網連接世界
1885年臺灣建省,首任巡撫劉銘傳派人與福州船政聯系,使用船政電報學堂畢業生為技術人員,于1887年鋪設成功臺灣淡水至福州川石海底電纜,全長117海里。這是我國自行設計安裝的第一條海底電纜。此電纜毀于第二次世界大戰我國于1989年開始投入到全球海底光纜的投資與建設中來,并于1993年實現了首條國際海底光纜的登陸(中日之間C-J海底光纜系統);隨后在1997年,我國參與建設的全球海底光纜系統(FLAG)建成并投入運營,這也是第一條在我國登陸的洲際海底光纜中國連接世界目前共有8條光纜,四個登陸站允許入境,目前我國的登陸站設立在三個城市的四個地區,分別是山東青島登陸站(隸屬中國聯通)、上海崇明登陸站(隸屬中國電信)、上海南匯登陸站(隸屬中國聯通)和廣東汕頭登陸站(隸屬中國電信)
1.3 跨網絡的主機間通訊
Socket套接字
套接字Socket是進程間通信IPC的一種實現,允許位于不同主機(或同一主機)上不同進程之間進行通信和數據交換,SocketAPI出現于1983年,4.2 BSD實現
在建立通信連接的每一端,進程間的傳輸要有兩個標志:IP地址和端口號,合稱為套接字地址 socket address 客戶機套接字地址定義了一個唯一的客戶進程 服務器套接字地址定義了一個唯一的服務器進程
Socket API
封裝了內核中所提供的socket通信相關的系統調用 Socket Domain:根據其所使用的地址 AF_INET:Address Family,IPv4 AF_INET6:IPv6 AF_UNIX:同一主機上不同進程之間通信時使用 Socket Type:根據使用的傳輸層協議 SOCK_STREAM:流,tcp套接字,可靠地傳遞、面向連接 SOCK_DGRAM:數據報,udp套接字,不可靠地傳遞、無連接 SOCK_RAW: 裸套接字,無須tcp或udp,APP直接通過IP包通信
客戶/服務器程序的套接字函數
套接字相關的系統調用:
- socket() 創建一個套接字
- bind() 綁定IP和端口
- listen() 監聽
- accept() 接收請求
- connect() 請求連接建立
- write() 發送
- read() 接收
- close() 關閉連接
范例:socket實現
[root@centos8 ~]#strace -ff -o nc.log nc -l 8000
[root@centos7 ~]#nc 10.0.0.8 8000
范例:
[root@centos8 ~]#dnf -y install man-pages [root@centos8 ~]#man 2 socket [root@centos8 ~]#man 2 bind [root@centos8 ~]#man 2 listen [root@centos8 ~]#man 2 accept [root@centos8 ~]#man 2 read [root@centos8 ~]#man 2 write [root@centos8 ~]#man 2 connect [root@centos8 ~]#man 2 close
范例:Socket通信Python 3.6實現
#需要安裝python3 [root@centos8 ~]#dnf install python3 #服務器端tcpserver.py #!/usr/bin/python3 import socket HOST='127.0.0.1' PORT=9527 BUFFER=4096 sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.bind((HOST,PORT)) sock.listen(3) print('tcpServer listen at: %s:%s\n\r' %(HOST,PORT)) while True: client_sock,client_addr=sock.accept() print('%s:%s connect' %client_addr) while True: recv=client_sock.recv(BUFFER) if not recv: client_sock.close() break print('[Client %s:%s said]:%s' %(client_addr[0],client_addr[1],recv.decode())) client_sock.send(b'tcpServer has received your message') sock.close() #服務器端tcpclient.py #!/usr/bin/python3 import socket HOST='127.0.0.1' PORT=9527 BUFFER=4096 sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.connect((HOST,PORT)) sock.send(b'hello, tcpServer!,I am tcp client') recv=sock.recv(BUFFER) print('[tcpServer said]: %s' % recv.decode()) sock.close()
1.4 HTTP 超文本傳輸協議
1.4.1 瀏覽器訪問網站的過程
1.4.2 HTTP協議通信過程
HTTP(HyperText Transfer Protocol,超文本傳輸協議)是一種用于分布式、協作式和超媒體信息系統的應用層協議[1]。HTTP是萬維網的數據通信的基礎設計HTTP最初的目的是為了提供一種遠距離共享知識的方式,借助多文檔進行關聯實現超文本,連成相互參閱的WWW(world wide web,萬維網)
HTTP的發展是由蒂姆·伯納斯-李(Tim Berners-Lee)于1989年在歐洲核子研究組織(CERN)所發起。HTTP的標準制定由萬維網協會(World Wide Web Consortium,W3C)和互聯網工程任務組(Internet Engineering Task Force,IETF)進行協調,最終發布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定義了HTTP協議中現今廣泛使用的一個版本——HTTP 1.1版
HTTP服務通信過程
HTTP協議分層
1.4.3 HTTP相關技術和術語
1.4.3.1 WEB開發語言
http:Hyper Text Transfer Protocol 應用層協議,默認端口: 80/tcp
WEB前端開發語言:
- html
- css
- javascript
html
Hyper Text Markup Language 超文本標記語言,編程語言,主要負責實現頁面的結構
范例:html 語言
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>HTML語言</title>
</head>
<body>
<img src="http://www.magedu.com/wp-content/uploads/2017/09/logo.png" >
<h1 style="color:red">歡迎</h1>
<p><a href=http://www.magedu.com>馬哥教育</a>歡迎你</p>
</body>
</html>
CSS
Cascading Style Sheet 層疊樣式表, 定義了如何顯示(裝扮) HTML 元素,比如:字體大小和顏色屬性等。樣式通常保存在外部的 .css 文件中。通過僅僅編輯一個簡單的 CSS 文檔,可以同時改變站點中所有頁面的布局和外觀。
范例 :CSS
#test.html <html> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> <link rel="stylesheet" type="text/css" href="mystyle.css" rel="external nofollow" target="_blank" /> </head> <body> <h1>這是 heading 1</h1> <p>這是一段普通的段落。請注意,該段落的文本是紅色的。在 body 選擇器中定義了本頁面中的默認文本顏色。</p> <p class="ex">該段落定義了 class="ex"。該段落中的文本是藍色的。</p> </body> </html> #mystyle.css body {color:red} h1 {color:#00ff00} p.ex {color:rgb(0,0,255)}
Js
javascript,實現網頁的動畫效果,但實屬于靜態資源
范例:javascript
<!DOCTYPE html> <html> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> </head> <body> <h2>我的第一段 JavaScript</h2> <button type="button" onclick="document.getElementById('demo').innerHTML = Date()"> 點擊這里來顯示日期和時間 </button> <p id="demo"></p> </body> </html>
1.4.3.2 MIME
Multipurpose Internet Mail Extensions 多用途互聯網郵件擴展,對應文件 /etc/mime.types
MIME格式:major/minor
參考鏈接:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
http://www.w3school.com.cn/media/media_mimeref.asp
范例:
text/plain
text/html
text/css
image/jpeg
image/png
video/mp4
application/javascript
1.4.3.3 URI和URL
URI: Uniform Resource Identifier 統一資源標識,分為URL 和 URN URN:Uniform Resource Naming,統一資源命名 示例: P2P下載使用的磁力鏈接是URN的一種實現 magnet:?xt=urn:btih:660557A6890EF888666 URL:Uniform Resorce Locator,統一資源定位符,用于描述某服務器某特定資源位置 兩者區別:URN如同一個人的名稱,而URL代表一個人的住址。換言之,URN定義某事物的身份,而URL提供查找該事物的方法。URN僅用于命名,而不指定地址
URL組成
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
scheme:方案,訪問服務器以獲取資源時要使用哪種協議 user:用戶,某些方案訪問資源時需要的用戶名 password:密碼,用戶對應的密碼,中間用:分隔 Host:主機,資源宿主服務器的主機名或IP地址 port:端口,資源宿主服務器正在監聽的端口號,很多方案有默認端口號 path:路徑,服務器資源的本地名,由一個/將其與前面的URL組件分隔 params:參數,指定輸入的參數,參數為名/值對,多個參數,用;分隔 query:查詢,傳遞參數給程序,如數據庫,用?分隔,多個查詢用&分隔 frag:片段,一小片或一部分資源的名字,此組件在客戶端使用,用#分隔
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
gcomm://10.0.2.7,10.0.2.17,10.0.2.27,10.0.2.37
http://www.magedu.com/bbs/hello;gender=f/send;type=title
https://list.jd.com/list.html?cat=670,671,672&ev=14_2&sort=sort_totalsales15_desc&trans=1
http://apache.org/index.html#projects-list
1.4.3.4 網站訪問量
網站訪問量統計的重要指標
- IP(獨立IP):即Internet Protocol,指獨立IP數。一天內來自相同客戶機IP 地址只計算一次,記錄遠程客戶機IP地址的計算機訪問網站的次數,是衡量網站流量的重要指標
- PV(訪問量): 即Page View, 頁面瀏覽量或點擊量,用戶每次刷新即被計算一次,PV反映的是瀏覽某網站的頁面數,PV與來訪者的數量成正比,PV并不是頁面的來訪者數量,而是網站被訪問的頁面數量
- UV(獨立訪客):即Unique Visitor,訪問網站的一臺電腦為一個訪客。一天內相同的客戶端只被計算一次??梢岳斫獬稍L問某網站的電腦的數量。網站判斷來訪電腦的身份是通過cookies實現的。如果更換了IP后但不清除cookies,再訪問相同網站,該網站的統計中UV數是不變的
網站統計:http://www.alexa.cn/rank/
范例:網站訪問統計
甲乙丙三人在同一臺通過 ADSL 上網的電腦上(中間沒有斷網),分別訪問 www.magedu.com 網站,并且每人共用一個瀏覽器,各個瀏覽了2個頁面,那么網站的流量統計是: IP: 1 PV:6 UV:1 若三人都是ADSL重新撥號后,各瀏覽了2個頁面,則 IP: 3 PV:6 UV:1
網站訪問量
QPS:request per second,每秒請求數
PV,QPS和并發連接數換算公式
- QPS= PV * 頁面衍生連接次數/ 統計時間(86400)
- 并發連接數 =QPS * http平均響應時間
峰值時間:每天80%的訪問集中在20%的時間里,這20%時間為峰值時間
峰值時間每秒請求數(QPS)=( 總PV數 *頁面衍生連接次數)*80% ) / ( 每天秒數 * 20% )
1.4.4 HTTP工作機制
一次http事務包括:
- http請求:http request
- http響應:http response
Web資源:web resource, 一個網頁由多個資源(文件)構成,打開一個頁面,通常會有多個資源展示出來,但是每個資源都要單獨請求。因此,一個“Web 頁面”通常并不是單個資源,而是一組資源的集合
資源類型:
- 靜態文件:無需服務端做出額外處理 文件后綴:.html, .txt, .jpg, .js, .css, .mp3, .avi
- 動態文件:服務端執行程序,返回執行的結果 文件后綴:.php, .jsp ,.asp
HTTP連接請求
串行和并行連接
串行,持久連接和管道
提高HTTP連接性能
- 并行連接:通過多條TCP連接發起并發的HTTP請求
- 持久連接:keep-alive,重用TCP連接,以消除連接和關閉的時延,以事務個數和時間來決定是否關閉連接
- 管道化連接:通過共享TCP連接,發起并發的HTTP請求
- 復用的連接:交替傳送請求和響應報文(實驗階段)
1.4.5 HTTP 協議版本
http/0.9:
1991,原型版本,功能簡陋,只有一個命令GET。GET /index.html ,服務器只能回應HTML格式字符串,不能回應別的格式
http/1.0
1996年5月,支持cache, MIME, method 每個TCP連接只能發送一個請求,發送數據完畢,連接就關閉,如果還要請求其他資源,就必須再新建一個連接 引入了POST命令和HEAD命令 頭信息是 ASCII 碼,后面數據可為任何格式。服務器回應時會告訴客戶端,數據是什么格式,即Content-Type字段的作用。這些數據類型總稱為MIME 多用途互聯網郵件擴展,每個值包括一級類型和二級類型,預定義的類型,也可自定義類型, 常見Content-Type值:text/xml image/jpeg audio/mp3
http/1.1
1997年1月,引入了持久連接(persistent connection),即TCP連接默認不關閉,可以被多個請求復用,不用聲明Connection: keep-alive。對于同一個域名,大多數瀏覽器允許同時建立6個持久連接引入了管道機制,即在同一個TCP連接里,客戶端可以同時發送多個請求,進一步改進了HTTP協議的效率 新增方法:PUT、PATCH、OPTIONS、DELETE 同一個TCP連接里,所有的數據通信是按次序進行的。服務器只能順序處理回應,前面的回應慢,會有許多請求排隊,造成”隊頭堵塞”(Head-of-line blocking) 為避免上述問題,兩種方法:一是減少請求數,二是同時多開持久連接。
網頁優化技巧,如合并腳本和樣式表、將圖片嵌入CSS代碼、域名分片(domain sharding)等 HTTP 協議不帶有狀態,每次請求都必須附上所有信息。請求的很多字段都是重復的,浪費帶寬,影響速度
HTTP1.0和HTTP1.1的區別
- 緩存處理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires來做為緩存判斷的標準,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略
- 帶寬優化及網絡連接的使用,HTTP1.0中,存在一些浪費帶寬的現象,例如:客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,并且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),方便了開發者自由的選擇以便于充分利用帶寬和連接
- 錯誤通知的管理,在HTTP1.1中新增24個狀態響應碼,如409(Conflict)表示請求的資源與資源當前狀態沖突;410(Gone)表示服務器上的某個資源被永久性的刪除
- Host 頭處理,在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),并且它們共享一個IP地址。HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)
- 長連接,HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,在HTTP1.1中默認開啟Connection: keep-alive,彌補了HTTP1.0每次請求都要創建連接的缺點
HTTP1.0和1.1的問題
- HTTP1.x在傳輸數據時,每次都需要重新建立連接,無疑增加了大量的延遲時間,特別是在移動端更為突出
- HTTP1.x在傳輸數據時,所有傳輸的內容都是明文,客戶端和服務器端都無法驗證對方的身份,無法保證數據的安全性
- HTTP1.x在使用時,header里攜帶的內容過大,增加了傳輸的成本,并且每次請求header基本不怎么變化,尤其在移動端增加用戶流量
- 雖然HTTP1.x支持了keep-alive,來彌補多次創建連接產生的延遲,但是keep-alive使用多了同樣會給服務端帶來大量的性能壓力,并且對于單個文件被不斷請求的服務(例如圖片存放網站),keep-alive可能會極大的影響性能,因為它在文件被請求之后還保持了不必要的連接很長時間
HTTPS協議: 為解決安全問題,網景在1994年創建了HTTPS,并應用在網景導航者瀏覽器中。 最初,HTTPS是與SSL一起使用的;在SSL逐漸演變到TLS時(其實兩個是一個東西,只是名字不同而已),最新的HTTPS也由在2000年五月公布的RFC 2818正式確定下來。HTTPS就是安全版的HTTP,目前大型網站基本實現全站HTTPS
HTTPS特點
- HTTPS協議需要到CA申請證書,一般免費證書很少,需要交費
- HTTP協議運行在TCP之上,所有傳輸的內容都是明文,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,所有傳輸的內容都經過加密的
- HTTP和HTTPS使用的是不同的連接方式,端口不同,前者是80,后者是443
- HTTPS可以有效的防止運營商劫持,解決了防劫持的一個大問題
- HTTPS 實現過程降低用戶訪問速度,但經過合理優化和部署,HTTPS 對速度的影響還是可以接受的
SPDY協議
SPDY:2009年谷歌研發,綜合HTTPS和HTTP兩者有點于一體的傳輸協議,主要特點:
- 降低延遲,針對HTTP高延遲的問題,SPDY優雅的采取了多路復用(multiplexing)。多路復用通過多個請求stream共享一個tcp連接的方式,解決了HOL blocking的問題,降低了延遲同時提高了帶寬的利用率
- 請求優先級(request prioritization)。多路復用帶來一個新的問題是,在連接共享的基礎之上有可能會導致關鍵請求被阻塞。SPDY允許給每個request設置優先級,重要的請求就會優先得到響應。比如瀏覽器加載首頁,首頁的html內容應該優先展示,之后才是各種靜態資源文件,腳本文件等加載,可以保證用戶能第一時間看到網頁內容
- header壓縮。HTTP1.x的header很多時候都是重復多余的。選擇合適的壓縮算法可以減小包的大小和數量
- 基于HTTPS的加密協議傳輸,大大提高了傳輸數據的可靠性
- 服務端推送(server push),采用了SPDY的網頁,例如網頁有一個sytle.css的請求,在客戶端收到sytle.css數據的同時,服務端會將sytle.js的文件推送給客戶端,當客戶端再次嘗試獲取sytle.js時就可以直接從緩存中獲取到,不用再發請求了
HTTP2協議
http/2.0:2015年,HTTP2.0是SPDY的升級版
- 頭信息和數據體都是二進制,稱為頭信息幀和數據幀
- 復用TCP連接,在一個連接里,客戶端和瀏覽器都可以同時發送多個請求或回應,且不用按順序一一對應,避免了“隊頭堵塞“,此雙向的實時通信稱為多工(Multiplexing)
- 引入頭信息壓縮機制(header compression),頭信息使用gzip或compress壓縮后再發送;客戶端和服務器同時維護一張頭信息表,所有字段都會存入這個表,生成一個索引號,不發送同樣字段,只發送索引號,提高速度
- HTTP/2 允許服務器未經請求,主動向客戶端發送資源,即服務器推送(server push)
HTTP2.0和SPDY區別:
- HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
- HTTP2.0 消息頭的壓縮算法采用 HPACK,而非 SPDY 采用的 DEFLATE
1.4.6 HTTP 請求訪問的完整過程
一次完整的http請求處理過程 1、建立連接:接收或拒絕連接請求 2、接收請求:接收客戶端請求報文中對某資源的一次請求的過程
Web訪問響應模型(Web I/O)
- 單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
- 多進程I/O模型:并行啟動多個進程,每個進程響應一個連接請求
- 復用I/O結構:啟動一個進程,同時響應N個連接請求
- 復用的多進程I/O模型:啟動M個進程,每個進程響應N個連接請求,同時接收M*N個請求
3、處理請求:服務器對請求報文進行解析,并獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
常用請求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4、訪問資源: 服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行后生成的資源
5、構建響應報文: 一旦Web服務器識別除了資源,就執行請求方法中描述的動作,并返回響應報文。響應報文中 包含有響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體 1)響應實體:如果事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中通常包括: 描述了響應主體MIME類型的Content-Type首部 描述了響應主體長度的Content-Length 實際報文的主體內容 2)URL重定向:web服務構建的響應并非客戶端請求的資源,而是資源另外一個訪問路徑 3)MIME類型: Web服務器要負責確定響應主體的MIME類型。多種配置服務器的方法可將MIME類型與資源管理起來
- 魔法分類:Apache web服務器可以掃描每個資源的內容,并將其與一個已知模式表(被稱為魔法文件)進行匹配,以決定每個文件的MIME類型。這樣做可能比較慢,但很方便,尤其是文件沒有標準擴展名時
- 顯式分類:可以對Web服務器進行配置,使其不考慮文件的擴展名或內容,強制特定文件或目錄內容擁有某個MIME類型
- 類型協商: 有些Web服務器經過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置Web服務器,使其可以通過與用戶的協商來決定使用哪種格式(及相關的MIME類型)”最好”
6、發送響應報文 Web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。服務器可能有很多條到各個客戶端的連接,有些是空閑的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄連接的狀態,還要特別注意對持久連接的處理。對非持久連接而言,服務器應該在發送了整條報文之后,關閉自己這一端的連接。對持久連接來說,連接可能仍保持打開狀態,在這種情況下,服務器要正確地計算Content-Length首部,不然客戶端就無法知道響應什么時候結束
7、記錄日志 最后,當事務結束時,Web服務器會在日志文件中添加一個條目,來描述已執行的事務
本文鏈接:http://www.thecarconnectin.com/34090.html
網友評論comments