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()時。將觸發三次握手。
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裏一句話】:不是每個窗口都產生一個線程(由於要付出昂貴的線程切換代價)。即,深刻理解之:一個線程能夠對應多個窗口。主線程能夠建立出其所要的所有窗口。