面試中容易問到的網絡編程問題

1:tcp和udp的區別
2:流量控制和擁塞控制的實現機制
3:滑動窗口的實現機制
4:多線程如何同步。
5:進程間通信的方式有哪些,各有什麼優缺點
6:tcp鏈接創建的時候3次握手的具體過程,以及其中的每一步是爲何
7:tcp斷開鏈接的具體過程,其中每一步是爲何那麼作
8:tcp創建鏈接和斷開鏈接的各類過程當中的狀態轉換細節
9:epool與select的區別
10:epool中et和lt的區別與實現原理
11:寫一個server程序須要注意哪些問題
12:項目中遇到的難題,你是如何解決的
面試

 


 

 

3. 網絡編程的通常步驟編程

 

對於TCP鏈接:服務器

1.服務器端1)建立套接字create;2)綁定端口號bind;3)監聽鏈接listen;4)接受鏈接請求accept,並返回新的套接字;5)用新返回的套接字recv/send;6)關閉套接字。cookie

2.客戶端1)建立套接字create; 2)發起創建鏈接請求connect; 3)發送/接收數據send/recv;4)關閉套接字。網絡

TCP總結:多線程

Server端:create -- bind -- listen--  accept--  recv/send-- close併發

Client端:create------- conncet------send/recv------close.框架

 

對於UDP鏈接:異步

1.服務器端:1)建立套接字create;2)綁定端口號bind;3)接收/發送消息recvfrom/sendto;4)關閉套接字。socket

2.客戶端:1)建立套接字create;2)發送/接收消息sendto/recvfrom;3)關閉套接字.

UDP總結:

Server端:create----bind ----recvfrom/sendto----close

Client端:create----  sendto/recvfrom----close.

 

4.sendMessage與postMessage區別?

不一樣點:sendMessage發送完畢之後須要等待處理完才返回;而postMessage發送消息後當即返回。

Do not post the WM_QUIT message using PostMessage; use thePostQuitMessage function.

postMessage將消息放置到消息隊列中,不等待線程處理消息就當即返回。

sendMessage發送指定的消息到窗口,並會調用窗口過程,直到窗口過程處理完畢後才返回。

 

5. TCP的重發機制是怎麼實現的?

       1.滑動窗口機制,確立收發的邊界,能讓發送方知道已經發送了多少(已確認)、還沒有確認的字節數、尚待發送的字節數;讓接收方知道(已經確認收到的字節數)。

       2.選擇重傳,用於對傳輸出錯的序列進行重傳。

6. TCP和UDP的區別?

       1)TCP面向鏈接(三次握手機制),通訊前須要先創建鏈接;UDP面向無鏈接,通訊前不須要創建鏈接;

       2)TCP保障可靠傳輸(按序、無差錯、不丟失、不重複);UDP不保障可靠傳輸,使用最大努力交付;

       3)TCP面向字節流的傳輸,UDP面向數據報的傳輸。

7.進程間通訊有哪些方式?

       1)共享內存,如剪貼板;

       2)匿名管道/命名管道;

       3)郵槽。

       其中共享內存、匿名管道只能實現兩個進程間的通訊,不能跨網絡通訊;命名管道和郵槽能夠跨網絡進程間通訊;但命名管道屬於點對點的通訊,可傳輸大數據量;而郵槽一次傳輸的數據量很是有限,一般少於424字節。

8.TCP爲何不是兩次鏈接?而是三次握手?

若是A與B兩個進程通訊,若是僅是兩次鏈接。可能出現的一種狀況就是:A發送完請報文之後,因爲網絡狀況很差,出現了網絡擁塞,即B延時很長時間後收到報文,即此時A將此報文認定爲失效的報文。B收到報文後,會向A發起鏈接。此時兩次握手完畢,B會認爲已經創建了鏈接能夠通訊,B會一直等到A發送的鏈接請求,而A對失效的報文回覆天然不會處理。依次會陷入B忙等的僵局,形成資源的浪費。

相對於SOCKET開發者,TCP建立過程和連接折除過程是由TCP/IP協議棧自動建立的.所以開發者並不須要控制這個過程.可是對於理解TCP底層運做機制,至關有幫助.

 

 



並且對於有網絡協議工程師之類筆試,幾乎是必考的內容.企業對這個問題熱情之高,出乎個人意料:-)。有時上午面試前強調這個問題,並重復講一次,下午幾乎每個人都被問到這個問題。

所以在這裏詳細解釋一下這兩個過程。

TCP三次握手

所謂三次握手(Three-way Handshake),是指創建一個TCP鏈接時,須要客戶端和服務器總共發送3個包。

三次握手的目的是鏈接服務器指定端口,創建TCP鏈接,並同步鏈接雙方的序列號和確認號並交換 TCP 窗口大小信息.在socket編程中,客戶端執行connect()時。將觸發三次握手。





  • 第一次握手:
    客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算鏈接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裏。

  • 第二次握手:
    服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號(Acknowledgement Number)設置爲客戶的I S N加1以.即X+1。

 

  • 第三次握手.
    客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1.而且把服務器發來ACK的序號字段+1,放在肯定字段中發送給對方.而且在數據段放寫ISN的+1

SYN攻擊

   在三次握手過程當中,服務器發送SYN-ACK以後,收到客戶端的ACK以前的TCP鏈接稱爲半鏈接(half-open connect).此時服務器處於Syn_RECV狀態.當收到ACK後,服務器轉入ESTABLISHED狀態.

  Syn攻擊就是 攻擊客戶端 在短期內僞造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回覆確認包,並等待客戶的確認,因爲源地址是不存在的,服務器須要不斷的重發直 至超時,這些僞造的SYN包將長時間佔用未鏈接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引發網絡堵塞甚至系統癱瘓。

Syn攻擊是一個典型的DDOS攻擊。檢測SYN攻擊很是的方便,當你在服務器上看到大量的半鏈接狀態時,特別是源IP地址是隨機的,基本上能夠判定這是一次SYN攻擊.在Linux下能夠以下命令檢測是否被Syn攻擊

netstat -n -p TCP | grep SYN_RECV

通常較新的TCP/IP協議棧都對這一過程進行修正來防範Syn攻擊,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增長最大半鏈接和縮短超時時間等.

可是不能徹底防範syn攻擊。

TCP 四次揮手

TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,在socket編程中,任何一方執行close()操做便可產生揮手操做。

 


 

參見wireshark抓包,實測的抓包結果並無嚴格按揮手時序。我估計是時間間隔過短形成。

source url:http://bluedrum.cublog.cn

 

9. connect方法會阻塞,請問有什麼方法能夠避免其長時間阻塞?

能夠考慮採用異步傳輸機制,同步傳輸與異步傳輸的主要區別在於同步傳輸中,若是調用recvfrom後會一致阻塞運行,從而致使調用線程暫停運行;異步傳輸機制則否則,會當即返回。

8.網絡編程中設計併發服務器,使用多進程與多線程,請問有什麼區別?

答案一:

1,進程:子進程是父進程的複製品。子進程得到父進程數據空間、堆和棧的複製品。

2,線程:相對與進程而言,線程是一個更加接近與執行體的概念,它能夠與同進程的其餘線程共享數據,但擁有本身的棧空間,擁有獨立的執行序列。二者均可以提升程序的併發度,提升程序運行效率和響應時間。

線程和進程在使用上各有優缺點:線程執行開銷小,但不利於資源管理和保護;而進程正相反。同時,線程適合於在SMP機器上運行,而進程則能夠跨機器遷移。

答案二:

根本區別就一點:用多進程每一個進程有本身的地址空間(address space),線程則共享地址空間。全部其它區別都是由此而來的:

1。速度:線程產生的速度快,線程間的通信快、切換快等,由於他們在同一個地址空間內。

2。資源利用率:線程的資源利用率比較好也是由於他們在同一個地址空間內。

3。同步問題:線程使用公共變量/內存時須要使用同步機制仍是由於他們在同一個地址空間內。

等等

9. 簡述Windows編程容易出錯的幾點

  

10.Windows編程的知識點,如消息機制,一個自定義消息如何實現。

       自定義消息共分爲3步驟:

1)  自定義消息:#defineWM_MYMSG WM_USER+1

2)  在頭文件中聲明函數:       afx_msg voidonMyMsg();

3) 在消息映射中添加對應關係:

//BEGIN_MESSAGE_MAP(CDefMsgDemoDlg,CDialog) //END_MESSAGE_MAP()

ON_MESSAGE(WM_MYMSG,onMyMsg)

4)定義函數void onMyMsg();

核心即:函數原型、關聯消息與消息響應函數的宏、函數實現。

 

11.SNMP協議

       簡單網絡管理協議——應用層協議.

       包括5種數據包:Get-Request;Get-Next-Request; Set-Request, Get-Response; Trap;

12.RAW套接字

       普遍應用於高級網絡編程,如SNIFFER、拒絕服務、IP欺騙都是經過原始套接字實現的。

 

13. 窗口建立的步驟:

1)設計窗口類(填充結構體)à2)註冊窗口類RegisterClassà3)建立窗口;4)顯示ShowWindow&更新窗口UpdateWindowà4)循環獲取消息GetMessage(){翻譯(轉換)TranslateMessage消息、處理消息DispathMessage(將消息交付給窗口過程進行處理)}。

 

14. 當觸發按鈕之後發生了什麼?

       1)好比點擊鼠標左鍵後,操做系統首先會感知到該事件;2)操做系統將事件其轉化爲消息;3)操做系統將消息投遞到對應程序(線程)的消息隊列中;4)應用程序(線程)從消息隊列中經過GetMessage獲取消息,並經過DispathMessge將消息交付給操做系統;5)操做系統經過設計窗口類時指定的窗口過程對對消息進行處理。

 

15. 你平時是如何調試程序的?(引伸)當一個程序在本身機器上運行正常,可是在其餘機器上程序運行崩潰,如何查找緣由?

斷點調試:

值:查看變量(Variables)、表達式、內存(Memory)、寄存器(Register)的值。

進程控制:VC容許被中斷的程序繼續運行、單步運行和運行到指定光標處,分別對應快捷鍵F五、F10/F11和CTRL+F10。

其餘調試手段:系統提供一系列特殊的函數或者宏來處理Debug版本相關的信息TRACE、ASSERT、VERIFy。Ctrl+B打開斷點設置。

運行崩潰,如何查找緣由? [提示後],能夠經過打印語句來發現錯誤!

 

16.   線程、窗口、消息隊列三者之間的關係?

MSDN上如是說:

Thethread to which the message is posted must have created a message queue,or elsethe call to PostThreadMessage fails.  

並提供了以下兩種解決方法:

CallPostThreadMessage.If it fails, call the Sleep function and call PostThreadMessageagain. Repeat  until  PostThreadMessage  succeeds.

【面試官】說:一個線程對應一個或多個窗口(建立的關係),同時一個線程對應了一個消息隊列。

【總結以下】:1.在MFC程序框架裏面,CWinThread專門負責線程建立的,它能夠建立用戶界面線程,及工做者線程。其中用戶界面線程是包含消息隊列的,而工做者線程是不包含消息隊列的。即【一句話】:用戶界面線程對應一個消息隊列。2.CWinThread類和CWnd類都派生自CCmdTarget,而CDialog對話框類、視圖類CView都派生自CWnd。【深刻淺出MFC裏一句話】:不是每個窗口都產生一個線程(由於要付出昂貴的線程切換代價)。即,深刻理解之:一個線程能夠對應多個窗口。主線程能夠建立出其所要的所有窗口。

相關文章
相關標籤/搜索