1. 程式人生 > >c++面試題(網路通訊篇)

c++面試題(網路通訊篇)

●TCP和UDP的區別

UDP 與 TCP 的主要區別在於 UDP 不一定提供可靠的資料傳輸,它不能保證資料準確無誤地到達,不過UDP在許多方面非常有效。當程式是要儘快地傳輸儘可能多的資訊時,可以使用 UDP。TCP它是通過三次握手建立的連線,它在兩個服務之間始終保持一個連線狀態,目的就是為了提供可靠的資料傳輸。許多程式使用單獨的TCP連線和單獨的UDP連線,比如重要的狀態資訊用可靠的TCP連線傳送,而主資料流通過UDP傳送。

●TCP連線建立的時候3次握手的具體過程,以及其中的每一步是為什麼

因為TCP是一個雙向通訊協議,所以要三次握手才能建立:

第一次握手是客戶端向服務端傳送連線請求包(SYN=J),服務端接收到之後會給客戶端發個確認標誌(也就是兩個包,一個是確認包ACK=J+1,另一個是連線詢問請求包SYN=K),這是第二次握手。第三次握手就是客戶端會再次給服務端傳送訊息確認標誌ACK=K+1,表示能正常接收可以開始通訊。第三次握手的目的是為了防止已經失效的連線請求突然又傳送到了服務端,因為網路中有可能存在延遲的問題,如果採用二次握手就會讓服務端誤認為client是再次發出新的連線請求,然後server一直等待client發來資料,這樣就浪費了很多資源。這三次握手是在connect,bind,listen和accept函式中完成的,這幾個函式建立了比較可靠的連線通道。其實斷開連線的四次握手是跟連線的時候一樣的,唯一多了一步就是因為雙方都處在連線的時候,而且有可能在傳輸資料,在服務端接收到客戶端的關閉連線請求後它會給客戶端確認,但是由於資料還沒有傳送完畢,此時會進入一個TIME_WAIT狀態,所以在資料傳送好之後會再次給客戶端發訊息,這就是多出來的那一步。

●TCP報文的格式,欄位的意義

TCP報文段分為首部和資料兩部分,首部的前20個位元組是固定的,有源埠和目的埠,序號,確認序號,資料偏移,確認ACK,推送復位同步等等。

●TCP協議如何來保證傳輸的可靠性

第一個是它將資料截斷為合理的長度,這一點和UDP完全不同。第二個是超時重發和檢驗機制,還有對於收到的請求它會給出確認響應。最後它還可以進行流量控制,防止較慢主機的緩衝區溢位。

●TIME_WAIT狀態

當有一方接收到另一方的關閉請求並給出確認時,就會進入TIME_WAIT狀態。

存在原因:

(1)為了實現TCP全雙工連線的可靠釋放

(2)為了使一些舊的資料包在網路中因過期而消失

●CAsyncSocket的運作流程

CAsyncSocket是一個非同步非阻塞通訊機制,可以隨時發包,也可以隨時收包,但是不能保障傳送和接收的完成,可以呼叫GetLastError來判斷是哪個錯誤程式碼,

連線建立的同時,OnSend就被第一次觸發了,主動呼叫send來發送資料也會觸發OnSend函式,由於傳送資料有可能不能一次完成,它要乾的事情就是根據任務和傳送進度呼叫Send繼續發,這個跟接收流程邏輯不同,你永遠不需要主動呼叫Recieve,你只應該在OnRecieve中等待。每次OnRecieve被觸發,然後被動呼叫一次Recieve來接受固定長度的資料,連線可能因為各種原因中斷,所以你需要判斷m_hSocket是否是連線狀態進行自動重連。

CSocket是從CAsyncSocket派生而來,它提供了更高層的WinSockAPI介面,,CSocket物件提供阻塞模式,如果需要低層控制和高效率就使用CAsyncSock,如果想要方便的話就使用CSocket類。

●socket阻塞與非阻塞,同步與非同步

同步/非同步主要是針對client端

同步:就是在client端發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。

非同步:與同步相對,當client端呼叫發出後,會立即返回,但呼叫者不能立刻得到結果,而是由其它通知或回撥來通知呼叫者。

阻塞/非阻塞主要針對server端

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起,函式只有在得到結果之後才會返回。 非阻塞則會立刻返回。像Recv介面是阻塞的,RecvFrom非阻塞的。

有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。

●HTTP請求

(1)http請求報文:由請求行,請求頭,請求資料三部分組成。

請求行包括請求方法、URL和HTTP協議版本。請求方法有GET,POST,HEAD等等。

GET:當客戶端要從服務端讀取資料時用GET,使用GET方法時,請求引數和對應的值 附加在URL後面,利用一個問號(?)代表URL的結尾和請求引數的開始,傳遞引數長度受限制,例:/index.jsp?id=100&op=bind

POST:是向伺服器提交資料,POST方法請求引數封裝在HTTP請求資料中,可以傳輸大量資料,可用來傳送檔案。

請求頭:由關鍵字/值對組成,每行一對,關鍵字和值用冒號隔開,請求頭是通知服務端有關於客戶端請求的資訊。如Host:請求的主機名

請求資料:用於POST方法中。

(2)Get和Post請求的區別

Get是向伺服器索取資料的一種請求,而Post是向伺服器提交資料的一種請求。Get請求的引數會跟在url後進行傳遞,它對傳輸的資料有大小限制。POST請求的資料會放置在HTML Header內提交。Post比Get安全,當資料是中文或者不敏感的資料,則用get,因為使用get,引數會顯示在地址上,對於敏感資料和不是中文字元的資料則用POST。

(3)如何檢視GET/POST請求是否傳送成功

藉助抓包工具,由返回的結果得出是否請求成功。如HttpAnalyzerstdv7。

(4)HTTP狀態碼:表示網頁伺服器HTTP響應狀態的3位數字程式碼。一般狀態碼的第一個數字代表了響應的五種狀態。

比如2XX開頭的代表成功,像200代表請求已成功,表示正常狀態。202代表伺服器已接受請求,但尚未處理。

3XX代表重定向,需要客戶端採取進一步操作才能完成請求。

4XX代表請求錯誤,401請求身份驗證,403表示拒絕執行,404表示請求失敗。

5開頭代表伺服器錯誤。

(5)cookie和Session的區別:cookie是客戶端保持狀態的機制,明文的,可以被篡改,大小有限制,session儲存在伺服器上,加密的,可以對應無限大的資料。

相關推薦

c++試題網路通訊

●TCP和UDP的區別 UDP 與 TCP 的主要區別在於 UDP 不一定提供可靠的資料傳輸,它不能保證資料準確無誤地到達,不過UDP在許多方面非常有效。當程式是要儘快地傳輸儘可能多的資訊時,可以使用 UDP。TCP它是通過三次握手建立的連線,它在兩個服務之間始終保持一個連

c++試題設計模式

●觀察者模式:當物件間有一對多的依賴關係時,當一個物件的狀態發生改變時,所有依賴於它的物件都會得到通知並自動更新。 class Subject//被觀察者 {        Attach(Observ

C++試題基礎

2018秋招經歷的一些面試題以及網上整理的面試題 一、Tcp的三次握手和四次揮手 三次握手: 四次揮手:   二、Tcp為什麼要三次握手?(詳情參考https://www.jianshu.com/p/e7f45779008a,或計算機網路這本書) 三次握手的目的是“為

C/C++試題3——劍指offer1賦值運算子函式

今天又複習了C++面試題,這道題的目的是:給出一個類的宣告,然後寫出這個類的建構函式、解構函式、拷貝建構函式和運算子過載函式。 題目 //題目:如下為型別CMyString的宣告,請為該型別新增賦值

C#試題曾經面試過三次

1:求輸出結果  static void Main(string[] args)         {             int x = 20;             int y = 40;    GetResult(ref x, y);      Console.W

C/C++ 試題 收集

1, 計算sizeof表示式和strlen表達的值(32位作業系統)。 char s1[] = “”; char s2[] = “Hello World”; char *p = s2; char *q = NULL; void *r = malloc(100);

c++試題資料結構篇

●二叉搜尋樹:一個節點最多隻允許兩個子節點,任何節點的鍵值一定大於其左子樹中的每個節點的鍵值,並小於其右子樹中每個結點的鍵值。從左可以搜尋到最小元素,從右可以搜尋到最大元素。 ●紅黑樹:是一個平衡二叉

C++試題

1、什麼是虛擬函式?什麼是純虛擬函式? 答:虛擬函式宣告如下: virtual ReturnType FunctionName(Parameter);引入虛擬函式是為了動態繫結。 純虛擬函式宣告如下:virtual ReturnType FunctionNa

C++試題

31:記憶體對齊的方式和為什麼要記憶體對齊 記憶體對齊的規則: 1.結構(struct)(或聯合(union))的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說

解析“60k”大佬的19道C#試題

# 解析“60k”大佬的19道C#面試題(上) ## 先略看題目: 1. 請簡述`async`函式的編譯方式 2. 請簡述`Task`狀態機的實現和工作機制 3. 請簡述`await`的作用和原理,並說明和`GetResult()`有什麼區別 4. `Task`和`Thread`有區別嗎?如果有請簡述區別

補充《解析“60k”大佬的19道C#試題

【廣州.NET技術俱樂部】微信群的周杰寫了一篇文章《解析“60k”大佬的19道C#面試題(上)》https://www.cnblogs.com/sdflysha/p/20200325-19-csharp-interview-question-from-60k-boss-1.html,寫

解析“60k”大佬的19道C#試題

# 解析“60k”大佬的19道C#面試題(下) 在上篇中,我解析了前 `10` 道題目,本篇我將嘗試解析後面剩下的所有題目。 > 姐妹篇:[解析“60k”大佬的19道C#面試題(上)](https://www.cnblogs.com/sdflysha/p/20200325-19-csharp-intervie

web前端開發試題未完待續

tex ora 相對 設置 erl 思路 實現 多列 寬度 一、HTML與XHTML的不同:1)XHTML元素必須被正確地嵌套 2)元素必須被關閉 如:<h1>……&l

2017年8道php試題真題+答案

php 高級php1、<?php echo count(strlen(“http://php.net”)); ?>的執行結果是? 答案:1 講解:count(var)是用來統計數組或對象的元素個數的。當var是null或者空數組時,結果為0。如果var是普通變量,則返回1。正常情況下返回var中的

百度試題2018.10.29 內容生態事業部

介紹自己的專案 專案的資料量有多大 zookeeper在follower死掉後,如何重新選舉? hdfs的資料儲存和讀取過程? hdfs在資料儲存過程中,如何保證副本的資料一致性? 當時我沒想起來,於是被問道,如果是你設計,你會如何實現hdf

滴滴試題2018.10.27 HBase資深工程師

第一個面試官: 介紹專案? HBase的架構? HBase的讀寫的整個流程? HBase的主鍵設計? 對Phoenix有什麼優化? hive的分割槽表,hive的分桶表,有什麼區別? zookeeper的資料結構? z

Android試題2018.11.16

一、UI的繪製過程,常見優化手段以及原理。 二、有幾種常見的單例模式?對於這幾種單例模式synchronized具體鎖的是什麼東西? 三、問記憶體優化你做過沒有?一張十萬乘以十萬的圖片,如何載入才不會記憶體溢位? 四、問記憶體溢位,記憶體抖動,記憶體洩漏你都碰到過嗎?怎麼解決的?如何區分

java試題持續更新中

1、寫出內部類的特點 Java中的內部類共分為四種: 靜態內部類:只可以訪問外部類的靜態成員和靜態方法,包括了私有的靜態成員和方法生成靜態內部類物件的方式為: OuterClass.InnerClass inner = new OuterClass.InnerClass();   成

--20181021 試題回想總結backup

1.溝通能力;2.邏輯能力;3.職業亮點 1.CMS/VOS/EMR採用的是MVC模式,還是MVVM?後端僅僅用了spring+JPA? 答:看後端專案架構,直接檢視Maven jar包的引用,cms(spring+jpa[hibernate實現spring jpa

軟體測試經典試題面試必看

引用與指標有什麼區別? 1) 引用必須被初始化,指標不必。 2) 引用初始化以後不能被改變,指標可以改變所指的物件。 3) 不存在指向空值的引用,但是存在指向空值的指標。 Internet.採用哪種網路協議?該協議的主要層次結構?Internet.實體地址和IP.地址轉