天天看點

不可不知的軟體測試經典面試題

軟體測試經典面試題

    • Q1、為什麼要三次握手?/為什麼不能用兩次握手進行連接配接?
    • Q2、為何連接配接的時候是三次握手,關閉的時候是四次揮手?
    • Q3、如果已經建立了連接配接,但是用戶端突然出現故障怎麼辦?
    • Q4、為何TIME_WAIT狀态需要經過2MSL才能傳回到CLOSE狀态?
    • Q5、簡述三次握手和四次揮手
    • Q6、為什麼用戶端最後要等待2MSL?(同Q4)
    • Q7、HTTP和HTTPS的差別?
    • Q8、TCP和UDP差別?
    • Q9、HTPPS為什麼安全?

♠ \color{red}{\spadesuit} ♠

Q1、為什麼要三次握手?/為什麼不能用兩次握手進行連接配接?

對三次握手不明白的可以看下三次握手和四次揮手

  答:三次握手完成兩個功能:一是連接配接伺服器指定的端口,建立TCP連接配接,保證通信雙方的資料發送和接受正常;二是同步連接配接雙方的序列号和确認号并交換TCP視窗大小資訊,這個序列号在握手過程中被發送和确認。

三次握手是為了防止已失效的連接配接請求封包突然又傳送到服務端,而發生錯誤。

三次握手若改為兩次握手,很容易發生死鎖。我們假設這樣一種情況,考慮計算機S和C之間的通信,假定C給S發送一個分組請求,S收到後發送确認應答分組。按照兩次握手協定,S認為連接配接已經成功建立,可以開始發送資料分組,可是,S的應答分組在傳輸給C的過程中出現丢失,C不知道S是否已經準備好,不知道S建立了什麼樣的序列号,C甚至會懷疑S是否已經收到了自己的請求,在這種情況下,C認為連接配接還未成功,将忽略S發來的任何資料分組,隻等待連接配接确認應答分組。而S在發出的分組逾時後,重新發出同樣的分組,便形成了死鎖。

Q2、為何連接配接的時候是三次握手,關閉的時候是四次揮手?

  答:連接配接的時候是三次握手,是因為Server端收到Client端的SYN連接配接請求封包後,可以直接發送SYN+ACK封包,其中ACK封包是響應,SYN是同步。但關閉時是四次是因為,當Server端收到FIN封包時,并不會立即關閉socket,它僅僅表示對方(Client端)發送完了自己要發的資料,但是,server端的資料未必已經發完,是以,Server端先禮貌地回應Client端一個ACK,”嗯,好的,我收到了“。隻有當Server端把所有的資料都發完了,才能發送FIN封包,是以FIN和ACK不能同時一起發送給對方,需要分開來發送,導緻多了一次,是以是四次揮手。

Q3、如果已經建立了連接配接,但是用戶端突然出現故障怎麼辦?

  答:TCP還設有一個保活計時器,當然,用戶端若出現故障,server端不可能傻傻一直等待下去,白白浪費資源。伺服器每收到一用戶端的請求後都會重新複位這份計時器,時間通常是設為2小時,若超過這個設定時間還未收到用戶端的任何資料,伺服器便會發送一個探測封包段,以後每隔一定時間(75分鐘)發送一次。若一連發送10個探測封包人仍然沒有得到反應,伺服器就認為用戶端出了故障,接着關閉連接配接。

Q4、為何TIME_WAIT狀态需要經過2MSL才能傳回到CLOSE狀态?

  答:按道理,四個封包都發送完畢可以直接進入CLOSE狀态了,但是,我們必須假設網絡是不可靠的,有可能最後一個ACK丢失了。是以,TIME_WAIT狀态就是用來重發可能丢失的ACK封包。

在client端發送出最後的ACK封包回複給server端(ACK可能會丢失),在server端未接收到ACK之前,會一直重複發送FIN片段,是以Client端不能關閉,必須處于TIME_WAIT等待狀态。client端會設定一個定時器,等待2MSL的時間,如果在該時間内再次收到FIN,那麼client端會重發ACK并再次等待2MSL(Maximum Segment Lifetime)若直到2MSL,Client端沒有再次收到FIN,那麼Client端推斷ACK已經成功被接收,則結束TCP連接配接。

Q5、簡述三次握手和四次揮手

參考我的另外一篇博文三次握手和四次揮手

Q6、為什麼用戶端最後要等待2MSL?(同Q4)

該問題和Q4問題類似,下面是另外一種回答參考

  答:它可以保證用戶端發送的最後一個ACK封包能夠到達伺服器,因為這個ACK封包可能丢失。MSL是最大封包生存時間,2倍的MSL剛好是封包來回的時間,如果在這個2MSL時間内用戶端沒有收到伺服器端發來的FIN片段,代表伺服器端已經成功接收到了ACK,如果沒有成功接收,伺服器端會發送FIN片段,這是用戶端可以重新發送ACK封包,是以它能確定發送的最後一個ACK封包到達伺服器。

Q7、HTTP和HTTPS的差別?

  Http協定運作在TCP之上,明文傳輸,用戶端與伺服器端都無法驗證對方的身份;Https是身披SSL(Secure Socket Layer)外殼的Http,運作于SSL上,SSL運作于TCP之上,是添加了加密和認證機制的HTTP。

二者之間存在如下不同:

  1. 端口不同:Http的預設端口是80,Https則是443;
  2. 資源消耗:和Http通信相比,Https通信會由于加減密處理消耗更多的CPU和記憶體資源;
  3. 開銷:Https需要申請證書,而證書一般需要向認證機構購買;
  4. http連接配接很簡單,無狀态的,而https是由SSL+HTTP協定建構的可進行加密傳輸、身份驗證的網絡協定,比http安全。

Q8、TCP和UDP差別?

TCP (Transmission Control Protocol)是傳輸控制協定

UDP(User Datagram Protocol)是使用者資料報協定

兩者都屬于傳輸層協定,它們之間的差別包括:

  1. TCP是面向連接配接的,UDP是無連接配接的;
  2. TCP是可靠的,UDP是不可靠的;
  3. TCP隻支援點對點通信,UDP支援一對一、一對多、多對一、多對多的通信模式;
  4. TCP是面向位元組流的,UDP是面向封包的;
  5. TCP有擁塞控制機制,UDP沒有擁塞控制,适合媒體通信;
  6. TCP首部開銷(20個位元組)比UDP的首部開銷(8個位元組)要大
所謂位元組流服務(Byte Stream Service)是指,為了友善傳輸,将大塊資料分割成以封包段(segment)為機關的資料包進行管理。而可靠的傳輸服務是指,能夠把資料準确可靠地傳輸給對方。

Q9、HTPPS為什麼安全?

這個是我朋友在秋招面試時在回答完Q7的問題後延伸出來的另外一個問題。詳情看這篇☞HTTPS為什麼安全

更多面試題可以看

軟體測試筆試面試題

三次握手和四次揮手