一、如何評測軟件工程師的計算機網絡知識水平與網絡編程技能水平?
1.計算機網絡基本知識
集線器、路由器、光纖、同軸電纜等硬件設備的基本了解;
TCP/IP網絡的五個層次;
TCP/IP協議棧的初始化,網絡數據收發的具體過程;
ARP、DNS、L2交換網絡的基本了解;
2.代碼作業能力
熟悉Linux Socket網絡編程;
追蹤了解Socket API與系統調用的關系;
能夠閱讀並分析涉及網絡數據收發過程的函數源代碼;
3.學習能力
善於閱讀源代碼與技術文檔;
善於搜索並學習他人經驗;
二、基於Linux源碼的網絡協議棧簡介
1.網絡層次結構
2.Linux Socket
socket 位於應用層,它為網絡應用編程提供API。通過Linux Socket,網絡應用程序得以訪問內核空間的協議棧,從而形成通信。同時,Linux系統中一切皆文件,Socket也是文件的一部分,調用Socket API進行數據收發時控制的是收發緩沖區的文件描述符。Linux Socket API的定義在./net/socket.c中。以下是UDP Socket與TCP Socket處理過程
3.TCP/IP協議棧
TCP位於傳輸層,其主要功能包括建立連接(三次握手)、滑動窗口和擁塞控制,Linux中TCP棧的基本處理過程如下:
IP位於網絡層,其主要功能包括IP Fragment的分片轉發和路由處理,Linux中IP棧的基本處理過程如下:
ARP也屬於TCP/IP協議,它負責將IP地址轉換為物理地址;
DNS為域名系統,由於IP地址不便於記憶,所以將其轉換為容易記憶的域名;
Linux TCP/IP協議棧的初始化定義在linux/net/ipv4/af_inet.c
4.數據鏈路層
數據鏈路層在物理介質上提供可靠的傳輸。該層的作用包括:物理地址尋址、流量控制、數據的檢錯重發等。數據鏈路層協議的代表包括:SDLC、HDLC、PPP、STP、幀中繼等。
Linux 提供了一個 Network device 的抽象層實現數據鏈路層的功能,其定義在 linux/net/core/dev.c
參考資料:https://blog.csdn.net/weixin_33724659/article/details/85808277
三、計算機網絡知識水平與編程能力測試
一、選擇題(5小題,每小題4分,共20分)
1.計算機網絡中使用最廣泛的交換技術是( ) 【網課“計算機網絡”測試題】
A.電路交換 B.報文交換 C.分組交換 D.線路交換
答案:C,最常用的TCP/IP協議數據傳輸形式為分組
2.關於TCP/IP的IP層協議描述不正確的是( ) 【網課“計算機網絡”測試題】
A、是點到點的協議 B、不能保證IP報文的可靠傳送
C、是無連接的數據報傳輸機制 D、每一個IP數據包都需要對方應答
答案:A,IP協議為面向無連接
3.對地址轉換協議(ARP)描述正確的是( )【2012考研真題】
A、ARP封裝在IP數據報的數據部分 B、ARP是采用廣播方式發送的
C、ARP是用於IP地址到域名的轉換 D、發送ARP包需要知道對方的MAC地址
答案:B,主機發送信息時將包含目標IP地址的ARP請求廣播到局域網絡上的所有主機,並接收返回消息,以此確定目標的物理地址。不需要提前知道MAC地址。
4.在TCP/IP體系結構中,直接為ICMP提供服務的協議是( ) 【2012考研真題】
A.PPP B.IP C.UDP D.TCP
答案:C, ICMP報文包含在IP數據報內。
5.以下關於API與系統調用之間關系描述不正確的是( ) 【原創】
A. API可能直接提供⽤戶態的服務
B. ⼀個單獨的API可能調⽤⼏個系統調⽤
C. 每個API都調用了系統調用
D. 不同的API可能調⽤了同⼀個系統調⽤
答案:C, API可能不調用系統調用
二、簡答題(5小題,每小題8分,共40分)
1.ipv4和ipv6能表示的總地址數量分別為多少?【原創】
答案:2^32, 2^128。 ipv4有32位(4字節),ipv6有128位(16字節)。
2.簡述TCP協議建立連接的過程,並畫出示意圖。【百度文庫】
答案:第1次握手:客戶端通過將一個含有“同步序列號(SYN)”標志位的數據段發送給服務器。
第2次握手:服務器用一個帶有“確認應答(ACK)”和“同步序列號(SYN)”標志位的 數據段響應客戶端。
第3次握手:客戶端發送一個數據段確認收到服務器的數據段,並開始傳送實際數據。
3.API和系統調用各自的定義,關系和區別。【原創】
答案:系統調用為操作系統為⽤戶態進程與硬件設備進⾏交互提供的⼀組接口,應⽤編程接⼜(application program interface, API)和系統調⽤是不同的,API只是⼀個函數定義;不是每個API都對應⼀個特定的系統調⽤,API可能直接提供⽤戶態的服務(如⼀些數學函數),⼀個單獨的API可能調⽤⼏個系統調⽤,不同的API可能調⽤了同⼀個系統調⽤。
4.linux/net/socket.c中__sys_sendto和__sys_recvfrom函數包含哪些主要內容?是否包含流量控制?【原創】
答案:包含滑動窗口與收發緩沖區文件描述符的分配,不包含流量控制。
5.什么是DNS?主要功能是什么?如何理解域名www.edu.cn?【百度文庫】
答案:DNS是域名服務,即Domain Name Service,它提供將域名與IP地址之間的雙向解析功能,即可以將域名解析成對應的IP,可以將IP反向解析為對應的域名。
www.edu.cn的頂級域名是cn,代表中國,而edu是二級域名,代表教育單位,www是主機名。
三、綜合題(2小題,每小題20分,共40分)
1.用java socket實現一個簡單的網絡聊天程序,只需寫出主體代碼,答案不唯一,合理即可。【原創】
參考答案:
public class server { public static void main(String[] args) throws Exception { // 監聽指定的端口,阻塞直至客戶端連接此端口 int port = 23333; ServerSocket server = new ServerSocket(port); System.out.println("server is waiting..."); Socket socket = server.accept(); System.out.println("Connected!"); // 讀取從客戶端返回的輸入流,至尾端時返回-1 InputStream input = socket.getInputStream(); byte[] bytes = new byte[1024]; int len; StringBuilder get = new StringBuilder(); while ((len = input.read(bytes)) != -1) { get.append(new String(bytes, 0, len, "UTF-8")); } System.out.println("get message from client: " + get); OutputStream output = socket.getOutputStream(); String sent = "Hi there"; output.write(sent.getBytes("UTF-8")); System.out.println("sent message to client: " + sent); // 關閉socket與服務器端 input.close(); output.close(); socket.close(); server.close(); } } public class client { public static void main(String args[]) throws Exception { // 連接本地主機,端口自設,與服務端一致即可 String host = "127.0.0.1"; int port = 23333; // 通過socket與服務端建立連接 Socket socket = new Socket(host, port); if(socket.isConnected()){ System.out.println("Connected!"); } // 將要發送的信息寫入輸出流 OutputStream output = socket.getOutputStream(); String sent = "hello"; socket.getOutputStream().write(sent.getBytes("UTF-8")); // 關閉客戶端的輸出流(單向,並未關閉socket) socket.shutdownOutput(); System.out.println("sent message to server: " + sent); // 讀取從server返回的輸入流 InputStream input = socket.getInputStream(); byte[] bytes = new byte[1024]; int len; StringBuilder get = new StringBuilder(); while ((len = input.read(bytes)) != -1) { get.append(new String(bytes, 0, len,"UTF-8")); } System.out.println("get message from server: " + get); // 關閉socket input.close(); output.close(); socket.close(); } }
2.【2009考研真題】某網絡拓撲如下圖所示,路由器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。
R1和R2的路由表結構為:目的網絡IP地址 子網掩碼 下一跳IP地址接口
(1) 將IP地址空間202.118.1.0/24划分為2個子網,分別分配給局域網1、局域網2,每個局域網需分配的IP地址數不少於120個。請給出子網划分結果,說明理由或給出必要的計算過程。
(2) 請給出R1的路由表,使其明確包括到局域網1的路由、局域網2的路由、域名服務器的主機路由和互聯網的路由。
(3) 請采用路由聚合技術,給出R2到局域網1和局域網2的路由。0101H11——02254H1
答案:
(1)CIDR中的子網號可以全0或全1,但主機號不能全0或全1。因此若將IP地址空間202.118.1.0/ 24划分為2個子網,且每個局域網需分配的IP地址個數不少於120個,子網號至少要占用一位。
由 26-2<120<27-2可知,主機號至少要占用7位。由於源IP地址空間的網絡前綴為24位,因此主機號位數+子網號位數= 8 。綜上可得主機號位數為7,子網號位數為1。因此子網的划分結果為:
子網1:202.118.1.0/25,子網2:202.118.1.128/25。地址分配方案:子網1分配給局域網1,子網2分配給局域網2,或子網1分配給局域網2,子網2分配給局域網1。
(2) 由於局域網1和局域網2分別與路由器R1的E1、E2接口直接相連,因此在R1的路由表中,目的網絡為局域網1的轉發路徑是直接通過接口E1轉發,目的網絡為局域網2的轉發路徑是直接通過接口E1轉發。由於局域網1、2的網絡前綴均為25位,因此它們的子網掩碼均為255. 255. 255.128。根據題意,R1專門為域名服務器設定了一個特定的路由表項,因此該路由表項中的子網掩碼應為255.255.255.255。對應的下一跳轉發地址是202.118.2.2,轉發接口是L0。根據題意,到互聯網的路由實質上相當於一個默認路由,默認路由一般寫作0/0,即目的地址為0.0.0.0,子網掩碼為0. 0.0.0。對應的下一跳轉發地址是202. 118. 2.2,轉發接口是L0。綜上可得到路由器R1的路由表為:
(3) 局域網1和局域網2的地址可以聚合為202.118.1.0/24,而對於路由器R2來說,通往局域網1和2的
轉發路徑都是從L0接口轉發,因此采用路由聚合技術后,路由器R2到局域網1和局域網2的路由為: