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

http與tcp面試題3

1、http/1.0、http/1.1和http2.0有什麼區別。

      (1)、http/1.0協議預設使用非持久連線(短連線),既在非持久連線下,伺服器處理完客戶端一個請求後立即斷開TCP連線,下次客戶端再次請求需要重新建立連線,伺服器不跟蹤每個客戶,也不記錄過去的請求。
      (2)、http/1.1協議預設使用持久連線(長連線),即在長連線的情況下,伺服器處理完客戶端請求後不立即關閉一個TCP連線,而是一個tcp連線允許多個客戶端請求,可以傳輸多個WEB物件。同時也可通過配置支援非持久連線。
      (3)、http/1.1增加了Host欄位

,因為目前一臺計算機上有多個虛擬主機共享一個IP地址,請求和相應訊息都應該支援Host頭域,且請求訊息中沒有Host頭域會報(400 Bad Request)。此外伺服器應該接受以絕對路徑標記的資源請求。而http/1.0中每臺伺服器都繫結一個唯一的IP,因此,請求訊息中的URL沒有傳遞主機名(hostname)。
      (4)、增加了新的狀態碼100(Continue)。客戶端事先發送一個只帶頭域的請求,如果服務因許可權等拒絕請求,就回送相應401(Unauthorized)或403;如果伺服器接受此請求就回送相應嗎100,客戶端就可以繼續傳送帶實體的完成請求。狀態碼的使用,在request在傳送body之前,先發送header試探一下server,如果接受body,再發送body。可以節省頻寬。
      (5)、http/1.0加入了分塊編碼(Chunked TransferCoding)。傳送方將訊息分割成若干個任意大小的資料塊,每個資料塊在傳送時都會附上塊的長度,最後一個零長度的塊作為訊息的結束標誌。這種傳送允許傳送方只快取一個片段,避免快取整個片段帶來的過載。
      (6)、http/1.1在http/1.0的基礎上加入了一些cache的新特性,當快取物件Age超過Expire時變為stale物件,cache不需要直接拋棄stale物件,而是與源伺服器進行重新啟用(revalidation)
      (7)、http/2.0支援多路複用技術,同一個連線併發處理多個請求(NIO),http/1.1可以通過建立多個TCP解決。
      (8)、http/1.1不支援Header資料的壓縮,http/2.0使用HPACK演算法對資料壓縮,降體積提速度。
      (9)、http/2.0請求伺服器,伺服器推送資料時會額外推送客戶需要的資源,客戶下次呼叫不用請求直接呼叫。提升速度。

2、TCP三次握手和四次揮手的流程,為什麼斷開連線要4次,如果握手只有兩次,會出現什麼。

1)、TCP三次握手:
                 第一次握手:建立連線時,客戶端傳送syn(Synchronize Sequence Numbers:同步序列編號)包(sny=1)到伺服器,並進入SYN_SEND(請求連線)狀態,等待伺服器確認;
                  第二次握手:伺服器接收到syn包,必須確認客戶的syn(ack=j+1)(ack:確認字元,表示發來的資料已確認接收無誤),同時自己也傳送一個syn包(sny=k),既ack+syn包,此時伺服器進入SYN_RECV(傳送了ACK時的狀態)狀態。
                  第三次握手:客戶端收到服務端傳送的syn+ack包,向服務端傳送確認包ack(sny+1既ack=k+1),此包傳送完畢,客戶端與伺服器進入ESTABLISHED(TCP連線成功)狀態,完成三次握手。

 


--------------------- 

 (2)、TCP四次揮手(連線終止協議,性質為終止協議):
                   第一次揮手:TCP客戶端傳送一個FIN+ACK+SEQ,用來傳輸關閉客戶端到服務端的資料。進入FIN_WAIT1狀態。
                   第二次揮手:服務端收到FIN,被動傳送一個ACK(SEQ+1),進入CLOSE_WAIT狀態,客戶端收到服務端傳送的ACK,進入FIN_WAIT2狀態。
                   第三次揮手:伺服器關閉客戶端連線,傳送一個FIN給+ACK+SEQ客戶端。進入LAST_ACK狀態。
                   第四次揮手:客戶端傳送ACK(ACK=SQE序號+1)報文確認,客戶端進入TIME_WAIT狀態,服務端收到ACK進入CLOSE狀態。

(3)、由於TCP連線時雙工的,因此每個方向都需要單獨進行關閉。這原則是當一方完成它的資料傳送任務後就能傳送一個FIN來終止這個方向的連線。收到一個FIN只意味著這一個方向上沒有資料流動,一個TCP連線到一個FIN後仍能傳送資料。首次執行FIN的一方主動關閉,另一方則執行被動關閉。當只握手兩次時,就只會關閉主動發起的一端,另一個仍能傳送資料。
---------------------