1. 程式人生 > >http與tcp面試題1

http與tcp面試題1

1.簡述 Http 請求 get 和 post 的區別以及資料包格式。

HTTP(HyperText Transport Protocol,超文字傳送協議)

http請求資料包的格式:頭部(request line + header)+  資料(data)

頭部和資料包體通過一個空行來隔開,頭部的格式主要包括請求行+請求頭部。如下圖

HTTP請求頭

請求行

請求行由請求方法欄位、URL欄位和HTTP協議版本欄位3個欄位組成,它們用空格分隔如:

GET /index.html HTTP/1.1。

HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。這裡介紹最常用的GET方法和POST方法。

GET方式:在URL裡面就說明要請求的資源,URL裡面包含引數,“?”後面就是引數,而“?”前面就是URL的結束。“?ip=192.168.156.11&active=on”這種就是GET方式的包,而伺服器把客戶端請求的內容在資料段裡面發回給客戶端。

POST方式:傳輸的資料不在URL裡面出現,而是在資料段裡面出現。但是請求頭部多了Content-Type和Content-Length兩個欄位。

請求頭部

請求頭部由(關鍵字:<空格>值)對組成,每行一對,關鍵字和值用英文冒號“:<空格>”分隔。請求頭部通知伺服器有關於客戶端請求的資訊,典型的請求頭有:

User-Agent:產生請求的瀏覽器型別。

Accept:客戶端可識別的內容型別列表。

Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。

下面是GET包的一個例子:傳輸的資料在URL裡

再看看POST包的例子:傳輸的資料在資料段裡面

HTTP響應報文

HTTP響應也由兩個個部分組成,分別是:響應頭(狀態行+訊息報頭)+響應正文。

狀態行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態程式碼;Reason-Phrase表示狀態程式碼的文字描述。狀態程式碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。

1xx:指示資訊–表示請求已接收,繼續處理。

2xx:成功–表示請求已被成功接收、理解、接受。

3xx:重定向–要完成請求必須進行更進一步的操作。

4xx:客戶端錯誤–請求有語法錯誤或請求無法實現。

5xx:伺服器端錯誤–伺服器未能實現合法的請求。

下面是http響應包的例子

 

Get和Post主要區別如下:


1、Get是用來從伺服器上獲得資料,而Post是用來向伺服器上傳遞資料。
本質區別:get資料放在http請求報文的頭部的請求行的url中/  post資料放在http請求報文的資料體中

2、Get將表單中資料的按照variable=value的形式,新增到action所指向的URL後面,並且兩者使用“?”連線,而各個變數之間使用“&”連線;Post是將表單中的資料放在form的資料體中,按照變數和值相對應的方式,傳遞到action所指向URL。
3、Get是不安全的,因為在傳輸過程,資料被放在請求的URL中,而如今現有的很多伺服器、代理伺服器或者使用者代理都會將請求URL記錄到日誌檔案中,然後放在某個地方,這樣就可能會有一些隱私的資訊被第三方看到。另外,使用者也可以在瀏覽器上直接看到提交的資料,一些系統內部訊息將會一同顯示在使用者面前。Post的所有操作對使用者來說都是不可見的。
4、Get傳輸的資料量小,這主要是因為受URL長度限制;而Post可以傳輸大量的資料,所以在上傳檔案只能使用Post。
5、Get限制Form表單的資料集的值必須為ASCII字元;而Post支援整個ISO10646字符集。

 

      常見錯誤認識:

      "GET方式提交的資料最多隻能是1024位元組",因為GET是通過URL提交資料,那麼GET可提交的資料量就跟URL的長度有直接關係了。而實際上,URL不存在引數上限的問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於作業系統的支援。

  注意這是限制是整個URL長度,而不僅僅是你的引數值資料長度。

      理論上講,POST是沒有大小限制的,HTTP協議規範也沒有進行大小限制,說“POST資料量存在80K/100K的大小限制”是不準確的,POST資料是沒有限制的,起限制作用的是伺服器的處理程式的處理能力。


若符合下列任一情況,則用POST方法:

  • 請求的結果有持續性的副作用,例如,資料庫內新增新的資料行。
  • 若使用GET方法,則表單上收集的資料可能讓URL過長。
  • 要傳送的資料不是採用7位的ASCII編碼。

若符合下列任一情況,則用GET方法:   

  • 請求是為了查詢資源,HTML表單資料僅用來幫助搜尋。
  • 請求結果無持續性的副作用。
  • 收集的資料及HTML表單內的輸入欄位名稱的總長不超過1024個字元。

2.說說你知道的幾種 HTTP 響應碼,比如 200, 302, 404。

在這個廣域網中,我們所有人都一定會看到3個Logo:測試你網速的藍色熊掌,令你絕望的載入圓圈,還有“褲子都脫了就給我看這個?”的404頁面。前兩個好歹還能讓你看點東西,而最後一個則是最糟糕的使用者體驗——除了告訴你打不開網頁就似乎真的什麼也沒有了,不知道各位有沒有想過這個404是怎麼產生的,除了404還有什麼?今天我們就來談一談那些狀態碼。

404和HTTP狀態碼

上面所說的404其實是一種標準的HTTP返回程式碼,官方名稱是HTTP狀態碼(HTTPStatusCode),用於表示網頁伺服器HTTP的響應狀態。但似乎一般人都不會仔細研究這些HTTP狀態碼和這些狀態碼對開發人員的影響。也許,一個開發人員就算不知道這些狀態碼也能開發出一個網站,但如果企業要開發一個大型網站,在某些時候需要微調或系統整合需要到更底層的網路工作時,就有可能遇到瓶頸,特別是在出錯時更加明顯。對於狀態碼的分類有三個層級,就好像404那樣用3三個數字表示,分為大類,中類和小類。值得一提的是,在IIS(Internet資訊服務)中還有不少微軟制定的擴充狀態碼,格式類似404.1這樣,能更深層次的讓開發者清楚出錯原因。

在進行請求的時候,我們看到的都只是伺服器最後返回來的狀態碼,比如出錯的404和成功的200,但是實際上在請求的過程中,會有很多的狀態碼在快速變化,除非是類似打斷點的操作,一步操作停一下,否則是不能看出這些狀態碼是怎麼變化的,這就導致在伺服器響應過程中有很多狀態碼我們都看不到。

審查元素可以看到各個請求最終的狀態碼

首先,我們要知道幾乎所有的HTTP狀態碼都被分成了五大類:

1開頭的表示伺服器收到請求並需要請求這繼續處理;

2開頭的成功響應,表示成功處理了請求;

3開頭的重定向,引導瀏覽器跳轉到另一個資源頁面;

4開頭表示請求出錯,妨礙了伺服器的處理,伺服器會返回一個狀態碼解釋到底是什麼錯誤;

5開頭的表示伺服器錯誤,並不是請求者的原因;

就拿404舉個例子,作為最出名的狀態碼,我們想來詳細解釋下404這三個數字的含義:第一個4表示客戶端出錯,第二個0表示請求者把網址打錯了,最後的4表示4開頭的錯誤狀態碼中排第四。

那麼404是怎麼產生的呢?當用戶在位址列輸入一個網址後,這時候IIS首先會檢測使用者輸入的地址是否有對應的網頁資訊,如果沒有,IIS就會通過伺服器想使用者返回404錯誤狀態碼提示,告訴使用者找不到地址對應的網頁資訊,但伺服器並不清楚這種情況是暫時性的還是永久性的。出現404最多的原因就是使用者輸入了錯誤的連結,或者無法響應並找不到原因,也有可能就是網頁被刪除了。

為什麼要設計404頁面

以4xx開頭的錯誤都是跟“客戶端”有關,比如使用者可能訪問了不存在的頁面,使用者許可權不足或者未提供有效的驗證資訊(輸入錯誤的賬號密碼等)。儘管404頁面被使用者瀏覽到的概率相對於全站的其他頁面來說要小得多,但頁面難免會出錯,無論是使用者的誤操作還是伺服器的原因,作為網站開發者也無法控制錯誤頁面的出現,但開發者可以通過設計一個特別的404錯誤頁面將使用者失望度降到最低,開發者需要在這個頁面很好的把資訊傳達給使用者,並引導使用者進行下一步的操作。

訪問到錯誤頁面是不愉快的使用者體驗,作為開發者可以提供一些應對方法

還有什麼比較出名的狀態碼?

其實除了404NotFound外,還有很多HTTP狀態碼,這些狀態碼都有自己的含義,所以我們說說一些比較常見的狀態碼以及它們的表達資訊。

400錯誤請求:400代表語義有誤,伺服器無法理解使用者的請求,除非進行修改,不然沒必要一邊按F5一邊噴伺服器垃圾。比如說別把www.baidu.com.打成com.baidu.www.,否則伺服器是不知道你在說什麼鳥語。在減少這類錯誤的道路上,偉大的人類發明了搜尋引擎,容錯率隨之提高。

401未授權:一般來說該錯誤訊息表明你首先需要登入(輸入有效的使用者名稱和密碼)。如果你不輸入這些資訊,就會有401錯誤,這意味著驗證資訊出錯,伺服器無法識別你的身份。

403禁止:有句話叫“拉不出屎千萬別怪地球沒引力”,因為出現403是因為伺服器拒絕了你的地址請求,或者你根本沒許可權訪問網站,提供身份驗證也沒用,也就是說,使用者被禁止訪問了。然而除非與Web伺服器管理員聯絡,否則一旦遇到403狀態碼都無法自行解決。

408請求超時:遇到408意味著你的請求傳送到該網站花的時間比該網站的伺服器準備等待的時間要長,即連結超時。408錯誤往往難以解決,通常涉及系統工作量或系統操作中的一次性變化。如果使用者持續看到408錯誤,管理員首先要考慮到Web伺服器的工作量,特別是在產生408錯誤的時間段,另外網路流量激增也可能導致使用者無法訪問網頁從而出現該錯誤。

梯子不夠長,牆外的世界不是你想看就能看的

410永久刪除:如果使用者訪問的網頁被永久刪除,伺服器就會返回410程式碼。410實際上和404有點相似,在伺服器不確定這個情況是不是永久的情況下,應該使用404狀態碼。410響應的目的主要是幫助網站管理員維護網站,通知使用者這個網頁資源已經不能再使用,並且伺服器擁有者希望所有指向這個資源的遠端連結也被刪除。不過之後的事,就涉及到301和302返回碼了。

301永久移動,302臨時移動:在優化網站的時候,301重定向是網站管理員必用的,在網頁被移動後多數情況下瀏覽器會自動定向到新的URI(統一資源識別符號),並且以後任何新的請求都應使用新的URI來代替。而302只是URI被理解為臨時交換而已,客戶端還是會繼續使用原來的地址傳送請求。這兩種現象出現在網頁的域名更換後,搜尋引擎還使用原有域名地址訪問URI,如果搜尋引擎得到301返回碼,那麼搜尋引擎就知道管理員更換了域名,下次就會自動用新域名來索引網站。

305使用代理:訪問者只能使用代理來訪問網頁,如果伺服器放回這個狀態碼,意思是你需要一張梯子。想要登陸諸如Google,Youtube,Facebook這些不存在的網站,除了使用VPN別無辦法。

509超過頻寬限制:相比其他500狀態碼,509算是一個特殊的存在。之所以特殊,是因為這個錯誤要用錢來解決。509並不是官方的狀態碼,但是仍然被廣泛使用。正如名字所示,網站流量增大,頻寬不夠用就會出現這類錯誤,網站管理員只能掏錢向主機商買流量。

除了上述所說的一部分HTTP狀態碼外,還有很多其他的狀態碼,比如100,200等,這些狀態碼都有自己的資訊定義和作用,限於篇幅原因只能列舉一些很常見的狀態碼。HTTP狀態碼通常都與使用者的瀏覽體驗息息相關,它能告訴客戶端當前發生了什麼事,或者說當前Web伺服器的響應狀態。作為開發者有必要了解這些狀態碼,能夠明白問題出在哪,從而針對性地解決問題。