貓哥網(wǎng)絡(luò)編程系列:詳解 BAT 面試題

從產(chǎn)品上線前的接口開(kāi)發(fā)和調(diào)試桑嘶,到上線后的 bug 定位炊汹、性能優(yōu)化,網(wǎng)絡(luò)編程知識(shí)貫穿著一個(gè)互聯(lián)網(wǎng)產(chǎn)品的整個(gè)生命周期逃顶。不論你是前后端的開(kāi)發(fā)崗位讨便,還是 SQA、運(yùn)維等其他技術(shù)崗位以政,掌握網(wǎng)絡(luò)編程知識(shí)均是崗位的基礎(chǔ)要求霸褒,即使是產(chǎn)品、設(shè)計(jì)等非技術(shù)崗位盈蛮,在灰度環(huán)境體驗(yàn)產(chǎn)品時(shí)也需要理解頁(yè)面緩存废菱、Host 切換等網(wǎng)絡(luò)基礎(chǔ)概念。

「貓哥網(wǎng)絡(luò)編程系列」一直是我想沉淀的一個(gè)技術(shù)知識(shí)點(diǎn)抖誉,因?yàn)槲艺J(rèn)為:網(wǎng)絡(luò)編程相關(guān)知識(shí)(尤其是 HTTP 協(xié)議)殊轴,是互聯(lián)網(wǎng)產(chǎn)品開(kāi)發(fā)當(dāng)中最重要的基礎(chǔ)知識(shí)(沒(méi)有之一)。掌握這方面的基礎(chǔ)知識(shí)寸五,對(duì)一個(gè)新手程序員來(lái)說(shuō)至關(guān)重要梳凛。本系列將會(huì)在我的微信公眾號(hào)「貓哥學(xué)前班」上連載,并在 Github 上維護(hù)更新梳杏。

使用「詳解 BAT 面試題」作為本文的副標(biāo)題韧拒,是為了吸引更多的技術(shù)新人瀏覽此文淹接,然而本文并非標(biāo)題黨。掌握本文所提到的知識(shí)點(diǎn)必將大幅提升程序員的面試成功率叛溢,因?yàn)椤妇W(wǎng)絡(luò)編程」方面的基礎(chǔ)知識(shí)塑悼,是 BAT 面試的必考項(xiàng)目。

從 BAT 面試題說(shuō)起

2009 年我在支付寶做前端開(kāi)發(fā)時(shí)楷掉,參與草擬了一份非正式的前端崗位招聘要求厢蒜。

這里有:

  1. 國(guó)內(nèi)最大的第三方支付舞臺(tái)民假,體驗(yàn)億萬(wàn)資金穿梭代碼的快感痹扇;
  2. 一群熱愛(ài)前端技術(shù)的伙伴,最快的成長(zhǎng)經(jīng)歷砖顷;
  3. 持續(xù)的培訓(xùn)體系草雕,完善的項(xiàng)目開(kāi)發(fā)環(huán)境巷屿,最具潛力的UED團(tuán)隊(duì)。

你需要:

  1. 熱愛(ài)前端墩虹,熱愛(ài)設(shè)計(jì)嘱巾,對(duì)新鮮事物充滿好奇心,喜歡搗鼓各種互聯(lián)網(wǎng)應(yīng)用诫钓;(興趣旬昭、學(xué)習(xí)能力、創(chuàng)新能力)
  2. 自我管理能力強(qiáng)菌湃,健康的創(chuàng)業(yè)心態(tài)问拘,樂(lè)于分享與溝通;(心態(tài)慢味、分享场梆、性格)
  3. 具備基本的前端素質(zhì),了解WEB標(biāo)準(zhǔn)化纯路、性能優(yōu)化方法,了解可用性寞忿、可訪問(wèn)性驰唬;(基本技能)
  4. 能和設(shè)計(jì)師談產(chǎn)品設(shè)計(jì),和后端開(kāi)發(fā)研討技術(shù)實(shí)現(xiàn)方案腔彰,制定服務(wù)接口叫编,崇尚團(tuán)隊(duì)合作;(向前向后能力)

當(dāng)時(shí)在面試時(shí)最流行問(wèn)的前端技術(shù)問(wèn)題是:Web 標(biāo)準(zhǔn)化霹抛、AJAX 與 YSlow搓逾。

  • 問(wèn):一個(gè) AJAX 請(qǐng)求從開(kāi)始創(chuàng)建到最后的響應(yīng)階段,在其整個(gè)生命周期中杯拐,使用到了哪些 JavaScript 對(duì)象與方法霞篡?
  • 問(wèn):YSlow 的 34 條性能優(yōu)化建議中世蔗,哪些與 HTTP 協(xié)議相關(guān),請(qǐng)盡可能多的列舉出來(lái)朗兵,并說(shuō)說(shuō)你的理解污淋?

2011 年我開(kāi)始成為騰訊的前端開(kāi)發(fā)面試官,負(fù)責(zé)騰訊電商的前端開(kāi)發(fā)(網(wǎng)頁(yè)重構(gòu)方向)筆試出題與面試工作余掖。在 2012 年的校招過(guò)程中寸爆,我發(fā)現(xiàn)不論是我出的筆試題,還是其他面試官出的題目盐欺,HTTP 協(xié)議相關(guān)的知識(shí)都是必考項(xiàng)赁豆。例如,

  • 問(wèn):HTTP 協(xié)議中與緩存相關(guān)的 HTTP Header 有哪些冗美?
  • 問(wèn):列舉出你所知道的 HTTP 狀態(tài)碼歌憨,并描述它們的含義與發(fā)生的場(chǎng)景?

后來(lái)我在學(xué)習(xí)百度 FIS 框架的過(guò)程中墩衙,無(wú)意間看到百度 FEX 團(tuán)隊(duì)的這份開(kāi)源前端開(kāi)發(fā)面試題务嫡,不出所料,同樣有一道與網(wǎng)絡(luò)編程相關(guān)的題目:

一個(gè)頁(yè)面從輸入 URL 到頁(yè)面加載完的過(guò)程中都發(fā)生了什么事情漆改?越詳細(xì)越好

由此可見(jiàn)心铃,網(wǎng)絡(luò)編程相關(guān)知識(shí)的確是 BAT 前端面試題中的必考項(xiàng),而對(duì)于負(fù)責(zé)輸出 API 接口的后臺(tái)開(kāi)發(fā)崗位來(lái)說(shuō)挫剑,更是如此:

  • 問(wèn):一個(gè) POST 請(qǐng)求的 Content-Type 有多少種去扣,傳輸?shù)臄?shù)據(jù)格式有何區(qū)別?
  • 問(wèn):什么是 RESTful API樊破,如何設(shè)計(jì)一個(gè) Open API 的接口愉棱?

解題思路

接下來(lái)我們一起探討下具體的解題思路,瀏覽完本文之后哲戚,你將會(huì)首先掌握 HTTP 協(xié)議相關(guān)的前后端基礎(chǔ)知識(shí)奔滑。

要掌握 HTTP ,就需要先看到 HTTP 到底長(zhǎng)什么樣顺少?(不了解「網(wǎng)絡(luò)七層協(xié)議模型」和 TCP 的同學(xué)先不著急朋其,本系列的后面幾篇會(huì)涉及到。)

1脆炎、安裝 HTTP 抓包工具

在 Chrome 開(kāi)發(fā)者工具下我們可以看到梅猿,打開(kāi)一個(gè)網(wǎng)頁(yè)后,瀏覽器會(huì)發(fā)起許多 HTTP 的請(qǐng)求(HTTP Request)秒裕,這些請(qǐng)求經(jīng)過(guò)服務(wù)器端處理后會(huì)返回對(duì)應(yīng)的數(shù)據(jù)(HTTP Response)袱蚓,瀏覽器會(huì)按照這些數(shù)據(jù)的類(lèi)型將它們渲染出來(lái)。

Chrome Network Panel

Chrome 中看到的 Request/Response Header 是其格式化之后的形式几蜻,要看到它們的原始模樣(Raw Source)喇潘,我們需要借助兩個(gè) HTTP 接口調(diào)試?yán)鳌?/p>

其中 Windows 系統(tǒng)下使用 Fiddler体斩,Mac 系統(tǒng)下使用 Charles。Fiddler 具體的安裝與使用教程响蓉,請(qǐng)自行百度(安裝 Fiddler4 還需同時(shí)安裝 .NET Framework 4)硕勿,Charles 相關(guān)教程,推薦參考 iOS 大神唐巧的《Charles 從入門(mén)到精通》枫甲。使用 Linux 系統(tǒng)的說(shuō)明已經(jīng)是網(wǎng)絡(luò)編程方面的大牛了源武,不需要繼續(xù)往下看 :P

2、查看 HTTP 詳細(xì)報(bào)文

運(yùn)行 Fiddler(或 Charles) 之后想幻,使用 Chrome 瀏覽器打開(kāi)「貓哥學(xué)前班」的新浪微博主頁(yè):http://weibo.com/mgxqb

在 Fiddler 左側(cè)面板下選中該條 HTTP 請(qǐng)求粱栖,再將右側(cè)面板的請(qǐng)求部分和響應(yīng)部分都切換到 Raw 標(biāo)簽頁(yè)。如下圖所示:

Fiddler Panel

Charles 下的操作與 Fiddler 類(lèi)似:

Charles Panel

HTTP 協(xié)議規(guī)范由 W3C 制定脏毯,與具體的抓包工具無(wú)關(guān)闹究,接下來(lái)我們主要以 Charles 為例,詳細(xì)講解下 HTTP 的報(bào)文格式食店,這對(duì)理解基于 HTTP 的 API 接口設(shè)計(jì)和網(wǎng)頁(yè)性能優(yōu)化有很大幫助渣淤。

我們先看一下請(qǐng)求頭的源碼(Request Raw),為了防止隱私泄露吉嫩,我已刪除部分 Cookie 信息:

GET /mgxqb HTTP/1.1
Host: weibo.com
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
Cookie: YF-Page-G0=f70469e0b5607cacf38b47457e34254f; _s_tentry=passport.weibo.com


仔細(xì)觀察以上源碼价认,我們能大概總結(jié)出 HTTP 協(xié)議的格式規(guī)范:

  • 第一行定義了請(qǐng)求類(lèi)型(GET)、請(qǐng)求路徑(/mgxqb)與協(xié)議類(lèi)型及其版本號(hào)(HTTP/1.1)自娩,使用一個(gè)半角空格間隔這三塊信息用踩;
  • 示例源碼的最后是兩個(gè)空行。由于 HTTP 規(guī)范中要求一個(gè)合法的 HTTP 報(bào)文至少包含有一個(gè)空行忙迁,其中第一個(gè)空行用來(lái)間隔報(bào)文的頭部信息(HTTP Request/Response Header)和主體信息(HTTP Request/Response Body)脐彩。在空行的下一行是報(bào)文的主體信息,由于本例為 GET 類(lèi)型請(qǐng)求姊扔,其主體(Body)信息通常為空惠奸,這便是第二個(gè)空行的含義;
  • 余下的部分有著相同的格式旱眯,即 「HTTP Header 字段名+半角冒號(hào)+半角空格+值」晨川,我們可以把它看成 YAML 格式的簡(jiǎn)易版。其中 HTTP Header 在規(guī)范中有著明確的定義删豺,具體參見(jiàn) HTTP頭字段列表

這便是一個(gè) HTTP 協(xié)議報(bào)文的源碼格式愧怜,以下我們簡(jiǎn)單講解下最常見(jiàn)的 HTTP header 的含義呀页。

3、常見(jiàn) HTTP header

User-Agent:客戶端身份標(biāo)識(shí)

User-Agent (以下簡(jiǎn)稱(chēng) UA)字段記錄了訪問(wèn)當(dāng)前網(wǎng)頁(yè)的用戶瀏覽器的類(lèi)型與版本拥坛、操作系統(tǒng)類(lèi)型與版本蓬蝶。根據(jù)不同的 UA 信息尘分,提供不同的站點(diǎn)內(nèi)容是使用 UA 的常見(jiàn)場(chǎng)景。例如丸氛,如果用戶使用手機(jī)訪問(wèn)魅族官網(wǎng) www.meizu.com培愁,瀏覽器會(huì)自動(dòng)跳轉(zhuǎn)至魅族手機(jī)官網(wǎng) m.meizu.com。這種跳轉(zhuǎn)實(shí)現(xiàn)既可以由前端 JavaScript 完成缓窜,也可以通過(guò)后端返回 302 重定向來(lái)完成定续。

JavaScript 訪問(wèn) window.navigator.userAgent 屬性即可獲取該信息。雖然該屬性是只讀的禾锤,但有很多前端手段可以偽造 UA 私股。如下圖,Chrome 開(kāi)發(fā)者工具在模擬不同的手機(jī)機(jī)型時(shí)恩掷,也會(huì)改變?yōu)g覽器 UA 值倡鲸。由此可見(jiàn),通過(guò)檢測(cè) HTTP User-Agent Header 來(lái)識(shí)別是否為爬蟲(chóng)程序黄娘,不是一個(gè)有效的方法峭状。

使用 Chrome 開(kāi)發(fā)者工具模擬不同手機(jī)設(shè)備 UA

在 PHP 中,所有的 HTTP Header 字段信息都保存在 $_SERVER 對(duì)象中逼争,通過(guò)訪問(wèn) $_SERVER['HTTP_USER_AGENT'] 即可獲取 User-Agent 的值优床。

Cookie:用戶身份標(biāo)識(shí)

由于 HTTP 協(xié)議最初被設(shè)計(jì)成一種無(wú)狀態(tài)的數(shù)據(jù)傳輸協(xié)議,服務(wù)器端無(wú)法判斷每次處理的請(qǐng)求相互之間以及與之前處理的請(qǐng)求之間的關(guān)系氮凝,Cookie 的設(shè)計(jì)就是為了解決這個(gè)問(wèn)題羔巢。

用戶在瀏覽器中首次訪問(wèn)一個(gè)站點(diǎn)時(shí),會(huì)通過(guò)請(qǐng)求響應(yīng)頭或頁(yè)面JS腳本生成一些用于標(biāo)識(shí)用戶身份的 Cookie 信息罩阵,這些信息會(huì)按照域名分類(lèi)竿秆,存放在瀏覽器本地緩存文件當(dāng)中。例如 Windows 系統(tǒng)下通過(guò)訪問(wèn) 「C:\Users<用戶名>\AppData\Local\Microsoft\Windows\Temporary Internet Files」 目錄可以查看到 IE 瀏覽器保存在本地的 Cookie 文件稿壁。當(dāng)用戶再次訪問(wèn)該站點(diǎn)時(shí)幽钢,這些 Cookie 信息會(huì)被瀏覽器自動(dòng)添加到 HTTP Request Header 的 Cookie 字段中,服務(wù)器通過(guò)讀取這些信息傅是,來(lái)區(qū)分當(dāng)前請(qǐng)求的用戶身份與狀態(tài)匪燕。

瀏覽器可以通過(guò)讀寫(xiě) document.cookie 屬性來(lái)添加或刪除 Cookie 信息,服務(wù)器端可以通過(guò) HTTP Response Header(響應(yīng)頭)中的 Set-Cookie 來(lái)改寫(xiě)客戶端的 Cookie 信息喧笔。每一條 Cookie 屬性通常都會(huì)設(shè)置一個(gè)過(guò)期時(shí)間帽驯,過(guò)期之后的 Cookie 瀏覽器將會(huì)自動(dòng)清理它們,不會(huì)再被攜帶在 HTTP Request Header(請(qǐng)求頭)中书闸。

例如尼变,以下 PHP 語(yǔ)句可以通過(guò)設(shè)置 Cookie 過(guò)期時(shí)間為前一個(gè)小時(shí)來(lái)觸發(fā)客戶端 Cookie 過(guò)期,達(dá)到刪除 Cookie 的目的:

setcookie('key', '', time() - 3600, '/'); 

由于 Cookie 通常用于記錄用戶「帳號(hào)信息」和用戶的「操作記錄」浆劲,所以泄露 Cookie 會(huì)帶來(lái)個(gè)人帳號(hào)與隱私泄露的風(fēng)險(xiǎn)嫌术。這也是為什么你在百度上搜索「貸款」的關(guān)鍵詞之后哀澈,訪問(wèn)其他網(wǎng)站時(shí)就能看到相關(guān)的推薦廣告,甚至第二天就會(huì)有各種放貸電話找上門(mén)來(lái)度气。

又由于 Cookie 可以隨意被客戶端修改(通過(guò)修改 document.cookie 屬性)割按,因此瀏覽器廠商們一起制定了 HttpOnly 的 Cookie 機(jī)制。服務(wù)器端在 setcookie 時(shí)磷籍,通過(guò)設(shè)置 HttpOnly 的標(biāo)識(shí)适荣,可以防止客戶端通過(guò) JavaScript 修改 Cookie 的信息。不過(guò)這種方法對(duì)于基于 HTTP 協(xié)議進(jìn)行篡改的方法來(lái)說(shuō)無(wú)法防范择示,在之后的貓哥網(wǎng)絡(luò)編程系列中束凑,我將會(huì)介紹如何通過(guò)監(jiān)控 Wi-Fi 流量來(lái)截取、偽造用戶身份栅盲。

在 YSlow 性能優(yōu)化最佳實(shí)踐中汪诉,有兩條與 Cookie 相關(guān)的建議:

雖然瀏覽器對(duì) Cookie 的大小與數(shù)量有著較為嚴(yán)格的限制,但很多網(wǎng)站(尤其是包含登錄態(tài)的)的 Cookie 信息量通常比其他所有 HTTP Header 加起來(lái)的還要多谈秫。為了減少不必要的 HTTP 數(shù)據(jù)傳輸量扒寄,YSlow 給出了以上兩條優(yōu)化建議。由于網(wǎng)頁(yè)的靜態(tài)資源(圖片拟烫、CSS该编、JS)文件無(wú)需記錄用戶狀態(tài),因此通常會(huì)使用一個(gè)額外的域名(Cookie 是按域名來(lái)分類(lèi)存儲(chǔ))來(lái)存放靜態(tài)資源文件硕淑。

我們使用 Chrome 開(kāi)發(fā)者工具查看「貓哥學(xué)前班」新浪微博主頁(yè)课竣,可以看到新浪微博使用了 img.t.sinajs.cn 的域名來(lái)存放它的 CSS 文件,這個(gè)域名發(fā)起的 HTTP Request Header 中沒(méi)有自動(dòng)帶上 Cookie 字段信息 (因?yàn)榍昂蠖四_本都沒(méi)有在這個(gè)域名上設(shè)置 Cookie置媳,而是設(shè)置在了 weibo.com 域名上):

Use Cookie-free Domains

這里還需要引申一個(gè)知識(shí)點(diǎn):Session于樟,它和 Cookie 有什么關(guān)系?由于 Session 與本文所講的 HTTP 協(xié)議關(guān)系不大拇囊,相關(guān)知識(shí)點(diǎn)請(qǐng)自行百度迂曲。

Cache-Control:瀏覽器資源緩存標(biāo)識(shí)

網(wǎng)站性能優(yōu)化中,最為關(guān)鍵的是緩存機(jī)制(又是沒(méi)有之一)寥袭。在服務(wù)器端通常會(huì)使用 Memcached路捧、Redis 等服務(wù)來(lái)緩存經(jīng)常訪問(wèn)的數(shù)據(jù)。例如在一個(gè)電商網(wǎng)站中传黄,用戶經(jīng)常訪問(wèn)的熱賣(mài)商品數(shù)據(jù)會(huì)被緩存在內(nèi)存中杰扫,用戶在一定時(shí)間內(nèi)訪問(wèn)商品詳情頁(yè)時(shí),后臺(tái)程序直接從緩存服務(wù)中獲取這段數(shù)據(jù)膘掰,這種方法可以大幅降低數(shù)據(jù)庫(kù)的訪問(wèn)壓力涉波。

在用戶端,瀏覽器會(huì)有一系列機(jī)制通過(guò)緩存來(lái)提升頁(yè)面加載速度炭序。例如 IE/Chrome 都會(huì)緩存 GET 類(lèi)型的 AJAX 請(qǐng)求啤覆,IE 甚至?xí)彺?POST 類(lèi)型的請(qǐng)求,需要通過(guò)增加時(shí)間戳參數(shù)的方式來(lái)強(qiáng)制清除緩存惭聂。對(duì)于所有的靜態(tài)資源文件來(lái)說(shuō)窗声,最佳實(shí)踐是為它們?cè)黾右粋€(gè) 「Never Expires」(永不過(guò)期)的強(qiáng)(長(zhǎng))緩存,以下是一個(gè)強(qiáng)緩存靜態(tài)資源服務(wù)器的 Nginx 配置示例:

server {
    listen 80;
    server_name yekai.net;
    root /var/www/yekai.net;

    location / {
        index index.html index.htm;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {  
        expires 365d;  
    }
}

通過(guò)配置 「expires 365d」辜纲,HTTP Response Header(響應(yīng)頭)中會(huì)返回 「Cache-Control: max-age=31536000」 的頭字段笨觅,配合 Last-Modified 頭字段。瀏覽器便可以自動(dòng)完成資源的強(qiáng)緩存耕腾。

Cache-Control 是瀏覽器緩存機(jī)制中最為重要的一個(gè)配置见剩,以下是瀏覽器加載靜態(tài)資源文件時(shí)的緩存檢查機(jī)制流程:

瀏覽器緩存檢查機(jī)制流程

由此可見(jiàn),靜態(tài)資源緩存優(yōu)化的最佳狀態(tài)是:直接從本地緩存中讀取 > 304 狀態(tài) > 200 狀態(tài)扫俺。關(guān)于 HTTP 狀態(tài)碼苍苞,與網(wǎng)站性能優(yōu)化有關(guān)的主要是以下幾個(gè)。

  • 盡量減少 200 狀態(tài)碼的請(qǐng)求狼纬。200 表示是一個(gè)正常的請(qǐng)求返回羹呵,此條優(yōu)化規(guī)則要求盡可能多的減少頁(yè)面的 HTTP Request 數(shù)量。常見(jiàn)的方法有:合并打包靜態(tài)資源疗琉、使用 CSS Sprite 雪碧圖合并冈欢、緩存 AJAX、使用 LocalStorage/UserData/Manifest 等本地緩存技術(shù)盈简。
  • 清理返回 301/302 狀態(tài)碼的入口鏈接凑耻。301 表示永久重定向,302 表示臨時(shí)重定向柠贤。服務(wù)器端使用重定向返回通常是為了兼容一個(gè)舊的入口鏈接香浩。我們能做的優(yōu)化是,將調(diào)用舊入口的場(chǎng)景進(jìn)行清理种吸,直接調(diào)用重定向之后的新 URL 地址弃衍。
  • 304 表示靜態(tài)資源未更新,瀏覽器可直接使用本地緩存文件坚俗。通常 304 的產(chǎn)生與瀏覽器的處理機(jī)制以及服務(wù)器緩存頭配置有一定的關(guān)系镜盯。304 雖然未傳輸文件主體內(nèi)容,但 HTTP 請(qǐng)求的建立依然是一個(gè)可以避免的性能損耗猖败。騰訊 KM(內(nèi)部知識(shí)分享平臺(tái))上有一篇文章通過(guò)在真實(shí)海量業(yè)務(wù)場(chǎng)景(沒(méi)記錯(cuò)的話是 Qzone 業(yè)務(wù))中速缆,正交驗(yàn)證 HTTP 1.0 與 1.1 協(xié)議中與緩存相關(guān)的 HTTP Header 配置,結(jié)合日志分析得出了一個(gè)最佳實(shí)踐:關(guān)閉 Etag 配置恩闻,只啟用 Cache-Control 與 Last-Modified 響應(yīng)頭艺糜。為了兼容老瀏覽器,可保留 Expires。因?yàn)?Etag 的緩存方案破停,在經(jīng)過(guò) CDN 及網(wǎng)關(guān)代理服務(wù)器后翅楼,會(huì)導(dǎo)致緩存命中率下降。從以上「瀏覽器緩存檢查機(jī)制流程」圖上可以看出真慢,使用強(qiáng)緩存(Cache-Control max-age 設(shè)置為一年)后瀏覽器在資源過(guò)期前不會(huì)發(fā)起 HTTP 請(qǐng)求毅臊,那如何保證靜態(tài)資源在服務(wù)器上更新后本地的緩存也能同步更新呢?可參考百度 FIS 的「文件指紋」方案黑界。
  • 清理返回 404 狀態(tài)碼的入口鏈接管嬉。靜態(tài)資源文件的 404 調(diào)用需嚴(yán)格避免,而入口頁(yè)面的 404 則在所難免朗鸠。通過(guò)在全站 404 頁(yè)面進(jìn)行產(chǎn)品引導(dǎo)與體驗(yàn)優(yōu)化蚯撩,并結(jié)合數(shù)據(jù)上報(bào)記錄來(lái)源頁(yè)(HTTP Referer Headerdocument.referrer),可以找到并清理 404 來(lái)源入口烛占。對(duì)于由搜索引擎進(jìn)入的來(lái)源胎挎,可通過(guò)主動(dòng)提交新索引至搜索引擎,或使用 301/302 重定向的方式扰楼,有效利用起這些「被浪費(fèi)的流量」呀癣。
  • 502 服務(wù)器出錯(cuò)。如果是 Nginx + FastCGI 的常見(jiàn)架構(gòu)弦赖,通常是由于 Nginx 緩沖區(qū)溢出或服務(wù)器資源被耗盡引起项栏,針對(duì)不同的業(yè)務(wù)場(chǎng)景進(jìn)行 Nginx 的配置優(yōu)化能顯著提升服務(wù)器抗壓性能。

如果你對(duì)上文提及的「網(wǎng)絡(luò)性能優(yōu)化」的知識(shí)點(diǎn)十分感興趣蹬竖,建議你通讀 Steve Souders 的《高性能網(wǎng)站建設(shè)指南》與《高性能網(wǎng)站建設(shè)進(jìn)階指南》沼沈,Steve Souders 的個(gè)人網(wǎng)站上積累了很多性能優(yōu)化的方法與案例。

如果你能看到這里币厕,相信你已經(jīng)知道如何解答前文提到的幾道 BAT 網(wǎng)絡(luò)編程面試題中列另,關(guān)于 「HTTP 協(xié)議、狀態(tài)碼旦装、緩存與性能優(yōu)化」相關(guān)的問(wèn)題页衙。

在下一章節(jié)中,我們會(huì)繼續(xù) HTTP 協(xié)議的話題阴绢,并詳細(xì)講解 HTTP POST 相關(guān)的網(wǎng)絡(luò)編程細(xì)節(jié)與調(diào)試技巧店乐,相信看完之后你將能輕松定位并解決所有接口聯(lián)調(diào)的問(wèn)題與 Bug:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呻袭,隨后出現(xiàn)的幾起案子眨八,更是在濱河造成了極大的恐慌,老刑警劉巖左电,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廉侧,死亡現(xiàn)場(chǎng)離奇詭異页响,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)段誊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)闰蚕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人枕扫,你說(shuō)我怎么就攤上這事陪腌。” “怎么了烟瞧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)染簇。 經(jīng)常有香客問(wèn)我参滴,道長(zhǎng),這世上最難降的妖魔是什么锻弓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任砾赔,我火速辦了婚禮,結(jié)果婚禮上青灼,老公的妹妹穿的比我還像新娘暴心。我一直安慰自己,他們只是感情好杂拨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布专普。 她就那樣靜靜地躺著,像睡著了一般弹沽。 火紅的嫁衣襯著肌膚如雪檀夹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天策橘,我揣著相機(jī)與錄音炸渡,去河邊找鬼。 笑死丽已,一個(gè)胖子當(dāng)著我的面吹牛蚌堵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沛婴,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吼畏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瘸味?” 一聲冷哼從身側(cè)響起宫仗,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旁仿,沒(méi)想到半個(gè)月后藕夫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孽糖,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年毅贮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了办悟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滩褥,死狀恐怖病蛉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑰煎,我是刑警寧澤铺然,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站酒甸,受9級(jí)特大地震影響魄健,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜插勤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一沽瘦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧农尖,春花似錦析恋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至窟扑,卻和暖如春喇颁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚎货。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工橘霎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殖属。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓姐叁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洗显。 傳聞我的和親對(duì)象是個(gè)殘疾皇子外潜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)挠唆,斷路器处窥,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • <a name='html'>HTML</a> Doctype作用?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)玄组、<...
    clark124閱讀 3,456評(píng)論 1 19
  • 清流滔驾。 遠(yuǎn)山如黛谒麦。 游鴨。 碧水哆致。 陽(yáng)朔的魅力绕德,可能在于某個(gè)早醒的清晨或日落的傍晚,想在這個(gè)小城住下來(lái)摊阀,一輩子耻蛇。
    貓besos閱讀 202評(píng)論 2 3