如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?
一、网络程序课程总结
这一学期的网络课程结束了,最后一次博客简单回顾一下我学到了哪些知识
1、计算机系统的启动过程。从计算机上电开始,如何从实模式进入保护模式,0号进程与1号进程的产生,zygonate进程如何fork出其他进程等。并在实验中在start_kernel设置断点成功检测到系统启动过程的函数调用。
2、简单的socket编程。利用socket函数实现了一个简单的通信程序,了解了socket在网络编程的作用,各socket函数的逻辑。
3、学习了TCP/IP协议族的知识,深入linux系统查看有关函数调用,理解TCP协议中的流量控制、冲突检测、三次握手等知识。
4、学习了网络中其他协议、算法,比如路由算法、ARP、DNS等原理。
总之在这一个学期的学习中,我第一次了解到网络中这些协议是如何将网络中的资源信息送到我的面前的,如何解决资源冲突,甚至一窥在linux系统底层如何支持这些协议的,收获还是挺多的。
二、计算机网络知识水平与网络编程技能水平测试
Ⅰ、选择题
1. 在socket网络编程中,服务器端正确的处理流程是( )
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,为socket指定空间,监听socket请求,接收socket请求,进行读写,关闭socket。
2. 假设所有域名服务器均采用迭代查询方式进行域名解析。当H4访问规范域名为www.abc.xyz.com的网站时,域名服务器201.1.1.1在完成该域名解析过程中,可能发出DNS查询的最少和最多次数分别是()
答案:C
解析:最少情况下:当本机DNS高速缓存中存有该域名的DNS信息时,则不需要查询任何域名服务器,这样最少发出0次DNS查询。
最多情况下:因为均采用迭代查询的方式,在最坏的情况下,需要依次迭代地向本地域名服务器、根域名服务器(.com)、顶级域名服务器(xyz.com)、权限域名服务器(abc.xyz.com)发出DNS查询请求,因此最多发出4次DNS查询。因此选择C。
3. 以太网交换机进行转发决策时使用的PDU 地址是_______。
A.目的物理地址 B.目的IP 地址
C.源物理地址 D.源IP 地址
答案:A
解析:考查交换机的工作原理。
交换机实质上是一个多端口网桥,工作在数据链路层,数据链路层使用物理地址进行转发,而转发通常都是根据目的地址来决定出端口。
4. 下列关于CSMA/CD协议的叙述中,错误的是( )
A.边发送数据,边检测是否发生冲突
B.适用于无线网络,以实现无线链路共享
C.需要根据网络跨距和数据传输速率限定最小帧长
D.当信号传播延迟趋近0时,信道利用率趋近100%
答案:B
解析:注意区分CSMA/CD与CSMA/CA,D是detection,在无线网络中是无法及时检测冲突的。
5. 下列对地址转换协议(ARP)描述正确的是( )
A、ARP封装在IP数据报的数据部分 B、ARP是采用广播方式发送的
C、ARP是用于IP地址到域名的转换 D、发送ARP包需要知道对方的MAC地址
答案:B
解析:主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址。
Ⅱ、综合题
1、简述CSMA/CD协议的工作原理。
解答:
先听后发,边听边发,冲突停发,随机重发。只能使用半双工通行。最小帧长=总线传播时延*数据传输率*2。冲突时采用二进制指数退避算法。
2、 路由表的建立。(可以在路由表都为空时发送一个ip请求来记录各个路由器的路由表学习过程。)
根据下面的网络写出R的路由表:
解答:
R的路由表如下:
3、①简述TCP三次握手的流程。
(图源见水印)
解答:
1)第一次握手:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1。另外,客户机会随机选择一个起始序号seq=J(连接请求报文不携带数据,但要消耗一个序号)。
(2)第二次握手:服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为J+1,并且服务器随机产生起始序号seq=K(确认报文不携带数据,但也要消耗一个序号)。
(3)第三次握手:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK标志位被置1,确认字段为K+1,该报文段可以携带数据,若不携带数据则不消耗序号。
②为什么建立连接的时候是三次握手,关闭连接的时候却是四次握手?
答:这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
4、结合客户端或服务端socket编程,简述建立socket通信的流程。
解答:以服务器端为例:
1:加载套接字库,创建套接字(socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:关闭本已连接套接字(closesocket())。
客户端与服务端相比不需要bind(),在创建套接字后直接connect即可与服务端建立通信。