如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?
以下试题来源与百度文库、408真题.
一.选择题
1.在OSI参考模型中,自下而上第一个提供端到端服务的层次是 (B)
A.数据链路层 B.传输层 C.会话层 D.应用层
解析:传输层和应用层都是端到端的。自下而上次一个端到端的是传输层。
2.以太网交换机进行转发决策时使用的PDU地址是(A)
A.目的物理地址 B.目的IP地址 C.源物理地址 D.源IP地址
解析:以太网交换机工作在物理层,所以进行交换决策时使用的是物理地址。
3.主机甲和主机乙间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含300字节和500字节的有效载荷,第一个段的序列号为200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是(D)
A.500 B.700 C.800 D.1000
解析:主机乙发送给主机甲的确认序列号是期待接收到的数据的序列号。
4.tcp的三次握手发生在哪两个api调用之间(B)
A. accept和listen之间
B. accept和connect之间
C.bind和accept之间
D. bind和listen之间
解析:A选项accept和listen同属server socket端的api用于初始化server端socket,而三次握手发生在server和client之间,显然错误。C、D选项同理
5.下列关于 UDP 协议的叙述中,正确的是(B)
I.提供无连接服务
A. ARP
B. PING
C.BIND
D. DNS
7.tcp的三次握手发生在哪两个api调用之间(B)
A. accept和listen之间
B. accept和connect之间
C.bind和accept之间
D. bind和listen之间
解析:A选项accept和listen同属server socket端的api用于初始化server端socket,而三次握手发生在server和client之间,显然错误。C、D选项同理
8.在实现基于TCP的网络应用程序时,服务器端正确的处理流程是( C )
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()
答:socket基础概念
9.下列关于FTP协议的叙述中,错误的是(C)
A.数据连接在每次数据传输完毕后就关闭
B.控制连接在整个会话期间保持打开状态
C.服务器与客户端的TCP 20端口建立数据连接
D.客户端与服务器的TCP 21端口建立控制连接
解析:考察FTP协议和常用端口。当客户端向服务器发出连接请求时,客户端与服务器的21端口建立控制连接,并告诉服务器自己的另一个端口号码,用于建立数据连接,接着服务器就用自己的20端口与客户端所提供的端口号进行数据连接(注意20和21都是服务器端的端口)
10.TCP/IP参考模型的网络层提供的是(A)
A. 无连接不可靠的数据报服务 B. 无连接可靠的数据报服务
C. 有连接不可靠的虚电路服务 D. 有连接可靠的虚电路服务
解答:TCP/IP的网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。此外考察IP首部,如果是面向连接的,则应有用于建立连接的字段,但是没有;如果提供可靠的服务,则至少应有序号和校验和两个字段,但是IP分组头中也没有(IP首部中只是首部校验和)。因此网络层提供的无连接不可靠的数据服务。有连接可靠的服务由传输层的TCP提供.
二.简答题
1.TCP和UDP的区别是什么?
(1)、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
(2)、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
(3)、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
(4)、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
(5)、TCP首部开销20字节;UDP的首部开销小,只有8个字节
(6)、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
2.TCP握手以及每一次握手客户端和服务器端处于哪个状态?
1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN.
2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT.
3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV
4)、ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。
5)、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态.
6)、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT.
7)、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 .
8)、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /
9)、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。
10)、CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
11)、CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束
3.为什么使用三次握手,两次握手可不可以?
1)因为保证可靠的最小传输的次数就是三次握手,A能发,B能收发,A能收,保证可靠,
2)两次握手显然不可以,不仅不能保证可靠传输,可能导致失效的连接请求被服务端接收,A开始请求无效,后来重发请求成功和B通信,B后来又会和失效的A连接。
bind():绑定IP地址和端口号,注意绑定的时候,服务器一般是要主动绑定IP地址和端口号的,但是客户端一般是不需要的,因为客户端发送连接的时候,内核会自动分配一个端口号给它。
listen():监听是否有客户端请求
accept():阻塞进程,等待客户端的接入,接入之后产生收发的另外一个套接字,注意客户端的地址和端口号是在accept接收到的参数中找到的
send():有客户端的接入之后,发送数据
receive():有客户端接入之后,接收数据
close():关闭套接字
套接字对应的连接关系图如下:
![](https://img2018.cnblogs.com/i-beta/1882307/202001/1882307-20200110205401511-1739880189.png)