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


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)關閉套接字。

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)關閉套接字。

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允許被中斷的程序繼續運行、單步運行和運行到指定光標處,分別對應快捷鍵F5、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里一句話】:不是每一個窗口都產生一個線程(因為要付出昂貴的線程切換代價)。即,深入理解之:一個線程可以對應多個窗口。主線程可以創建出其所要的全部窗口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM