(http協(xié)議是什么晶默?有什么用炬守?)
一眠菇、輸入 www.baidu.com 訪問百度,瀏覽器做了哪些事情(Chrome為例)
1慈缔、首先 Chrome 搜索自身的 DNS 緩存。(如果 DNS 緩存中找到百度的 IP 地址种玛,就跳過了接下來查找 IP 地址步驟藐鹤,直接訪問該 IP 地址瓤檐。)
2、搜索操作系統(tǒng)自身的 DNS 緩存娱节。(瀏覽器沒有找到緩存或者緩存已經(jīng)失效)
3挠蛉、讀取硬盤中的 host 文件,里面記錄著域名到 IP 地址的映射關(guān)系肄满,Mac 電腦中位于 /etc/hosts谴古。(如果前1.2步驟都沒有找到)
4、瀏覽器向寬帶運營商服務(wù)器或者域名服務(wù)器發(fā)起一個DNS 解析請求稠歉,這里服務(wù)器有兩種方式解析請求掰担,這在稍后會講到,之后瀏覽器獲得了百度首頁的 IP 地址怒炸。
5带饱、拿到 IP 地址后,瀏覽器就向該 IP 所在的服務(wù)器建立TCP 連接(即三次握手)阅羹。
6勺疼、連接建立起來之后,瀏覽器就可以向服務(wù)器發(fā)起HTTP 請求了捏鱼。(這里比如訪問百度首頁执庐,就向服務(wù)器發(fā)起 HTTP 中的 GET 請求)
7、服務(wù)器接受到這個請求后导梆,根據(jù)路徑參數(shù)耕肩,經(jīng)過后臺一些處理之后,把處理后的結(jié)果返回給瀏覽器问潭,如果是百度首頁猿诸,就可以把完整的 HTML 頁面代碼返回給瀏覽器。
8狡忙、瀏覽器拿到了百度首頁的完整 HTML 頁面代碼梳虽,內(nèi)核和 JS 引擎就會解析和渲染這個頁面,里面的 JS灾茁,CSS窜觉,圖片等靜態(tài)資源也通過一個個 HTTP 請求進行加載。
9北专、瀏覽器根據(jù)拿到的資源對頁面進行渲染禀挫,最終把完整的頁面呈現(xiàn)給用戶。
10拓颓、如果瀏覽器沒有后續(xù)的請求语婴,那么就會跟服務(wù)器端發(fā)起TCP 斷開(即四次揮手)。
二、DNS 解析請求的兩種處理方式
1砰左、遞歸名稱解析
用戶直接向根名稱服務(wù)器發(fā)送請求匿醒,如圖中為訪問網(wǎng)址為 ftp.cs.vu.nl ,之后就不用管后續(xù)的請求了缠导,根名稱服務(wù)器知道 nl 服務(wù)器地址廉羔,并向其詢問其子域 ftp.cs.vu 的地址,之后不斷遞歸僻造,最終返回給用戶最終的 IP 地址憋他。
2、迭代名稱解析
客戶端向根名稱服務(wù)器發(fā)送查詢 ftp.cs.vu.nl 的地址時候髓削,根名稱服務(wù)器只知道 nl 地址竹挡,它并不管后續(xù)的請求,而是將該地址直接返回給用戶蔬螟,而用戶在獲得地址后繼續(xù)向 nl 結(jié)點服務(wù)器詢問 ftp.cs.vu 的地址此迅。相當于后續(xù)查詢需要自己用戶來完成,最后拿到 ftp.cs.vu.nl 的 IP 地址旧巾。
三耸序、HTTP基本概念—HTTP特性
HTTP,全稱為 HyperText Transfer Protocol鲁猩,即為超文本傳輸協(xié)議坎怪。是互聯(lián)網(wǎng)應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,所有的 www 文件都必須遵守這個標準廓握。
HTTP 是無連接無狀態(tài)的
HTTP 構(gòu)建于 TCP/IP 協(xié)議之上搅窿,默認端口號是 80
HTTP 可以分為兩個部分,即請求和響應(yīng)隙券。
四男应、HTTP基本概念—HTTP 請求
常用四種方法:GET,POST娱仔,PUT沐飘,DELETE
一個 URL 地址,對應(yīng)著一個網(wǎng)絡(luò)上的資源牲迫,而 HTTP 中的 GET耐朴,POST,PUT盹憎,DELETE 就對應(yīng)著對這個資源的查詢筛峭,修改,增添陪每,刪除4個操作
-
HTTP 請求由 3 個部分構(gòu)成:狀態(tài)行影晓,請求頭(Request Header)镰吵,請求正文。
GET.png
1俯艰、狀態(tài)行
由請求方式捡遍,路徑锌订、協(xié)議等構(gòu)成竹握,各元素之間以空格分隔。對應(yīng)到圖中即為 GET辆飘、/books/?sex=man&name=Professional啦辐、 HTTP/1.1
2、請求頭
提供一些參數(shù)比如:Cookie蜈项,用戶代理信息芹关,主機名等等。(圖中即從第二行到最后一行)
3紧卒、請求正文
存放一些發(fā)送的數(shù)據(jù)侥衬,一般 GET 請求會將參數(shù)放在 URL 中,也就是在請求頭中而請求正文一般為空跑芳,而 POST 請求將參數(shù)放在請求正文中轴总。請求正文可以傳一些 json 數(shù)據(jù)或者字符串等等。
4博个、GET請求和 POST 請求的區(qū)別
GET大小限制怀樟,安全低,POST則相反
GET請求需考慮緩存問題盆佣,POST無需關(guān)心
POST請求必須設(shè)置Content-Type值為application/x-form-www-urlencoded
GET請求的參數(shù)寫在url里往堡,所以send函數(shù)發(fā)送的參數(shù)為null,而POST請求的數(shù)據(jù)需要寫在send中
五共耍、HTTP基本概念—HTTP響應(yīng)
HTTP 響應(yīng)是服務(wù)器在客戶端發(fā)送 HTTP 請求后經(jīng)過一些處理而做出的響應(yīng)虑灰,也是由三個部分構(gòu)成。分別是:狀態(tài)行痹兜,響應(yīng)頭(Response Header)穆咐,響應(yīng)正文。
1佃蚜、狀態(tài)碼
狀態(tài)碼是由3位數(shù)組成庸娱,第一個數(shù)字定義了響應(yīng)的類別,且有五種可能取值:
- 1xx:指示信息–表示請求已接收谐算,繼續(xù)處理熟尉。
- 2xx:成功–表示請求已被成功接收、理解洲脂、接受斤儿。
- 3xx:重定向–要完成請求必須進行更進一步的操作剧包。
- 4xx:客戶端錯誤–請求有語法錯誤或請求無法實現(xiàn)。
- 5xx:服務(wù)器端錯誤–服務(wù)器未能實現(xiàn)合法的請求往果。
200 (成功) 服務(wù)器已成功處理了請求疆液。 通常,這表示服務(wù)器提供了請求的網(wǎng)頁陕贮。
204 (無內(nèi)容) 服務(wù)器成功處理了請求堕油,但沒有返回任何內(nèi)容。
301 (永久移動) 請求的網(wǎng)頁已永久移動到新位置肮之。 服務(wù)器返回此響應(yīng)(對 GET 或
HEAD 請求的響應(yīng))時掉缺,會自動將請求者轉(zhuǎn)到新位置。
302 (臨時移動) 服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求戈擒,但請求者應(yīng)繼續(xù)使用原有位置來
進行以后的請求眶明。
304 (未修改) 自從上次請求后,請求的網(wǎng)頁未修改過筐高。 服務(wù)器返回此響應(yīng)時搜囱,不會返回
網(wǎng)頁內(nèi)容。
400 (錯誤請求) 服務(wù)器不理解請求的語法柑土。
401 (未授權(quán)) 請求要求身份驗證蜀肘。 對于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)冰单。
403 (禁止) 服務(wù)器拒絕請求幌缝。
404 (未找到) 服務(wù)器找不到請求的網(wǎng)頁。
500 (服務(wù)器內(nèi)部錯誤) 服務(wù)器遇到錯誤诫欠,無法完成請求涵卵。
2、響應(yīng)報頭
常見的響應(yīng)報頭字段有: Server, Connection...荒叼。
3轿偎、響應(yīng)報文
服務(wù)器返回給瀏覽器的文本信息,通常HTML, CSS, JS, 圖片等文件就放在這一部分被廓。
4坏晦、完整流程
由 HTTP 客戶端發(fā)起一個請求,建立一個到服務(wù)器指定端口(默認是 80 端口)的 TCP 連接嫁乘。
HTTP 服務(wù)器則在那個端口監(jiān)聽客戶端發(fā)送過來的請求昆婿。一旦收到請求,服務(wù)器(向客戶端)發(fā)回一個狀態(tài)行蜓斧,比如"HTTP/1.1 200 OK"仓蛆,和(響應(yīng)的)消息,消息的消息體可能是請求的文件挎春、錯誤消息看疙、或者其它一些信息豆拨。
六、 HTTP 頭信息
1能庆、HTTP請求頭
以請求百度首頁為例
Accept:指定客戶端能夠接收的內(nèi)容類型施禾,如text/html ,返回的百度首頁就是個 HTML 文件
// gzip是 GNU zip 的縮寫,是一個 GNU 自由軟件的文件壓縮程序
// gzip也經(jīng)常用來表示 gzip 這種文件格式
// deflate: 同時使用 LZ77 算法和哈夫曼編碼(Huffman Coding)的一個無損數(shù)據(jù)壓縮算法
Accept-Encoding:表示瀏覽器有能力解碼的編碼類型搁胆。
Accept-Language:表示瀏覽器所支持的語言類型弥搞。(這里指中文、簡體中文和英文)
Cache-Control:指定請求和響應(yīng)遵循的緩存機制丰涉。(這里表示不需要緩存)
// HTTP 1.1 : 默認進行持久連接, 即為 keep-alive
// HTTP 1.0 : 默認為 close
Connection:表示是否需要持久連接拓巧。
Cookie:用于會話追蹤斯碌,在本文后面就繼續(xù)介紹一死。
Host:表示請求的服務(wù)器網(wǎng)址
User-Agent:用戶代理,簡稱 UA傻唾,它是一個特殊字符串頭投慈,使得服務(wù)器能夠識別客戶端使用的
操作系統(tǒng)及版本、CPU 類型冠骄、瀏覽器及版本伪煤、瀏覽器渲染引擎、瀏覽器語言凛辣、瀏覽器插件等抱既。
Content-Length: 請求的內(nèi)容長度
Referer: 先前訪問的網(wǎng)頁的地址,當前請求網(wǎng)頁緊隨其后扁誓,說明你是先前是從哪個網(wǎng)址點擊
訪問到該頁面的防泵,如果沒有則不填。
// GET 請求無該字段
// POST: application/x-www-form-urlencoded 普通的表單提交
// POST: multipart/form-data 文件上傳
Content-Type:內(nèi)容的類型
2蝗敢、HTTP 響應(yīng)頭
以百度舉例:
前一個是自定義字段捷泞,HTTP 請求頭中的字段是可以自定義的。Connection, Content-Encoding, Content-Type 和請求頭的內(nèi)容差不多寿谴,不再贅述锁右。
Date:原始服務(wù)器消息發(fā)出的時間。
Last-Modified:請求資源的最后修改時間讶泰。
Expires:響應(yīng)過期的日期和時間咏瑟,如果下次訪問在時間允許的范圍內(nèi),可以不用重新請求,
直接訪問緩存痪署。
Set-Cookie: 設(shè)置Http Cookie码泞,下次瀏覽器再次訪問的時候會帶上這個 Cookie 值。
Server:服務(wù)器軟件名稱惠桃,常見的有 Apache 和 Nginx浦夷。
七辖试、會話追蹤
1、基本概念
會話:客戶端向服務(wù)器端發(fā)起請求到服務(wù)端響應(yīng)客戶端請求的全過程劈狐。
會話跟蹤:會話追蹤指的是服務(wù)器對用戶響應(yīng)的監(jiān)視罐孝。
2、為什么需要會話跟蹤:
瀏覽器與服務(wù)器之間的通信是通過 HTTP 協(xié)議進行通信的肥缔,而HTTP 協(xié)議是”無狀態(tài)”的協(xié)議莲兢,它不能保存客戶的信息,即一次響應(yīng)完成之后連接就斷開了续膳,下一次的請求需要重新連接改艇,這樣就需要判斷是否是同一個用戶,所以才有會話跟蹤技術(shù)來實現(xiàn)這種要求坟岔。
比如你在訪問淘寶登錄之后會持續(xù)追蹤你的會話谒兄,記錄你的購物車記錄等等
3、會話跟蹤常用方法
URL 重寫:URL 重寫技術(shù)就是在 URL 結(jié)尾添加一個附加數(shù)據(jù)以標識該會話社付,把會話 ID 通過 URL 的信息傳遞過去承疲,以便在服務(wù)器進行識別不同的用戶。
隱藏表單域:將會話ID添加到HTML表單元素中提交到服務(wù)器鸥咖,此表單元素并不在客戶端顯示燕鸽。
Cookie:Cookie 是 Web 服務(wù)器發(fā)送給客戶端的一小段信息,客戶端請求時可以讀取該信息發(fā)送給服務(wù)器端啼辣,進而進行用戶的識別啊研,對于客戶端的每次請求,服務(wù)器都會將 Cookie 發(fā)送到客戶端鸥拧,客戶端保存下來党远,以便下次使用。
Session:在服務(wù)器端會創(chuàng)建一個 session 對象住涉,產(chǎn)生一個 sessionID 來標識這個 session 對象麸锉,然后將這個 sessionID 放入到 Cookie 中發(fā)送到客戶端,下一次訪問時舆声,sessionID 會發(fā)送到服務(wù)器花沉,在服務(wù)器端進行識別不同的用戶。
4媳握、Cookie
客戶端可以采用兩種方式來保存這個 Cookie 對象碱屁,一種方式是保存在客戶端內(nèi)存中,稱為臨時 Cookie蛾找,瀏覽器關(guān)閉后這個 Cookie 對象將消失娩脾。
另外一種方式是保存在客戶機的磁盤上,稱為永久 Cookie打毛。以后客戶端只要訪問該網(wǎng)站柿赊,就會將這個 Cookie 再次發(fā)送到服務(wù)器上俩功,前提是這個 Cookie 在有效期內(nèi),這樣就實現(xiàn)了對客戶的跟蹤碰声。
Cookie 是可以被禁止的诡蜓,當你打開 Chrome,在設(shè)置里面關(guān)閉 Cookie胰挑,那么你將再也無法登錄淘寶頁面蔓罚。
5、Session
每一個用戶都有一個不同的 session瞻颂,各個用戶之間是不能共享的豺谈,是每個用戶所獨享的,在 session 中可以存放信息贡这。
Session的實現(xiàn)依賴于Cookie茬末,如果Cookie被禁用,那么session也將失效藕坯。
八团南、持久連接
HTTP Keep-Alive 簡單說就是保持當前的TCP連接,避免了重新建立連接炼彪。HTTP 是一個無狀態(tài)無連接的協(xié)議,那么這是不是與 Keep-Alive 沖突正歼?
Keep-Alive 與無連接的特性沖突辐马,而對于無狀態(tài)的特性兩者并無矛盾,HTTP 無狀態(tài)無連接是在 1.0 版本中就規(guī)定的局义,而 Keep-Alive 則是在 1.1 版本中才被添加入規(guī)范喜爷。
無連接的意思是限制每個連接只有一個請求的意思,在服務(wù)器處理完客戶的請求萄唇,并收到客戶的反應(yīng)檩帐,即斷開。通過這種方式可以節(jié)省傳輸時間另萤。
Keep-Alive 確實破壞了這一特性湃密,而無狀態(tài)協(xié)議則意味著每個請求都是獨立的,互不干擾的四敞,互相沒有記憶的泛源。所以才需要有會話跟蹤這種機制來識別用戶。