如何評測一個軟件工程師的計算機網絡知識水平與網絡編程技能水平
一,軟件工程師應具備的計算機網絡編程能力和知識
1,基礎知識
(1)熟悉計算機系統的基礎知識
(2)熟悉網絡操作系統的基礎知識和協議
(3)熟悉系統安全、數據安全和網絡安全的基本知識和協議
(4)掌握計算機網絡有關的標准化知識
(5)理解網絡新技術及其發展趨勢
2,技術能力
(1)掌握TCP/IP協議網絡的聯網方法和網絡應用服務技術
(2)掌握網絡管理的基本原理和操作方法
(3)掌握局域網組網技術等計算機網絡互聯技術
(4)熟悉網絡系統的性能測試和優化技術
3,其他
(1)團隊合作和溝通交流能力
(2)學習能力和求知欲
(3)一定的英語水平
(4)掌握相關工具和資源
參考資料:
https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B%E5%B8%88/470034?fr=aladdin
https://lvwenhan.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/485.html
http://ishare.iask.sina.com.cn/f/34UluOrMscQ.html
二,從Linux源碼看網絡協議棧
1.准備知識
INET socket層:BSD socket是個可以用於各種網絡協議的接口,而當用於tcp/ip,即建立了AF_INET形式的socket時,還需要保留些額外的參數,於是就有了struct sock結構。文件主要有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c,etc
TCP/UDP層:處理傳輸層的操作,傳輸層用struct inet_protocol和struct proto兩個結構表示。文件主要有:/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c,etc
IP層:處理網絡層的操作,網絡層用struct packet_type結構表示。文件主要有:/net/ipv4/ip_forward.cip_fragment.c ip_input.c ip_output.c etc.
數據鏈路層和驅動程序:每個網絡設備以struct net_device表示,通用的處理在dev.c中,驅動程序都在/driver/net目錄下。

| sys_read fs/read_write.c
| sock_read net/socket.c
| sock_recvmsg net/socket.c
| inet_recvmsg net/ipv4/af_inet.c
| udp_recvmsg net/ipv4/udp.c
| skb_recv_datagram net/core/datagram.c
| -------------------------------------------
| sock_queue_rcv_skb include/net/sock.h
| udp_queue_rcv_skb net/ipv4/udp.c
| udp_rcv net/ipv4/udp.c
| ip_local_deliver_finish net/ipv4/ip_input.c
| ip_local_deliver net/ipv4/ip_input.c
| ip_recv net/ipv4/ip_input.c
| net_rx_action net/dev.c
| -------------------------------------------
| netif_rx net/dev.c
| el3_rx driver/net/3c309.c
| el3_interrupt driver/net/3c309.c
==========================
| sys_write fs/read_write.c
| sock_writev net/socket.c
| sock_sendmsg net/socket.c
| inet_sendmsg net/ipv4/af_inet.c
| udp_sendmsg net/ipv4/udp.c
| ip_build_xmit net/ipv4/ip_output.c
| output_maybe_reroute net/ipv4/ip_output.c
| ip_output net/ipv4/ip_output.c
| ip_finish_output net/ipv4/ip_output.c
| dev_queue_xmit net/dev.c
| --------------------------------------------
| el3_start_xmit driver/net/3c309.c
V

2,TCP/IP協議棧數據結構
3.啟動與初始化
不管在什么樣的平台上啟動linux,它的開始都是以start_kernel()進行系統的初始化,網絡協議棧的初始化也是在這個過程中完成。初始化進程 為start-kernel(main.c)---->do_basic_setup(main.c)---->sock_init(/net/socket.c)---->do_initcalls(main.c)。
初始化的時候,第一個調用的是sock_init,它主要完成:
(1) sysctl文件的創建。
(2)skb高速緩存初始化,它會在slab創建兩個節點skbuff_head_cache和skbuff_fclone_cache。
(3)注冊並掛socket文件系統。
然后系統通過proto_init完成協議相關proc文件的創建並執行一些協議初始化相關的函數。其中arp_init完成系統中路由部分neighbour表的初始化ip_init完成ip協議的初始化。在這兩個函數中,都通過定義一個packet_type結構的變量將這種數據包對應的協議發送數據、允許發送設備都做初始化。
接下來是路由初始化(包括neighbour表、FIB表、和路由緩存表的初始化工作)以及網絡接口設備初始化。
4.收發數據
(1)應用層:應用層的各種網絡應用程序基本上都是通過 Linux Socket 編程接口來和內核空間的網絡協議棧通信的。Linux Socket 是從 BSD Socket 發展而來的,它是 Linux 操作系統的重要組成部分之一,它是網絡應用程序的基礎。從層次上來說,它位於應用層,是操作系統為應用程序員提供的 API,通過它,應用程序可以訪問傳輸層協議。
(2)傳輸層(以TCP為例):傳輸層的最終目的是向它的用戶提供高效的、可靠的和成本有效的數據傳輸服務,主要功能包括 (1)構造 TCP segment (2)計算 checksum (3)發送回復(ACK)包 (4)滑動窗口(sliding windown)等保證可靠性的操作。TCP 協議棧的大致處理過程如下圖所示:
(3)網絡層:網絡層的任務就是選擇合適的網間路由和交換結點, 確保數據及時傳送。網絡層將數據鏈路層提供的幀組成數據包,包中封裝有網絡層包頭,其中含有邏輯地址信息- -源站點和目的站點地址的網絡地址。其主要任務包括 (1)路由處理,即選擇下一跳 (2)添加 IP header(3)計算 IP header checksum,用於檢測 IP 報文頭部在傳播過程中是否出錯 (4)可能的話,進行 IP 分片(5)處理完畢,獲取下一跳的 MAC 地址,設置鏈路層報文頭,然后轉入鏈路層處理。
(4)數據鏈路層:功能上,在物理層提供比特流服務的基礎上,建立相鄰結點之間的數據鏈路,通過差錯控制提供數據幀(Frame)在信道上無差錯的傳輸,並進行各電路上的動作系列。數據鏈路層在不可靠的物理介質上提供可靠的傳輸;實現上,Linux 提供了一個 Network device 的抽象層,其實現在 linux/net/core/dev.c。具體的物理網絡設備在設備驅動中(driver.c)需要實現其中的虛函數。Network Device 抽象層調用具體網絡設備的函數。
(5)總結:
參考資料:
https://blog.csdn.net/ren1335654481/article/details/54375396
https://blog.csdn.net/chenliang0224/article/details/80718973
https://blog.csdn.net/weixin_33724659/article/details/85808277
三,計算機網絡知識水平與編程能力測試
一,選擇題(20分)
1,【百度文庫】為了解決在不同體系結構的主機之間進行數據傳遞可能會造成歧義的問題,以下( )函數常常用來在發送端和接收端對雙字節或者四字節數據類型進行字節序轉換。
A、htons()/htonl()/ntohs()/ntohl()
B、inet_addr()/inet_aton()/inet_...
C、gethostbyname()/gethostbyaddr()
D、(struct sockaddr *)&(struct sockaddr_in類型參數)
答:A。考察對socket編程中常見函數的掌握。
2,【2010年408真題】如果本地域名服務無緩存,當采用遞歸方法解析另一網絡某主機域名時,用戶主機本地域名服務器發送的域名請求條數分別為( )
A、1條,多條
B、1條,1條
C、多條,1條
D、多條,多條
答:B,考察對DNS中的遞歸方法的掌握
3,【2012年408真題】ARP協議的功能是( )
A、根據域名查詢IP地址
B、根據MAC地址查詢IP地址
C、根據IP地址查詢MAC地址
D、根據IP地址查詢域名
答:C,考察ARP的基本概念。
4,【2009年408真題】在OSI參考模型中,自下而上第一個提供端到端服務的層次是 ( )
A、數據鏈路層
B、傳輸層
C、會話層
D、應用層
答:B,考察端到端概念和對OSI參考模型的掌握。
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基礎概念。
6,【原創】下面哪個函數負責構造一個攜帶SYN標志位的TCP頭並發送出去,同時還設置了計時器超時重發( )
A、tcp_transmit_skb
B、inet_csk_accept
C、tcp_v4_rcv
D、tcp_connect
答:D,考察對Linux網絡協議棧的了解。
7,【2011年408真題】在子網192.168.4.0/30中,能接收目的地址為192.168.4.3的IP分組的最大主機數是( )
A、0
B、1
C、2
D、4
答:C,首先分析192.168.4.0/30這個網絡。主機號占兩位,地址范圍192.168.4.0/30~192.168.4.3/30,即可以容納(4-2=2)個主機。主機位為全1時,即192.168.4.3,是廣播地址,因此網內所有主機都能收到,因此選C。
8,【百度文庫】TCP使用( )進行流量控制。
A、三次握手機制
B、窗口控制機制
C、自動重發機制
D、端口機制
答:B,考察流量控制基礎概念。
9,【原創】下列所示調用關系正確的是( )
A、應⽤程序、封裝例程、系統調⽤處理程序、系統調⽤服務例程
B、應⽤程序、系統調用處理程序、封裝例程、系統調⽤服務例程
C、應⽤程序、封裝例程、系統調⽤服務例程,系統調⽤處理程序
D、應⽤程序、系統調用服務例程、系統調⽤處理程序、封裝例程
答:A,考察系統調用相關概念。
10,【原創】下面哪個協議屬於常見的二層協議( )
A、RARP
B、VLAN
C、NFS
D、SPX
答:B,考察對二層協議的了解,來源講義。
二,填空題(20分,每空2分)
1.【百度文庫】IP服務的3個主要特點是 不可靠 、 面向無連接 和盡最大努力投遞。
答:概念題。
2.【原創】socket套接字的三種類型為 流式Socket , 數據報Socket 和 原始Socket 。
答:概念題,考察socket編程。
3,【電子科技大學2010 -2011網絡編程期末試題】 並發 是指真正的或表面的同時計算,一個單處理機多用戶的計算機可以通過 分時 機制實現表面的同時計算,而在多處理機下可以實現真正的同時計算。
答:考察並行與並發的概念。
4.【原創】調用fork以后,父子進程共享數據空間、代碼空間、堆棧和 文件描述字 。
答:考察進程的相關概念。
5.【原創】DNS是指 域名服務器 ,其作用是 主機用戶名和IP地址之間相互轉化 。
答:考察DNS基礎知識。
三,簡答題(20分)
1.【2009年408真題】某公司網絡拓撲圖如下圖所示,路由器R1通過接口E1、E2分別連接局域網1、局域網2,通過接口L0連接路由器R2,並通過路由器R2連接域名服務器與互聯網。R1的L0接口的IP地址是202.118.2.1;R2的L0接口的IP地址是202.118.2.2,L1接口的IP地址是130.11.120.1,E0接口的IP地址是202.118.3.1;域名服務器的IP地址是202.118.3.2
將IP地址空間202.118.1.0/24划分為兩個子網,分配給局域網1、局域網2,每個局域網分配的地址數不少於120個,請給出子網划分結果。說明理由或給出必要的計算過程。 請給出R1的路由表,使其明確包括到局域網1的路由、局域網2的路由、域名服務器的主機路由和互聯網的路由。 請采用路由聚合技術,給出R2到局域網1和局域網2的路由。(10)
答:
(1)本題中網絡地址位數是24,由於IP地址是32位,因此其主機號部分就是8位。因此,子網掩碼就是11111111 11111111 11111111 00000000,即255.255.255.0。根據無類IP地址的規則,每個網段中有兩個地址是不分配的:主機號全0表示網絡地址,主機號全1表示廣播地址。因此8位主機號所能表示的主機數就是254台。該網絡要划分為兩個子網,每個子網要120台主機,因此主機位數X應該滿足下面三個條件:a X<8。 b 2的X次方>120。c X是整數。得到X=7.子網掩碼就是11111111 11111111 11111111 10000000,即255.255.255.128。所以划分的兩個網段是:202.118.1.0/25與202.118.1.128/25。
(2)局域網1的網絡地址為202.118.1.0,掩碼為255.255.255.128。由於局域網1是直接連接到路由器R1的E1口上的,因此,下一跳地址填寫直接路由(Direct)。接口填寫E1;局域網2的網絡地址為202.118.1.128,掩碼為255.255.255.128.由於局域網2是直接連接到路由器R1的E2口上的,因此,下一跳地址填寫直接路由。接口填寫E2。由於域名服務器的IP地址為202.118.3.2,而該地址為主機地址,因此掩碼為255.255.255.255。同時,路由器R1要到DNS服務器,就需要通過路由器R2的接口L0才能到達,因此下一跳地址填寫L0的IP地址(202.118.2.2)。填寫互聯網路由實質是編寫默認路由。
(3)局域網1和局域網2的地址可以聚合為 202.118.1.0/24,而R2去往局域網1和局域網2都是同一條路徑。因此,路由表里面只需要填寫到202.118.1.0/24網絡的路由即可,如下表所示
目的網絡IP地址 子網掩碼 下一跳IP地址 接口
202.118.1.0 255.255.255.0 202.118.2.1 L0
2.【百度文庫】簡述TCP/IP協議中三次握手的過程及涵義,並畫出示意圖:(10分)
答:
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
四,代碼理解題(40分)
1.【電子科技大學2010 -2011網絡編程期末試題】I/O復用模型的關鍵是熟練掌握select函數,該函數的原型是 int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
(1)請詳細解釋select函數的參數的意義,以及執行結果。(15分)
(2)如何利用select函數構造一個最簡單的多協議服務器,同時提供TCP和UDP服務?畫出進程結構圖。(15分)
答:考察對I/O服用模型的掌握
(1)maxfd參數是所以監視的描述字中最大的描述字加1。中間三個參數分別表示監視的不同條件的描述字集合。其中readset為讀描述字集合,writeset為寫描述字集合,execptset為異常描述字集合。Timeout參數為select函數最長睡眠時間。
Select函數有三種執行情況:
永遠等待下去:僅在有一個或以上描述字准備好i/o才返回,為此,我們將timeout設置為空指針。
等待固定時間:在有一個描述字准備好時返回,但不超過由timeout參數指定的秒數和微秒數。
根本不等待,檢查描述字后立即返回,這稱為輪詢。這種情況下,timeout必須指向結構timeval,且定時器的值必須為0。
Select函數的返回值如下:
如果在指定超時值到達之前有一個或多個描述字滿足條件,則函數返回值大於零;
如果超時時間到時,沒有描述字滿足條件,函數返回值為0;如果select函數阻塞過程中,發生錯誤,函數返回值為-1;
(2)多協議服務器可以由一個執行線程構成,該線程既可以在TCP也可以在UDP上使用異步IO來處理通信。服務器最初打開兩個套接字,一個使用無連接的傳輸,一個使用面向連接的傳輸,使用異步IO等待兩個套接字之一就緒。
2.【原創】按順序列舉出Linux環境下UDP及TCP服務器端程序的編碼步驟及主要核心函數:(10分)
答: