1. 程式人生 > >面試題集錦——網路相關問題

面試題集錦——網路相關問題

網路相關問題

程序和執行緒的區別

一個程式至少有一個程序,一個程序至少有一個執行緒。

執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

執行緒是獨立排程的基本單位, 程序是擁有資源的基本單位

另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

執行緒在執行過程中與程序還是有區別的。

  • 每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。
  • 但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

什麼是Daemon程序?

Daemon()程式是一直執行的服務端程式,又稱為守護程序。通常在系統後臺執行,沒有控制終端,不與前臺互動,Daemon程式一般作為系統服務使用。Daemon是長時間執行的程序,通常在系統啟動後就執行,在系統關閉時才結束。

是否瞭解公鑰加密和私鑰加密。

一般情況下是指私鑰用於對資料進行簽名,公鑰用於對簽名進行驗證;

HTTP網站在瀏覽器端用公鑰加密敏感資料,然後在伺服器端再用私鑰解密。

請解釋下列術語:UrlEncode,Utf8,JSON,UTC,MD5?

Urlencode:將字串以url形式編碼(在程式語言中通常都有實現該功能的內建函式或者API)。

Utf8:是一種針對Unicode的可變長度字元編碼,主要用於在網頁上顯示各國語言字元

什麼是記憶體物件的序列化(Serialiization)?為什麼要序列化?請描述你熟悉的網路傳輸序列化(Serialiization)框架或格式(Server)?

把物件轉換為位元組序列的過程稱為物件的序列化

序列化主要用於網路傳輸資料及將資料儲存在硬碟上

常見的序列化以後的格式有:XML和Json,但它們都是字串。

HTTP和HTTPS

HTTP協議通常承載於TCP協議之上,在HTTP和TCP之間新增一個安全協議層(SSL或TSL),這個時候,就成了我們常說的HTTPS。

預設HTTP的埠號為80,HTTPS的埠號為443。

每個http請求都會產生一次從你的瀏覽器到伺服器端網路往返過程,並且導致推遲到達伺服器端和返回瀏覽器端的時間,我們稱之為延遲。

為什麼HTTPS安全

因為網路請求需要中間有很多的伺服器路由器的轉發。中間的節點都可能篡改資訊,而如果使用HTTPS,金鑰在你和終點站才有。https之所以比http安全,是因為他利用ssl/tls協議傳輸。它包含證書,解除安裝,流量轉發,負載均衡,頁面適配,瀏覽器適配,refer傳遞等。保障了傳輸過程的安全性

http狀態碼有那些?分別代表是什麼意思?

簡單版

100  Continue   繼續,一般在傳送post請求時,已傳送了http header之後服務端將返回此資訊,表示確認,之後傳送具體引數資訊
200  OK         正常返回資訊
201  Created    請求成功並且伺服器建立了新的資源
202  Accepted   伺服器已接受請求,但尚未處理
301  Moved Permanently  請求的網頁已永久移動到新位置。
302 Found       臨時性重定向。
303 See Other   臨時性重定向,且總是使用 GET 請求新的 URI。
304  Not Modified 自從上次請求後,請求的網頁未修改過。

400 Bad Request  伺服器無法理解請求的格式,客戶端不應當嘗試再次使用相同的內容發起請求。
401 Unauthorized 請求未授權。
403 Forbidden   禁止訪問。
404 Not Found   找不到如何與 URI 相匹配的資源。

500 Internal Server Error  最常見的伺服器端錯誤。
503 Service Unavailable 伺服器端暫時無法處理請求(可能是過載或維護)。

完整版

1**(資訊類):表示接收到請求並且繼續處理
100——客戶必須繼續發出請求
101——客戶要求伺服器根據請求轉換HTTP協議版本

2**(響應成功):表示動作被成功接收、理解和接受
200——表明該請求被成功地完成,所請求的資源傳送回客戶端
201——提示知道新檔案的URL
202——接受和處理、但處理未完成
203——返回資訊不確定或不完整
204——請求收到,但返回資訊為空
205——伺服器完成了請求,使用者代理必須復位當前已經瀏覽過的檔案
206——伺服器已經完成了部分使用者的GET請求

3**(重定向類):為了完成指定的動作,必須接受進一步處理
300——請求的資源可在多處得到
301——本網頁被永久性轉移到另一個URL
302——請求的網頁被轉移到一個新的地址,但客戶訪問仍繼續通過原始URL地址,重定向,新的URL會在response中的Location中返回,瀏覽器將會使用新的URL發出新的Request。
303——建議客戶訪問其他URL或訪問方式
304——自從上次請求後,請求的網頁未修改過,伺服器返回此響應時,不會返回網頁內容,代表上次的文件已經被快取了,還可以繼續使用
305——請求的資源必須從伺服器指定的地址得到
306——前一版本HTTP中使用的程式碼,現行版本中不再使用
307——申明請求的資源臨時性刪除

4**(客戶端錯誤類):請求包含錯誤語法或不能正確執行
400——客戶端請求有語法錯誤,不能被伺服器所理解
401——請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
HTTP 401.1 - 未授權:登入失敗
  HTTP 401.2 - 未授權:伺服器配置問題導致登入失敗
  HTTP 401.3 - ACL 禁止訪問資源
  HTTP 401.4 - 未授權:授權被篩選器拒絕
HTTP 401.5 - 未授權:ISAPI 或 CGI 授權失敗
402——保留有效ChargeTo頭響應
403——禁止訪問,伺服器收到請求,但是拒絕提供服務
HTTP 403.1 禁止訪問:禁止可執行訪問
  HTTP 403.2 - 禁止訪問:禁止讀訪問
  HTTP 403.3 - 禁止訪問:禁止寫訪問
  HTTP 403.4 - 禁止訪問:要求 SSL
  HTTP 403.5 - 禁止訪問:要求 SSL 128
  HTTP 403.6 - 禁止訪問:IP 地址被拒絕
  HTTP 403.7 - 禁止訪問:要求客戶證書
  HTTP 403.8 - 禁止訪問:禁止站點訪問
  HTTP 403.9 - 禁止訪問:連線的使用者過多
  HTTP 403.10 - 禁止訪問:配置無效
  HTTP 403.11 - 禁止訪問:密碼更改
  HTTP 403.12 - 禁止訪問:對映器拒絕訪問
  HTTP 403.13 - 禁止訪問:客戶證書已被吊銷
  HTTP 403.15 - 禁止訪問:客戶訪問許可過多
  HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效
HTTP 403.17 - 禁止訪問:客戶證書已經到期或者尚未生效
404——一個404錯誤表明可連線伺服器,但伺服器無法取得所請求的網頁,請求資源不存在。eg:輸入了錯誤的URL
405——使用者在Request-Line欄位定義的方法不允許
406——根據使用者傳送的Accept拖,請求資源不可訪問
407——類似401,使用者必須首先在代理伺服器上得到授權
408——客戶端沒有在使用者指定的餓時間內完成請求
409——對當前資源狀態,請求不能完成
410——伺服器上不再有此資源且無進一步的參考地址
411——伺服器拒絕使用者定義的Content-Length屬性請求
412——一個或多個請求頭欄位在當前請求中錯誤
413——請求的資源大於伺服器允許的大小
414——請求的資源URL長於伺服器允許的長度
415——請求資源不支援請求專案格式
416——請求中包含Range請求頭欄位,在當前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭欄位
417——伺服器不滿足請求Expect頭欄位指定的期望值,如果是代理伺服器,可能是下一級伺服器不能滿足請求長。

5**(服務端錯誤類):伺服器不能正確執行一個正確的請求
HTTP 500 - 伺服器遇到錯誤,無法完成請求
  HTTP 500.100 - 內部伺服器錯誤 - ASP 錯誤
  HTTP 500-11 伺服器關閉
  HTTP 500-12 應用程式重新啟動
  HTTP 500-13 - 伺服器太忙
  HTTP 500-14 - 應用程式無效
  HTTP 500-15 - 不允許請求 global.asa
  Error 501 - 未實現
HTTP 502 - 閘道器錯誤
HTTP 503:由於超載或停機維護,伺服器目前無法使用,一段時間後可能恢復正常

關於Http 2.0 你知道多少?

HTTP/2引入了“服務端推(server push)”的概念,它允許服務端在客戶端需要資料之前就主動地將資料傳送到客戶端快取中,從而提高效能。

HTTP/2提供更多的加密支援

HTTP/2使用多路技術,允許多個訊息在一個連線上同時交差。

它增加了頭壓縮(header compression),因此即使非常小的請求,其請求和響應的header都只會佔用很小比例的頻寬。

說一下HTTP 協議頭欄位說上來幾個,是否儘可能詳細的掌握HTTP協議。一次完整的HTTP事務是怎樣的一個過程?

一次完整的HTTP請求需要的步驟(http通訊協議):

<1> web瀏覽器(客戶端)和web應用伺服器建立tcp連線

http協議是tcp/ip 模型中的應用層的協議,是高層的協議。傳輸控制協議TCP位於傳輸層,tcp是建立本地主機和目標主機的會話,只有建立tcp連線,應用層http協議才可以有通道去進行資料傳輸。

<2>web瀏覽器向web應用伺服器傳送請求資料

tcp建立後瀏覽器就可以向web伺服器傳送http請求例如 http:www.baidu.com HTTP/1.1

<3>客戶端傳送請求header資訊,請求內容,最後傳送一段空白內容,表示客戶端請求結束

<4>伺服器會對客戶端做出應答 HTTP/1.1 statecode 200 , 404, 500

<5> 伺服器向瀏覽器傳送header應答資訊

<6>傳送一段空白資訊,表示應答資訊傳送結束。接著就醫Content-type 要求的格式傳送資料給客戶端

<7>伺服器關閉tcp連線,如果客戶端或者伺服器設定Connection : keep-alive ,就表示tcp連線依舊有效,可以繼續下次通訊

請解釋GET/POST的區別,以及請求引數放到url裡和放到body裡面的區別?

Post與Get區別:

  • 請求格式

    • GET請求,請求的資料會附加在URL之後,以?分割URL和傳輸資料,多個引數用&連線。URL的編碼格式採用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字元都要編碼之後再傳輸。

    • POST請求:POST請求會把請求的資料放置在HTTP請求包的包體中。

    因此,GET請求的資料會暴露在位址列中,而POST請求則不會。

  • 傳輸資料的大小

    • 在HTTP規範中,沒有對URL的長度和傳輸的資料大小進行限制。但是在實際開發過程中,對於GET,特定的瀏覽器和伺服器對URL的長度有限制。因此,在使用GET請求時,傳輸資料會受到URL長度的限制。

    • 對於POST,由於不是URL傳值,理論上是不會受限制的,但是實際上各個伺服器會規定對POST提交資料大小進行限制,Apache、IIS都有各自的配置。

  • 安全性

    Get是Form的預設方法,安全性相對比較低。

請求引數放到url裡和放到body裡面的區別

首先,引數的存放位置我們無法直接指定,而是不同的請求方法引數傳遞的方式不同。

常用的HTTP請求主要為GET請求和POST請求兩種,GET請求的引數會通過以跟隨在URL後邊以鍵值對的方式進行傳遞(例:key1=a&key2=b&key3…);而POST請求的引數會通過HEADER進行傳遞。考慮到安全性的問題,可以確定兩者都不安全,原因是HTTP請求可以被輕易抓包和截獲,其中的請求引數值自然會很容易被獲取。

請列舉出常用的Http Header,Cookie是怎麼實現的?

常用的Http Header:

  • Content-Length,請求、響應體的資料位元組大小
  • Accept-Encoding,請求頭,可接受的文字壓縮演算法,如: gzip, deflate
  • Accept-Language,請求頭,支援語言,客戶端瀏覽器的設定,如:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
  • User-Agent,請求頭,瀏覽器資訊,
  • Cookie,請求頭,伺服器或客戶端在上次設定的COOKIE,包括作用域名(.360buy.com),過期時間,鍵與值。
  • Referer,從一個連線開啟一個新頁面,新頁面的請求一般會加此資訊,標名是從哪裡跳過來的,所有的頁面的開啟歷史鏈就可被挖掘出來,有利於分析使用者行為與CPS分成

Cookie在瀏覽器本地會有一個檔案儲存資料,通訊的時候通過請求頭和響應頭傳遞資料

長連線和短連線的區別

在HTTP/1.0中預設使用短連線。也就是說,客戶端和伺服器每進行一次HTTP操作,就建立一次連線,任務結束就中斷連線。當客戶端瀏覽器訪問的某個HTML或其他型別的Web頁中包含有其他的Web資源(如JavaScript檔案、影象檔案、CSS檔案等),每遇到這樣一個Web資源,瀏覽器就會重新建立一個HTTP會話。

而從HTTP/1.1起,預設使用長連線,用以保持連線特性。使用長連線的HTTP協議,會在響應頭加入這行程式碼:

Connection:keep-alive

在使用長連線的情況下,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,客戶端再次訪問這個伺服器時,會繼續使用這一條已經建立的連線。Keep-Alive不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。實現長連線需要客戶端和服務端都支援長連線。

HTTP協議的長連線和短連線,實質上是TCP協議的長連線和短連線。

參考資料:HTTP長連線、短連線究竟是什麼?

HTTP協議目前常用的有哪幾個?KEEPALIVE從哪個版本開始出現的?

到現在http出現了  1.0和 1.1版本

Keep-Alive是從1.1預設就支援了。

什麼是Keep-Alive模式?

我們知道HTTP協議採用“請求-應答”模式,當使用普通模式,即非KeepAlive模式時,每個請求/應答客戶和伺服器都要新建一個連線,完成之後立即斷開連線(HTTP協議為無連線的協議);當使用Keep-Alive模式(又稱持久連線、連線重用)時,Keep-Alive功能使客戶端到伺服器端的連線持續有效,當出現對伺服器的後繼請求時,Keep-Alive功能避免了建立或者重新建立連線。

http 1.0中預設是關閉的,需要在http頭加入"Connection: Keep-Alive",才能啟用Keep-Alive;http 1.1中預設啟用Keep-Alive,如果加入"Connection: close ",才關閉。目前大部分瀏覽器都是用http1.1協議,也就是說預設都會發起Keep-Alive的連線請求了,所以是否能完成一個完整的Keep-Alive連線就看伺服器設定情況。

從上面的分析來看,啟用Keep-Alive模式肯定更高效,效能更高。因為避免了建立/釋放連線的開銷。

什麼是Etag?

當傳送一個伺服器請求時,瀏覽器首先會進行快取過期判斷。瀏覽器根據快取過期時間判斷快取檔案是否過期。

情景一:若沒有過期,則不向伺服器傳送請求,直接使用快取中的結果,此時我們在瀏覽器控制檯中可以看到 200 OK(from cache) ,此時的情況就是完全使用快取,瀏覽器和伺服器沒有任何互動的。

情景二:若已過期,則向伺服器傳送請求,此時請求中會帶上①中設定的檔案修改時間,和Etag

然後,進行資源更新判斷。伺服器根據瀏覽器傳過來的檔案修改時間,判斷自瀏覽器上一次請求之後,檔案是不是沒有被修改過;根據Etag,判斷檔案內容自上一次請求之後,有沒有發生變化

情形一:若兩種判斷的結論都是檔案沒有被修改過,則伺服器就不給瀏覽器發index.html的內容了,直接告訴它,檔案沒有被修改過,你用你那邊的快取吧—— 304 Not Modified,此時瀏覽器就會從本地快取中獲取index.html的內容。此時的情況叫協議快取,瀏覽器和伺服器之間有一次請求互動。

情形二:若修改時間和檔案內容判斷有任意一個沒有通過,則伺服器會受理此次請求,之後的操作同①

① 只有get請求會被快取,post請求不會

Expires和Cache-Control

Expires要求客戶端和服務端的時鐘嚴格同步。HTTP1.1引入Cache-Control來克服Expires頭的限制。如果max-age和Expires同時出現,則max-age有更高的優先順序。

```
Cache-Control: no-cache, private, max-age=0

ETag: abcde

Expires: Thu, 15 Apr 2014 20:00:00 GMT

Pragma: private

Last-Modified: $now // RFC1123 format
```

ETag應用:

Etag由伺服器端生成,客戶端通過If-Match或者說If-None-Match這個條件判斷請求來驗證資源是否修改。常見的是使用If-None-Match。請求一個檔案的流程可能如下:

==第一次請求=

  1. 客戶端發起 HTTP GET 請求一個檔案;

  2. 伺服器處理請求,返回檔案內容和一堆Header,當然包括Etag(例如"2e681a-6-5d044840")(假設伺服器支援Etag生成和已經開啟了Etag).狀態碼200

==第二次請求=

客戶端發起 HTTP GET 請求一個檔案,注意這個時候客戶端同時傳送一個If-None-Match頭,這個頭的內容就是第一次請求時伺服器返回的Etag:2e681a-6-5d0448402.伺服器判斷髮送過來的Etag和計算出來的Etag匹配,因此If-None-Match為False,不返回200,返回304,客戶端繼續使用本地快取;流程很簡單,問題是,如果伺服器又設定了Cache-Control:max-age和Expires呢,怎麼辦

答案是同時使用,也就是說在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之後,伺服器才能返回304.(不要陷入到底使用誰的問題怪圈)

為什麼使用Etag請求頭?

Etag 主要為了解決 Last-Modified 無法解決的一些問題。

CDN是啥?

CDN的全稱:是Content DeliveryNetwork,即內容分發網路,加速的意思,那麼網站CND服務就是網站加速服務。

CDN加速原理:CDN加速將網站的內容快取在網路邊緣(離使用者接入網路最近的地方),然後在使用者訪問網站內容的時候,通過排程系統將使用者的請求路由或者引導到離使用者接入網路最近或者訪問效果最佳的快取伺服器上,有該快取伺服器為使用者提供內容服務;相對於直接訪問源站,這種方式縮短了使用者和內容之間的網路距離,從而達到加速的效果。

CDN的特點:

1、本地加速 提高了企業站點(尤其含有大量圖片和靜態頁面站點)的訪問速度,並大大提高以上性質站點的穩定性

2、映象服務 消除了不同運營商之間互聯的瓶頸造成的影響,實現了跨運營商的網路加速,保證不同網路中的使用者都能得到良好的訪問質量。

3、遠端加速 遠端訪問使用者根據DNS負載均衡技術 智慧自動選擇Cache伺服器,選擇最快的Cache伺服器,加快遠端訪問的速度

4、頻寬優化 自動生成伺服器的遠端Mirror(映象)cache伺服器,遠端使用者訪問時從cache伺服器上讀取資料,減少遠端訪問的頻寬、分擔網路流量、減輕原站點WEB伺服器負載等功能。

5、叢集抗攻擊 廣泛分佈的CDN節點加上節點之間的智慧冗於機制,可以有效地預防黑客入侵以及降低各種D.D.o.S攻擊對網站的影響,同時保證較好的服務質量。

優化一個以I/O為瓶頸的程式,以下哪些方法效果比較顯著,Why?

a) 增加CPU數目

b) 提高CPU主頻

c) 增大記憶體的容量

d) 採用多執行緒

e) 採用非同步I/O和多路(Multlplex)I/O

f) 對每次I/O進行Batch訪問(多次I/O合併一次完成)

c、e、d、f提升的效果會比較顯著

c通過將資料預讀取到記憶體中(建立記憶體池)的方式,提高訪問時候的效率,有效減少磁碟IO讀寫次數

請列舉在內網的兩臺伺服器中拷貝檔案的方法?用Shell指令碼解答資料庫?

scp -P 1234 -r [email protected]:~

主要就是scp命令的使用