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里一句話】:不是每一個窗口都產生一個線程(因為要付出昂貴的線程切換代價)。即,深入理解之:一個線程可以對應多個窗口。主線程可以創建出其所要的全部窗口。