C++面試寶典--計算機網絡

原文鏈接:https://www.nowcoder.com/tutorial/93/60c2f308109c4a7d8089a710b9ba1dab

1. 請你說一下TCP怎麼保證可靠性

(1)序列號、確認應答、超時重傳
數據到達接收方,接收方需要發出一個確認應答,表示已經收到該數據段,並且確認序號會說明了它下一次需要接收的數據序列號。如果發送遲遲未收到確認應答,那麼可能是發送的數據丟失,也可能是確認應答丟失,這時發送方在等待一定時間後會進行重傳。這個時間一般是2RTT(報文段往返時間)+一個偏差值。
(2)窗口控制與高速重發控制/快速重傳(重複確認應答)
TCP會利用窗口控制來提高傳輸速度,意思是在一個窗口大小內,不用一定要等到應答才能發送下一段數據,窗口大小就是無需等待確認而可以繼續發送數據的最大值。如果不使用窗口控制,每一個沒收到確認應答的數據都要重發。
使用窗口控制,如果數據段1001-2000丟失,後面數據每次傳輸,確認應答都會不停地發送序號爲1001的應答,表示我要接收1001開始的數據,發送端如果收到3次相同應答,就會立刻進行重發;但還有種情況有可能是數據都收到了,但是有的應答丟失了,這種情況不會進行重發,因爲發送端知道,如果是數據段丟失,接收端不會放過它的,會瘋狂向它提醒…
(3)擁塞控制
如果把窗口定的很大,發送端連續發送大量的數據,可能會造成網絡的擁堵(大家都在用網,你在這狂發,吞吐量就那麼大,當然會堵),甚至造成網絡的癱瘓。所以TCP在爲了防止這種情況而進行了擁塞控制。
慢啓動:定義擁塞窗口,一開始將該窗口大小設爲1,之後每次收到確認應答(經過一個rtt),將擁塞窗口大小
2。
擁塞避免:設置慢啓動閾值,一般開始都設爲65536。擁塞避免是指當擁塞窗口大小達到這個閾值,擁塞窗口的值不再指數上升,而是加法增加(每次確認應答/每個rtt,擁塞窗口大小+1),以此來避免擁塞。
將報文段的超時重傳看做擁塞,則一旦發生超時重傳,我們需要先將閾值設爲當前窗口大小的一半,並且將窗口大小設爲初值1,然後重新進入慢啓動過程。
快速重傳:在遇到3次重複確認應答(高速重發控制)時,代表收到了3個報文段,但是這之前的1個段丟失了,便對它進行立即重傳。
然後,先將閾值設爲當前窗口大小的一半,然後將擁塞窗口大小設爲慢啓動閾值+3的大小。
這樣可以達到:在TCP通信時,網絡吞吐量呈現逐漸的上升,並且隨着擁堵來降低吞吐量,再進入慢慢上升的過程,網絡不會輕易的發生癱瘓。

2.請回答一下HTTP和HTTPS的區別,以及HTTPS有什麼缺點?

HTTP協議和HTTPS協議區別如下:
(1)HTTP協議是以明文的方式在網絡中傳輸數據,而HTTPS協議傳輸的數據則是經過TLS加密後的,HTTPS具有更高的安全性
(2)HTTPS在TCP三次握手階段之後,還需要進行SSL 的handshake,協商加密使用的對稱加密密鑰。
(3)HTTPS協議需要服務端申請證書,瀏覽器端安裝對應的根證書。
(4)HTTP協議端口是80,HTTPS協議端口是443

HTTPS優點:
(1)HTTPS傳輸數據過程中使用密鑰進行加密,所以安全性更高
(2)HTTPS協議可以認證用戶和服務器,確保數據發送到正確的用戶和服務器

HTTPS缺點:
(1)HTTPS握手階段延時較高:由於在進行HTTP會話之前還需要進行SSL握手,因此HTTPS協議握手階段延時增加。
(2)HTTPS部署成本高:一方面HTTPS協議需要使用證書來驗證自身的安全性,所以需要購買CA證書;另一方面由於採用HTTPS協議需要進行加解密的計算,佔用CPU資源較多,需要的服務器配置或數目高。

3. 請你說一說HTTP返回碼

HTTP協議的響應報文由狀態行、響應頭部和響應包體組成,其響應狀態碼總體描述如下:
1xx:指示信息–表示請求已接收,繼續處理。
2xx:成功–表示請求已被成功接收、理解、接受。
3xx:重定向–要完成請求必須進行更進一步的操作。
4xx:客戶端錯誤–請求有語法錯誤或請求無法實現。
5xx:服務器端錯誤–服務器未能實現合法的請求。

常見狀態代碼、狀態描述的詳細說明如下。
200 OK:客戶端請求成功。
206 partial content服務器已經正確處理部分GET請求,實現斷點續傳或同時分片下載,該請求必須包含Range請求頭來指示客戶端期望得到的範圍
300 multiple choices(可選重定向):被請求的資源有一系列可供選擇的反饋信息,由瀏覽器/用戶自行選擇其中一個。
301 moved permanently(永久重定向):該資源已被永久移動到新位置,將來任何對該資源的訪問都要使用本響應返回的若干個URI之一。
302 move temporarily(臨時重定向):請求的資源現在臨時從不同的URI中獲得,
304:not modified :如果客戶端發送一個待條件的GET請求並且該請求以經被允許,而文檔內容未被改變,則返回304,該響應不包含包體(即可直接使用緩存)。
403 Forbidden:服務器收到請求,但是拒絕提供服務。
404 not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。

4. 請你說一說IP地址作用,以及MAC地址作用

MAC地址是一個硬件地址,用來定義網絡設備的位置,主要由數據鏈路層負責。而IP地址是IP協議提供的一種統一的地址格式,爲互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。

5. 請回答OSI七層模型和TCP/IP四層模型,每層列舉2個協議

OSI七層模型及其包含的協議如下:
物理層: 通過媒介傳輸比特,確定機械及電氣規範,傳輸單位爲bit,主要包括的協議爲:IEEE802.3 CLOCK RJ45
數據鏈路層: 將比特組裝成幀和點到點的傳遞,傳輸單位爲幀,主要包括的協議爲MAC VLAN PPP
網絡層:負責數據包從源到宿的傳遞和網際互連,傳輸單位爲包,主要包括的協議爲IP ARP ICMP
傳輸層:提供端到端的可靠報文傳遞和錯誤恢復,傳輸單位爲報文,主要包括的協議爲TCP UDP
會話層:建立、管理和終止會話,傳輸單位爲SPDU,主要包括的協議爲RPC NFS
表示層: 對數據進行翻譯、加密和壓縮,傳輸單位爲PPDU,主要包括的協議爲JPEG ASII
應用層: 允許訪問OSI環境的手段,傳輸單位爲APDU,主要包括的協議爲FTP HTTP DNS

TCP/IP 4層模型包括:
網絡接口層:MAC VLAN
網絡層:IP ARP ICMP
傳輸層:TCP UDP
應用層:HTTP DNS SMTP

6. 搜索baidu,會用到計算機網絡中的什麼層?每層是幹什麼的?

瀏覽器中輸入URL
瀏覽器要將URL解析爲IP地址,解析域名就要用到DNS協議,首先主機會查詢DNS的緩存,如果沒有就給本地DNS發送查詢請求。DNS查詢分爲兩種方式,一種是遞歸查詢,一種是迭代查詢。如果是迭代查詢,本地的DNS服務器,向根域名服務器發送查詢請求,根域名服務器告知該域名的一級域名服務器,然後本地服務器給該一級域名服務器發送查詢請求,然後依次類推直到查詢到該域名的IP地址。DNS服務器是基於UDP的,因此會用到UDP協議。

得到IP地址後,瀏覽器就要與服務器建立一個http連接。因此要用到http協議,http協議報文格式上面已經提到。http生成一個get請求報文,將該報文傳給TCP層處理,所以還會用到TCP協議。如果採用https還會使用https協議先對http數據進行加密。TCP層如果有需要先將HTTP數據包分片,分片依據路徑MTU和MSS。TCP的數據包然後會發送給IP層,用到IP協議。IP層通過路由選路,一跳一跳發送到目的地址。當然在一個網段內的尋址是通過以太網協議實現(也可以是其他物理層協議,比如PPP,SLIP),以太網協議需要直到目的IP地址的物理地址,有需要ARP協議。

其中:
(1)DNS協議,http協議,https協議屬於應用層
應用層是體系結構中的最高層。應用層確定進程之間通信的性質以滿足用戶的需要。這裏的進程就是指正在運行的程序。應用層不僅要提供應用進程所需要的信息交換和遠地操作,而且還要作爲互相作用的應用進程的用戶代理,來完成一些爲進行語義上有意義的信息交換所必須的功能。應用層直接爲用戶的應用進程提供服務。
(2)TCP/UDP屬於傳輸層
傳輸層的任務就是負責主機中兩個進程之間的通信。因特網的傳輸層可使用兩種不同協議:即面向連接的傳輸控制協議TCP,和無連接的用戶數據報協議UDP。面向連接的服務能夠提供可靠的交付,但無連接服務則不保證提供可靠的交付,它只是“盡最大努力交付”。這兩種服務方式都很有用,備有其優缺點。在分組交換網內的各個交換結點機都沒有傳輸層。
(3)IP協議,ARP協議屬於網絡層
網絡層負責爲分組交換網上的不同主機提供通信。在發送數據時,網絡層將運輸層產生的報文段或用戶數據報封裝成分組或包進行傳送。在TCP/IP體系中,分組也叫作IP數據報,或簡稱爲數據報。網絡層的另一個任務就是要選擇合適的路由,使源主機運輸層所傳下來的分組能夠交付到目的主機。
(4)數據鏈路層
當發送數據時,數據鏈路層的任務是將在網絡層交下來的IP數據報組裝成幀,在兩個相鄰結點間的鏈路上傳送以幀爲單位的數據。每一幀包括數據和必要的控制信息(如同步信息、地址信息、差錯控制、以及流量控制信息等)。控制信息使接收端能夠知道—個幀從哪個比特開始和到哪個比特結束。控制信息還使接收端能夠檢測到所收到的幀中有無差錯。
(5)物理層
物理層的任務就是透明地傳送比特流。在物理層上所傳數據的單位是比特。傳遞信息所利用的一些物理媒體,如雙絞線、同軸電纜、光纜等,並不在物理層之內而是在物理層的下面。因此也有人把物理媒體當做第0層。

7. 請你說一說TCP擁塞控制?以及達到什麼情況的時候開始減慢增長的速度?

擁塞控制是防止過多的數據注入網絡,使得網絡中的路由器或者鏈路過載。流量控制是點對點的通信量控制,而擁塞控制是全局的網絡流量整體性的控制。發送雙方都有一個擁塞窗口——cwnd。
(1)慢開始
最開始發送方的擁塞窗口爲1,由小到大逐漸增大發送窗口和擁塞窗口。每經過一個傳輸輪次,擁塞窗口cwnd加倍。當cwnd超過慢開始門限,則使用擁塞避免算法,避免cwnd增長過大。
(2)擁塞避免
每經過一個往返時間RTT,cwnd就增長1。
在慢開始和擁塞避免的過程中,一旦發現網絡擁塞,就把慢開始門限設爲當前值的一半,並且重新設置cwnd爲1,重新慢啓動。(乘法減小,加法增大)
(3)快重傳
接收方每次收到一個失序的報文段後就立即發出重複確認,發送方只要連續收到三個重複確認就立即重傳(儘早重傳未被確認的報文段)。
(4)快恢復
當發送方連續收到了三個重複確認,就乘法減半(慢開始門限減半),將當前的cwnd設置爲慢開始門限,並且採用擁塞避免算法(連續收到了三個重複請求,說明當前網絡可能沒有擁塞)。採用快恢復算法時,慢開始只在建立連接和網絡超時才使用。

達到什麼情況的時候開始減慢增長的速度?
採用慢開始和擁塞避免算法的時候
(1)一旦cwnd>慢開始門限,就採用擁塞避免算法,減慢增長速度
(2)一旦出現丟包的情況,就重新進行慢開始,減慢增長速度
採用快恢復和快重傳算法的時候
(1) 一旦cwnd>慢開始門限,就採用擁塞避免算法,減慢增長速度
(2)一旦發送方連續收到了三個重複確認,就採用擁塞避免算法,減慢增長速度。

8. 請你說說傳遞到IP層怎麼知道報文該給哪個應用程序,它怎麼區分UDP報文還是TCP報文

根據端口區分;
看ip頭中的協議標識字段,17是udp,6是tcp

9. 請問你有沒有基於做過socket的開發?具體網絡層的操作該怎麼做?(其實也是問網絡編程的基本步驟)

服務端:socket-bind-listen-accept
客戶端:socket-connect

10. 請問server端監聽端口,但還沒有客戶端連接進來,此時進程處於什麼狀態?

這個需要看服務端的編程模型,如果如上一個問題的回答描述的這樣,則處於阻塞狀態,如果使用了epoll,select等這樣的io複用情況下,處於運行狀態。

11. 請你來說一下GET和POST的區別

概括
對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)

區別:
(1)get參數通過url傳遞,post放在request body中。
(2)get請求在url中傳遞的參數是有長度限制的,而post沒有。
(3)get比post更不安全,因爲參數直接暴露在url中,所以不能用來傳遞敏感信息。
(5)get請求只能進行url編碼,而post支持多種編碼方式。
(6)get請求參數會被完整保留在瀏覽歷史記錄裏,而post中的參數不會被保留。
(7)GET產生一個TCP數據包;POST產生兩個TCP數據包。

12. 請你來說一下數字證書是什麼,裏面都包含那些內容

概念:
數字證書是在一個身份和該身份的持有者所擁有的公/私鑰對之間建立了一種聯繫,由認證中心(CA)或者認證中心的下級認證中心頒發的。根證書是認證中心與用戶建立信任關係的基礎。在用戶使用數字證書之前必須首先下載和安裝。

數字證書頒發過程:
數字證書頒發過程如下:用戶產生了自己的密鑰對,並將公共密鑰及部分個人身份信息傳送給一家認證中心。認證中心在覈實身份後,將執行一些必要的步驟,以確信請求確實由用戶發送而來,然後,認證中心將發給用戶一個數字證書,該證書內附了用戶和他的密鑰等信息,同時還附有對認證中心公共密鑰加以確認的數字證書。當用戶想證明其公開密鑰的合法性時,就可以提供這一數字證書。

內容:
數字證書的格式普遍採用的是X.509V3國際標準,一個標準的X.509數字證書包含以下一些內容:
(1)證書的版本信息;
(2)證書的序列號,每個證書都有一個唯一的證書序列號;
(3)證書所使用的簽名算法;
(4)證書的發行機構名稱,命名規則一般採用X.500格式;
(5)證書的有效期,通用的證書一般採用UTC時間格式;
(6)證書所有人的名稱,命名規則一般採用X.500格式;
(7)證書所有人的公開密鑰;
(8)證書發行者對證書的簽名。

13. 請你來介紹一下udp的connect函數

給UDP套接字調用connect,這樣做的結果與TCP連接不同的是沒有三路握手過程。內核只是檢查是否存在立即可知的錯誤,記錄對端的IP地址和端口號,然後立即返回調用進程。
其實一旦UDP套接字調用了connect系統調用,那麼這個UDP上的連接就變成一對一的連接,但是通過這個UDP連接傳輸數據的性質還是不變的,仍然是不可靠的UDP連接。一旦變成一對一的連接,在調用系統調用發送和接受數據時也就可以使用TCP那一套系統調用了。
由已連接UDP套接字引發的異步錯誤會返回給它們所在的進程,而未連接的UDP套接字不接收任何異步錯誤。
UDP客戶進程或服務器進程只在使用自己的UDP套接字與確定的唯一對端進行通信時,纔可以調用connect。調用connect的通常是UDP客戶,不過有些網絡應用中的UDP服務器會與單個客戶長時間通信TFTP,這種情況下,客戶和服務器都可能調用connect。

14. 請你說一下阻塞,非阻塞,同步,異步

阻塞和非阻塞:調用者在事件沒有發生的時候,一直在等待事件發生,不能去處理別的任務這是阻塞。調用者在事件沒有發生的時候,可以去處理別的任務這是非阻塞。

同步和異步:調用者必須循環自去查看事件有沒有發生,這種情況是同步。調用者不用自己去查看事件有沒有發生,而是等待着註冊在事件上的回調函數通知自己,這種情況是異步。

15. 請你講述一下Socket編程的send() recv() accept() socket()函數?

send函數用來向TCP連接的另一端發送數據。客戶程序一般用send函數向服務器發送請求,而服務器則通常用send函數來向客戶程序發送應答,send的作用是將要發送的數據拷貝到緩衝區,協議負責傳輸。

recv函數用來從TCP連接的另一端接收數據,當應用程序調用recv函數時,recv先等待s的發送緩衝中的數據被協議傳送完畢,然後從緩衝區中讀取接收到的內容給應用層。

accept函數用來接收一個連接,內核維護了半連接隊列和一個已完成連接隊列,當隊列爲空的時候,accept函數阻塞,不爲空的時候accept函數從上邊取下來一個已完成連接,返回一個文件描述符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章