如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?
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三次握手,客户端和服务器端就可以开始传送数据。