在本门课中,我们首先学了与网络相关的命令,后面学习了Socket网络编程,写了一个小小的聊天室,在这里了解了网络接口API和Linux Socket API之间的关系。又学习了Socket与系统调用的相关知识。深入理解了TCP协议及其源代码。了解了收发数据流的处理过程。
这里我们选取了408中的相关真题来考察计算机网络知识水平,作为计算机联考题,408还是出的非常精辟的。
选择题:
1.【408真题】在OSI参考模型中,自下而上第一个提供端到端服务的层次是(B)
A、数据链路层 B、传输层 C、会话层 D、应用层
【解析】端到端服务是传输层
2.【百度文库】在实现基于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()
【解析】TCP服务器的一般步骤是:创建一个Socket,这里用到socket(),接下来绑定IP地址,和端口信息等,用bind()函数。开启监听,使用listen(),接收客户端的信息,用函数accept(),用send(),read()等来收发数据。接下来关闭网络连接,使用close().
3.【408真题】对地址转换协议(ARP)描述正确的是( B )
A、ARP封装在IP数据报的数据部分
B、ARP是采用广播方式发送的
C、ARP是用于IP地址到域名的转换
D、发送ARP包需要知道对方的MAC地址
【解析】
通过ARP原理:在任何时候,一台主机有IP数据报文发送给另一台主机,它都要知道接收方的逻辑(IP)地址。但是IP地址必须封装成帧才能通过物理网络。这就意味着发送方必须有接收方的物理(MAC)地址,因此需要完成逻辑地址到物理地址的映射。而ARP协议可以接收来自IP协议的逻辑地址,将其映射为相应的物理地址,然后把物理地址递交给数据链路层。我们可以了解到,ARP协议是用于IP地址与MAC地址之间的转换,故C错误;而A中封装再IP数据报的数据部分显然是IP的上层TCP或是UDP的报文,故A错误;D中发送ARP请求报文时封装到帧中填入的MAC为全1,即使用广播方式发送给局域网内的所有主机,故D错误,B正确。
4.【百度文库】下面哪一个的说法是正确的( B )
A、TCP是可靠的数据传输协议,而UDP是不可靠的,所以TCP总是优于UDP
B、点对点不需要ARP协议,以太网需要ARP协议
C、IP实体不仅要接收和发送IP数据报,还需要维护路由表
D、在任何情况下,TCP实体总是立即发送应用程序的输出数据
【解析】A中显然是错的,UDP在即时通讯、以及正确率要求不高的场合比TCP要更加经济和快捷,C中前半句是正确的,而维护路由表不归IP实体管,D中,当应用程序的数据较少时,为了提高效率,TCP实体会缓存数据到一定数量再发送。因此,就本题而言,B中点对点是直连、一般不经过路由器的路由和转发,故不需要ARP协议,本题选B。
5.【408真题】主机甲向主机乙发送一个(SYN=1,seq=11220)的 TCP 段,期望与主机乙建立TCP连接,若主机乙接受该连接请求,则主机乙向主机甲发送的正确的TCP段可能是(C) 。 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)
【解析】主机乙收到连接请求报文后,如同意连接,则向甲发送确认。在确认报文段中应把 SYN位和ACK位都置1,确认号是甲发送的TCP 段的初始序号 seq=11220加 1,即为 ack=11221,同时也要选择并消耗一个初始序号seq,seq值由主机乙的TCP进程确定,本题取seq=11221,它与确认号、甲请求报文段的序号没有任何关系。
6.【408真题】主机甲与主机乙之间已建立一个TCP连接,主机甲向主机乙发送了3个连续的TCP段,分别包含300字节、400字节和500字节的有效载荷,第3个段的序号为900。若主机乙仅正确接收到第1和第3个段,则主机乙发送给主机甲的确认序号是(B)。 A. 300 B. 500 C. 1200 D. 1400 【解析】TCP段首部中的序号字段是指本报文段所发送的数据的第一个字节的序号。第三个段的序号为900,则第二个段的序号为900-400=500。而确认号是期待收到对方下一个报文段的第一个字节的序号。现在主机乙期待收到第二个段,故甲的确认号是500。
7.【百度文库】TCP使用( B )进行流量控制。
A、三次握手机制
B、窗口控制机制
C、自动重发机制
D、端口机制
【解析】考察流量控制基础概念
8.【408真题】TCP/IP参考模型的网络层提供的是(A)。 A. 无连接不可靠的数据报服务 B. 无连接可靠的数据报服务
C. 有连接不可靠的虚电路服务 D. 有连接可靠的虚电路服务
【解析】TCP/IP的网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。此外考察IP首部,如果是面向连接的,则应有用于建立连接的字段,但是没有;如果提供可靠的服务,则至少应有序号和校验和两个字段,但是IP分组头中也没有(IP首部中只是首部校验和)。因此网络层提供的无连接不可靠的数据服务。有连接可靠的服务由传输层的TCP提供。
9.【408真题】甲与主机乙之间已建立一个TCP连接,主机甲向主机乙发送了3个连续的TCP段,分别包含300字节、400字节和500字节的有效载荷,第3个段的序号为900。若主机乙仅正确接收到第1和第3个段,则主机乙发送给主机甲的确认序号是()。 A. 300 B. 500 C. 1200 D. 1400
【解析】TCP段首部中的序号字段是指本报文段所发送的数据的第一个字节的序号。第三个段的序号为900,则第二个段的序号为900-400=500。而确认号是期待收到对方下一个报文段的第一个字节的序号。现在主机乙期待收到第二个段,故甲的确认号是500。
解析题:
1.【408真题】
【解析】
2.【原创】简述TCP连接建立和连接释放的过程。
【解析】TCP在建立连接的过程中需要有三个步骤,也就是通常我们所说的“三次握手”
·第一步:主机A向服务器B发送一个连接建立请求报文,也就是A向B说,嘿,我想给你发信息啦。这里的SYN置为1,也就是建立同步请求,seq是报文序列号,假设A此时发送的请求报文的序列号为x。
·第二步:B回复A的连接建立请求,也就是B告诉A,好,我知道了,我们建立连接吧。这个报文的SYN也置为1,回复建立同步请求,seq同样是报文序列号,表示B这个回复报文的序列号为y,ack表示的是B已经接收到了A的序列号为X的报文了,期待A下一次把x下一个报文发过来,也就是序列号为x+1的报文。
·第三步:主机A对B发来的回复报文的回答,相当于A对B说,好,我知道你同意了,我下面就开始发送数据了哈。在这时开始分给这个TCP连接分配缓存和变量。在这里ACK的值为1,seq的值为x+1,表示发送了x后面一个序列号的报文。ack的值为y+1,表示已经接收到B的序列号为y的报文,期待B发送序列号为y+1的报文。
TCP连接在发送完数据后,要释放连接,释放连接的过程有四个步骤,也就是我们常说的“四次挥手”
·第一步:A在结束数据传送后发送一个结束报文,这个报文的FIN置为1,seq为u,也就是假设这个报文的序列号为u。我们可以理解为,A在发完数据后对B说,嘿,我的数据发完啦。
·第二步:B在收到A发来的结束报文后,B要回答A,所以要返回一个确认报文。也就是B告诉A,好了,我知道你发完了。这个报文的ACK置为1,seq为v,假设这个确认报文的序列号为v,ack就是告诉A,我已经收到了你的序列号为u的报文了。但是TCP连接是一个全双工通信,也就A和B彼此在发送数据的同时也会接收数据。这里A到B的数据传输结束了,但是B到A 的数据传输可能还没结束,也就是B到A可能还有数据没发完。第二步相当于B告诉A,好,我知道你发完了,你等等我,等我再发完。
·第三步:等到B终于发完数据了,B就会发送一个数据传输结束报文给A,告诉A自己的数据都发完了。这里的FIN置为1,ACK为1,seq为w,ack依旧为u+1,表示已经接收到A的u号报文。
·第四步:A要对B的结束报文做出回复,A对B说,好了,我知道了,你发完了。这个回复报文的ACK置为1,seq为u+1,因为上一个A发出的报文序列号为u,ack为w+1,表示A已经受到了B序列号为w的报文了。
3.【原创】为什么客户端在释放连接的时候要等待2MSL后才能关闭。
【解析】如果网络发生拥塞或者其它问题,导致A发送的这个回复报文丢失了,那么B 就会一直傻等,等待这个回复报文,超过一定时间后就会启动超时重传机制,然后B就会重新发送这个结束报文,如果此时A把服务器早早就关了,那么B 将陷入死等中,于是A就会稍微等待一段时间才关闭服务器。