如何評測一個軟件工程師的計算機網絡知識水平與網絡編程技能水平?
1. 掌握Linux網絡相關命令的用法及原理,當網絡出現故障時會使用相關命令進行分析和排查。
2. 熟練運用Linux Socket API進行網絡編程,掌握各編程語言提供的Socket API接口與Linux Socket API之間的調用關系。
3. 掌握socket與系統調用的關系,跟蹤分析socket接口直至對應的linux內核系統調用處理函數,理解一個Linux Socket API背后對應的執行過程。
4. 是否熟練掌握TCP/IP協議及背后的工作原理,能在linux內核代碼中分析TCP/IP協議棧是如何初始化的,以及如何執行的。
5. 掌握常見的二層協議和數據鏈路層接受數據的過程。
6. 了解網絡安全方面的知識,了解互聯網架構設計背后的淵源。
以Linux源代碼為例簡要總結一下網絡協議棧:
- Linux Socket API:以TCP為例
- 服務器端:socket()—>bind()—>listen()—>accept()—>recv()—>send()—>close()
- 客戶端:socket()—>connect()—>recv()—>send()—>close()
- 系統調用:socket接口在用戶態通過系統調用機制進入內核,內核將系統調用作為一個特殊的中斷來處理,即軟中斷(對應128號中斷向量),使用int 0x80指令陷入到內核,128號中斷向量對應的中斷服務例程是 entry_INT80_32 。
- 用戶態調用connect()函數時,對應的匯編是先將connect的系統調用號362放到寄存器%eax中,然后執行int 0x80指令,進入內核,內核執行128號中斷向量對應的服務例程entry_INT80_32 ,entry_INT80_32根據%eax的值362去系統調用表里找對應的服務例程為__sys_connect,在執行__sys_connect()函數時,調用了sock->ops->connect這個函數指針指向的函數。在TCP協議的初始化過程中,已經將這個函數指針綁定到tcp_v4_connect函數。一次connect()函數調用對應的完整流程如下圖所示:
計算機網絡知識技能水平的測評試題:
一、選擇題:
1. 若將網絡 21.3.0.0/16 划分為128個規模相同的子網,則每個子網可分配的最大地址個數是___。
A. 254 B. 256
C. 510 D. 512
參考答案:C
解析:來自2017年408真題第38題。考察子網的划分,只要注意每個子網的全0和全1不能用即可。
2. 下列關於交換機的敘述中,正確的是____
A. 以太網交換機本質上是一種多端口網橋
B. 通過交換機互連的一組工作站構成一個沖突域
C. 交換機每個端口所連網絡構成一個獨立的廣播域
D. 以太網交換機可實現采用不同網絡層協議的網絡互聯
參考答案:A
解析:來自2015年408真題第37題。考察二層交換機相關知識,交換機只能隔離沖突域,不能隔離廣播域,路由器可以隔離廣播域;路由器可以實現異構網絡的互聯,交換機不行。
3. 以下說法錯誤的是___
A. 中繼器工作在物理層
B. 路由器工作在網絡層
C. 交換機工作在數據鏈路層
D. 網橋工作在物理層
參考答案:D
解析:來自課件。網橋和交換機都工作在二層數據鏈路層。
4. 主機甲向主機乙發送一個(SYN=1,seq=11220)的TCP段,期望與主機乙建立TCP連接,若主機乙接受該連接請求,則主機乙向主機甲發送的正確的TCP段可能是____
A. (SYN=0,ACK=0,seq=11221,ack=11221)
B. (SYN=1,ACK=1,seq=11220,ack=11220)
C. (SYN=1,ACK=1,seq=11221,ack=11221)
D. (SYN=0,ACK=0,seq=11220,ack=11220)
參考答案:C
解析:來自2011年408真題第39題。考察三次握手,把握SYN=1,ack=11221即可,ack代表期望接收的下一個段序號。
5. 在實現基於TCP的網絡應用程序時,服務器端正確的處理流程為____
A. socket()—>bind()—>listen()—>connect()—>read()/write()—>close()
B. socket()—>bind()—>listen()—>read()/write()—>close()
C. socket()—>bind()—>listen()—>accept()—>read()/write()—>close()
D. socket()—>connect()—>read()/write()—>close()
參考答案:C
解析:來自百度文庫。考察服務端和客戶端的socket網絡編程,解析參考以上總結。
二、判斷題:(來自教學PPT)
1. gethostbyname()函數用於將ip地址轉化為域名。(×)
解析:gethostbyname()函數用於通過域名獲取ip地址。
2. recv函數用於從TCP接受數據,recvfrom用於從UDP接受數據。(√)
3. Socket是獨立於具體協議的網絡編程接口。(√)
4. 使用socket()函數創建套接字描述符,且套接字描述符與進程的文件描述符共用,不能相同。(√)
5. socket接口既可以通過112號系統調用socketcall進入內核,又可以通過各具體的系統調用進入內核。(√)
三、綜合題:
1. 假設網絡中的設備剛啟動;當A發送一個MAC幀給E時,這時二層交換機I、II、III的過濾數據庫會發生什么變化?當E收到后,緊接着發送一個MAC幀給A,此時二層交換機I、II、III的過濾數據庫又會發生什么變化?並給出這次各MAC幀的擴散范圍。
來源:PPT L2 Switching上的例題 https://github.com/mengning/net/blob/master/np2019.md
解:由於網絡中的設備都剛啟動,各交換機的過濾數據庫表均為空。當A發送一個MAC幀時,由於使用以太網鏈路,會在本地LAN網里廣播,LAN網里的其他主機也會收到該MAC幀,但由於檢測到目的MAC地址不是自己,就會丟棄掉該MAC幀;與LAN網相連的交換機I在1號端口收到該MAC幀后,在自己的過濾數據庫表中沒有匹配到對應的表項,於是根據該MAC幀的源地址使用學習算法添加一條新的表項;並把該MAC幀廣播到除1號端口以外的所有其他端口,在本例中是2號端口。I號交換機的2號端口轉發該MAC幀到主機B所在的LAN網,由於是以太網所以也使用廣播,依次傳播下去。注意到主機C會收到A發送給E的MAC幀,因為一開始沒有對應的表項,交換機II會轉發該MAC幀到1、3號端口。而當E發送一個MAC幀給A時,由於路由器II的過濾數據表中已經有目的MAC地址為A的表項,所以所直接轉發該MAC幀給2號端口,因此C不會收到E發送給A的MAC幀。
2. 簡述TCP建立連接的三次握手過程。
1. 第一次握手:建立連接。客戶端發送連接請求報文段,並將SYN位置為1,假設seqence number為8000,然后,客戶端進入SYN_SEND狀態,等待服務器的確認。
2. 第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設置acknowledg number為8001(對序號為8000的報文段進行確認,期望接受序號為8001的報文段),將ACK標志位置為1(只有ACK置位為1,ack才有效);同時,自己還要發送SYN請求信息,將SYN位置為1,假設sequence number為15000;服務器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一並發送給客戶端,此時服務器進入SYN_RECV狀態;
3. 第三次握手:客戶端收到服務器的SYN+ACK報文段。將acknowledgment number設置為15001,然后將ACK標志位置為1,向服務器發送ACK報文段,這個報文段發送完畢以后,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手,客戶端和服務器端就可以開始傳送數據。