网络程序设计期末考试试卷

℡╲_俬逩灬. 提交于 2020-01-10 19:30:03

一、如何评测软件工程师的计算机网络知识水平与网络编程技能水平?


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的路由为:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!