如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平
如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平
一,软件工程师应具备的计算机网络编程能力和知识
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分)
答: