怎麼回答面試官的題目:你是怎麼理解 http?

面試經常會遇到,但又有多少人能準確標準的回答呢?


1、目前最成功的互聯網協議之一。

2、基於TCP協議的一個報文協議,其報文頭是不定長且任意擴展的,這也使得這個協議充滿了生命力。

3、設計非常簡單、輕巧,卻又功能強大。

4、沒有人能完整描述HTTP協議,因為這個協議的細節可以隨時擴充。例如控制咖啡壺什麼的……

其實你說的越多,暴露的短處越多,所以什麼都不說才是墜吼的。

HTTP就是一個用文本格式描述報文頭並用雙換行分隔報文頭和內容,在TCP基礎上實現的請求-響應模式的雙向通信協議。


「那個年代的人,都喜歡把設備擬人化」


文本基礎的傳輸協議,只要不引入上下文相關語義,就可以派一千隻猴子handle一千個連接。好處是方便並行化、輕量化。缺點是太輕了,要實現上下文就特別重。於是大家設計了各種魔改來實現上下文,早有Cookie,新有WebSocket。屬於歷史的潮流決定了個人發展的典型例證。


我認為http可以看做一個echo命令。(不包括websocket)

就是一發一收。雙方通過一定的規則互相傳輸數據。而對應的伺服器瀏覽器對內容做出相應的解釋。


有標準答案,就是背出規範,總結實踐,分享心得。這有賴於對規範的深刻理解,和業務中不斷地積累。

HTTP 涉及的方方面面太多了,遠到 1.0 近到 2.0,可以考察對網路協議的基本認識、HTTP請求和響應的結構、各種編碼格式、chunk包的拆分、連接池的實現、對緩存的理解、應用架構的設計、Cookie、Session、授權Authorization、認證Authentication、代理,還涉及很多邊緣知識如 HTTPS、WebSocket、CSP、CORS,等等。如果真的要把 HTTP 說完,可能得花一小時的功夫。當然了,這也沒什麼太大的必要,撿重點的說。。

這個問題不失為一個全面覆蓋從初級工程師到高級工程師乃至於架構師的好問題,面試官就是希望你懂多少說多少,從而判斷候選人所處的知識層級以及所具有的項目經驗。


這是一個測試雙方匹配度的問題,你沒必要去迎合面試官,按你自己的理解來回答即可。

這裡說一個我以前遇到的一個面試:

面試官問我「你說一下建站的步驟是什麼?」

這問題對我來說so easy,我全面說明了伺服器該在什麼場合選用什麼操作系統,中間件怎麼配置合適,選用什麼樣的資料庫軟體,並且還補充說明「PHP是世界最好的編程語言。」

面試官搖了搖頭,「建站的第一步」

我有些不知所措,難道還有遺漏,趕緊補充了一下「要先和客戶溝通需求」

面試官很不耐煩「說實際操作」

我懵了,只怪自己準備不夠充分,現如今,只能承認自己不知道。

面試官也沒用繼續為難我,告訴我答案,「做網站,第一步要申請域名啊。」

「哦。」


你想想,瀏覽器和伺服器兩台物理機器之間是如何真正通信的? HTTP只是個應用層協議,那什麼是應用層,為什麼叫應用層?信息是如何基於物理網線進行通信的?通信的過程是什麼樣的?數據是如何被包裝、轉換、解析的?

面試官並非想問你HTTP協議的定義,他真正想問的是你對網路協議的理解程度。如果你大腦中真正建立了對網路七層模型/ TCP/IP體系結構的理解,那就知道如何回答了,你只需要把你心中對該模型的理解表述出來就可以了。

這種問題沒有標準答案的。雖然是同一個東西,但是每個人的理解不同,反映到用語言表述又不盡相同。反倒是完全沒有理解的人,倒是可以完全靠記憶來背出書中的標準答案。


題主這樣的問題可以被稱為開放性問題,開放性問題通常沒有固定或者確定答案;與之相對的是針對特定知識點或者能力的確定性問題,確定性問題都有比較固定的答案,有知識點可以踩。這兩類問題也不是絕對的互斥的,題主的問題可以作為開放性問題來回答,也可以作為確定性的問題來回答。

作為確定性問題答案相對比較簡單,從教科書和網路上扒類似以下內容就可以了:

什麼是http?

http有哪些基本操作?

http的報頭有哪些欄位?

http在網路協議中屬於那一層?

http協議各個版本之間有什麼區別?

...

作為開放性問題沒有統一答案,但是還有些規律經驗可以總結:

在面試過程中,開放性問題的目的在於考察面試人的背景知識,邏輯性,開放程度,職業態度,合作精神等等一系列不能直接考察的個人情況。可以說問題只是一個引子,甚至你的回答內容本身也不是非常重要。

重要的是:

對於你來說:這是一個展示你自己的機會,你可以利用這個機會表現你的背景知識,項目經驗,邏輯思維,個人性格,興趣方向等等。

對於面試官來說:這是一個從側面考察你的機會,很多不能直接問的東西可以在這裡得到反映,比如:如果連基礎概念都說錯,基礎知識一項肯定不會給你高分。如果你說的項目他們有興趣,會多問幾句,那麼你做過還是沒做過,做過的核心還是打醬油的,很容易分辨。如果你說很多周邊內容如https/rest/http協議版本等等,說明知識面較廣。也可以考察你是否喜歡這個技術內容方向。

回答開放性問題上可以

1. 把話題引導到熟悉的領域,展示自己的背景知識。

2. 聯繫做過的項目,展示項目經驗

3. 聯繫到解決的問題,展示動手能力和技術深度

4. 對即時的問題提出自己的思路,展示邏輯思維,思路活躍以及思路開闊程度。

回答開放性問題最好不要

1. 在項目經驗上說謊。做沒做過,是不是核心,幾個尖銳的問題就能問出來,如果沒有問到算你幸運。

2. 不知道的技術點硬裝知道。理由同上。

3. 對於不能解決的問題直接回答不知道。開放性問題不是考察答案的,而是考察態度,思路,邏輯,深度,合作精神等等,所以可以考慮說出大體思路,給出簡單解決方案,如果面試官有意深入,那麼再考慮細節,優化,效率提升等更多內容。

4. 直接說出自己的缺點。說出缺點不會讓面試官給你加分,實際上這是變相表揚自己的一個機會,比如我比較認死理,認定的事情一定會堅持到底。前面像是自我批評,後邊其實是表揚:)

5. 表現出比較負面的主觀態度。比如我跳槽就是為了錢(雖然這可以是跳槽的唯一原因),我和上一個主管性格不合,我討厭之前的公司等等。


這個問題可以體現一個人回答問題的邏輯和條理,我會從http歷史,協議,技術實現,缺陷及目前的解決方案四個方面進行回答。


是個很萌的明信片郵遞員。


http很有意思的一點是header每一行都用回車
結尾,並用2個
作為終止符。

估計當年的人都是用telnet純手打來發http請求的,符合人體工程學。。。


傳統http協議本質上就是一個tcp

短連接,只能在傳輸的內容中規定了一些有特殊含義的欄位和格式,收發兩端按照同樣規則解析即可

傳統http是req-rep 模式,一個來回結束後連接關閉,下次要請求需要重新建立連接,因此是無狀態的。在1.1中為了避免連接建立和斷開的開銷,默認為長連接,再後來為了提高請求應答效率引入了parallel模式,可以同時發出多個請求,不需要一問一答


就是個協議


你要怎麼回答他主要看你面試的職務和工資,要是一個普通程序猿他問這個,你可以直接把簡歷拍他臉上了


天天都在用,誰用誰知道。


怎麼和理解分別我都理解,但拼在一起時就不理解了。我不是跑錯神經科學的公司了吧?


面試官問這麼泛泛的問題,主要還是個引導問題,你對HTTP哪方面擅長就說哪方面,面試官應該會繼續深入的問。


問過類似的問題,但是基本上的面試者都是一臉懵逼的狀態,覺得問題太大,不知道從何說起。

後面就換了一種方式。

遊戲服務端崗位,基本都是TCP,一層一層深入,雖然偏理論,但基本能看出面試者是不是平時有下功夫去研究這塊內容。

Web開發相關崗位,則主要從http請求的生命周期入手,找面試者比較了解的,深入問,基本也能看出面試者的底子。


Http協議其實底層就是socket實現的,輸出流將需要提交的數據輸出,然後輸入流等待伺服器輸出。然後斷開連接。其實就是一個TCP的短連接。


先從大方面。。歷史啊,原理啊,再到具體的系列,各種head,最後可以聊聊rest之類的,還有git...


推薦閱讀:

有哪些IT初學者(新人)成長為技術大牛的真實經歷?
知乎上有哪些有趣的程序員?
學機械的看不到前途想轉 IT ?
在IBM工作是怎樣一番體驗?
如何理解下面這幅關於js的圖?

TAG:Web開發 | 計算機網路 | IT行業 |