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

本试题部分为408真题,考察对网络尤其是TCP/IP模型中的通信原理的理解程度,部分为原创试题,主要考察对之前实验内容的掌握程度。

一、选择题

1.(2019年408题)若主机甲主动发起一个与主机乙的TCP连接,甲、乙选择的初始序列号分别为 2018 和 2046,则第三次握手 TCP 段的确认序列号是()

A. 2018
B. 2019
C. 2046
D. 2047

答案及解析:D。第三次握手为甲对乙的序号的确认,会占用一个序号,故为2046+1=2047。

2.(原创)系统调用system_call的中断处理流程中,start_kernel函数调用()

A.init_IRQ

B.lockdep_init

C.trap_init

D.idt_setup_traps

答案及解析:C。中断处理流程:start_kernel --> trap_init --> idt_setup_traps -->0x80--entry_INT80_32

3.(原创)socket接口函数的内核处理函数是()

A.sys_socket

B.sys_read

C.sys_write

D.sys_open

答案及解析:A。在sys_call_table中定义了函数名及其入口点,sys_read是read函数的入口点,sys_write是write函数的入口点,sys_open是open函数的入口点。

4.(原创)网络相关命令工具中用于跟踪一个消息从一台计算机到另一台计算机所走的路径的命令是()

A.ping

B.ssh

C.traceroute

D.iptables

答案及解析:C。ping命令用于测试网络连接的状况,ssh是一种以安全的方式提供远程登录的协议,iptables是Linux系统内置的防火墙命令。

5.(原创)在用JAVA实现基于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() 

答案及解析:D。如图:如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?_第1张图片

6.(原创)在GDB调试中list命令是用来()

A.打印内部变量值

B.开始运行程序

C.设置断点

D.显示多行源代码

答案及解析:D。break命令用来设置断点,run命令开始运行程序,print命令用来打印内部变量值。

7.(2011年 408题)主机甲向主机乙发送一个(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。主机乙收到连接请求报文后,如同意连接,则向甲发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是甲发送的TCP段的初始序号seq=11220加1,即为ack= 11221,同时也要选择并消耗一个初始序号seq,seq值由主机乙的TCP进程确定,本题取seq= 11221与确认号、甲请求报文段的序号没有任何关系。

8.(原创)分析下面代码,listen实际处理的工作是由()完成的。

1550/*
1551 *    Perform a listen. Basically, we allow the protocol to do anything
1552 *    necessary for a listen, and if that works, we mark the socket as
1553 *    ready for listening.
1554 */
1555
1556SYSCALL_DEFINE2(listen, int, fd, int, backlog)
1557{
1558    struct socket *sock;
1559    int err, fput_needed;
1560    int somaxconn;
1561
1562    sock = sockfd_lookup_light(fd, &err, &fput_needed);
1563    if (sock) {
1564        somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
1565        if ((unsigned int)backlog > somaxconn)
1566            backlog = somaxconn;
1567
1568        err = security_socket_listen(sock, backlog);
1569        if (!err)
1570            err = sock->ops->listen(sock, backlog);
1571
1572        fput_light(sock->file, fput_needed);
1573    }
1574    return err;
1575}

A.sock_lookup_light

B.sock_net

C.sock->ops->listen

D.fput_light

答案及解析:C。此函数最终进入到sock->ops->listen,这是一个socket接口层通往具体协议处理的接口。

9.(原创)下面的代码为JAVA代码中创建ServerSocket对象,其对应Linux socket API中哪几个函数()

ServerSocket serverSocket = new ServerSocket(8888);

A.socket()、bind()

B.bind()、linsten()

C.socket()、listen()

D.socket()、bind()、isten()

10.(2012年408题)某主机的 IP 地址为 180.80.77.55,子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组,则目的地址可以是_____ 。

A.180.80.76.0

B.180.80.76.255

C.180.80.77.255

D.180.80.79.255

答案及解析:D。由子网掩码可知前 22 位为子网号、后 10 位为主机号。IP 地址的第 3 个字节为 01001101(下划线为子网号的一部分),将主机号全置为 1,可得广播地址为 180.80.79.255。

二、综合题

1.(原创)简述TCP连接建立时 3 次握手的具体过程。

答案及解析:

第一次握手:当客户端向服务器发起连接请求时,客户端会发送同步序列标号SYN到服务器,在这里我们设SYN为x,等待服务器确认,这时客户端的状态为SYN_SENT。

第二次握手:当服务器收到客户端发送的SYN后,服务器要做的是确认客户端发送过来的SYN,在这里服务器发送确认包ACK,这里的ACK为x+1,意思是说“我收到了你发送的SYN了”,同时,服务器也会向客户端发送一个SYN包,这里我们设SYN为y。这时服务器的状态为SYN_RECV。 一句话,服务器端发送SYN和ACK两个包。

第三次握手:客户端收到服务器发送的SYN和ACK包后,需向服务器发送确认包ACK,“我也收到你发送的SYN了,我这就给你发个确认过去,然后我们即能合体了”,这里的ACK为y+1,发送完毕后,客户端和服务器的状态为ESTABLISH,即TCP连接成功。 在三次握手中,客户端和服务器端都发送两个包SYN和ACK,只不过服务器端的两个包是一次性发过来的,客户端的两个包是分两次发送的。

2.(2012年408题)主机 H 通过快速以太网连接 Internet,IP 地址为 192.168.0.8,服务器 S 的 IP 地址为 211.68.71.80。H 与S 使用 TCP 通信时,在 H 上捕获的其中 5 个 IP 分组如题下表所示。

题47-a表
编号 IP分组前40字节内容(16进制)
1

45 00 00 30  01 9b 40 00  80 06 1d e8  c0 a8 00 08  d3 44 47 50

0b d9 13 88  84 6b 41 c5  00 00 00 00  70 02 43 80  5d b0 00 00

2

43 00 00 30  00 00 40 00  31 06 6e 83  d3 44 47 50  c0 a8 00 08

13 88 0b d9  e0 59 9f ef  84 6b 41 c6  70 12 16 d0  37 e1 00 00

3

45 00 00 28  01 9c 40 00  80 06 1d ef  c0 a8 00 08  d3 44 47 50

0b d9 13 88  84 6b 41 c6  e0 59 9f f0  50 f0 43 80  2b 32 00 00

4

45 00 00 38  01 9d 40 00  80 06 1d de  c0 a8 00 08  d3 44 47 50

0b d9 13 88  84 6b 41 c6  e0 59 9f f0  50 18 43 80  e6 55 00 00

5

45 00 00 28  68 11 40 00  31 06 06 7a  d3 44 47 50  c0 a8 00 08

13 88 0b d9  e0 59 9f f0  84 6b 41 d6  50 10 16 d0  57 d2 00 00

(1)题 47-a 表中的 IP 分组中,哪几个是由 H 发送的?哪几个完成了 TCP 连接建立过程?哪几个在通过快速以太网传输时进行了填充?

(2)根据题 47-a 表中的 IP 分组,分析 S 已经收到的应用层数据字节数是多少?

(3)若题 47-a 表中的某个 IP 分组在 S 发出时的前 40 字节如题 47-b 表所示,则该 IP 分组到达 H 时经过了多少个路由器?

如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?_第2张图片

答案及解析:

(1)由于题 47-a 表中 1、3、4 号分组的原 IP 地址均为 192.168.0.8(c0a8 0008H),所以 1,3,4 号分组是由H 发送的。题 47-a 表中 1 号分组封装的 TCP 段的 FLAG 为 02H(即 SYN=1,ACK=0),seq=846b 41c5H,2 号分组封装的TCP 段的 FLAG 为 12H(即 SYN=1,ACK=1),seq=e059 9fefH,ack=846b 41c6H,3 号分组封装的 TCP 段的 FLAG为 10H(即 ACK=1),seq=846b 41c6H,ack= e059 9ff0H,所以 1、2、3 号分组完成了 TCP 连接建立过程。由于快速以太网数据帧有效载荷的最小长度为 46 字节,表中 3、5 号分组的总长度为 40(28H)字节,小于 46字节,其余分组总长度均大于 46 字节。所以 3、5 号分组通过快速以太网传输时进行了填充。

(2)由 3 号分组封装的 TCP 段可知,发送应用层数据初始序号为 seq=846b 41c6H,由 5 号分组封装的 TCP 段可知,ack 为 seq=846b 41d6H,所以 5 号分组已经收到的应用层数据的字节数为 846b 41d6H - 846b 41c6H=10H=16。

(3)由于 S 发出的 IP 分组的标识=6811H,所以该分组所对应的是题 47-a 表中的 5 号分组。S 发出的 IP 分组的 TTL=40H=64,5 号分组的 TTL=31H=49,64-49=15,所以,可以推断该 IP 分组到达 H 时经过了 15 个路由器。

你可能感兴趣的:(如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?)