一、网络程序设计课程总结部分
首先从整体上来看用户态、内核态与客户端和服务器交互的对应关系(包括对应的协议层),
其次对课程按照顺序做出如下总结:
1.Socket
课程核心部分以实际Socket编程展开,具体部分可查看:Java的Socket编程与操作系统的SocketAPI关系探究。
Socket通信过程可描述为:
1.服务器端socket绑定端口,并一直监听该端口,等待客户端的连接
2.客户端绑定一个端口,并通过套接字连接服务器端等待服务的端口
3.连接成功后,服务器端和客户端通过建立的连接进行通信
4.一端关闭连接,另一端捕捉异常通信结束。
Socket总结:
socket从层次上来说,它位于应用层,是操作系统为应用程序员提供的 API,通过它,应用程序可以访问传输层协议。
Socket的特点:
1.socket 位于传输层协议之上,屏蔽了不同网络协议之间的差异
2.socket 是网络编程的入口,它提供了大量的系统调用,构成了网络程序的主体
3.在Linux系统中,socket 属于文件系统的一部分,网络通信可以被看作是对文件的读取,使得我们对网络的控制和对文件的控制一样方便。
关于Linux内核的Socket系统调用源码探究参考作业:Socket与系统调用深度分析。
2.TCP协议
在传输层着重对TCP协议进行探究,通过搭建调试Linux内核网络代码的环境MenuOS系统,之后对Linux背后的三次握手以及数据收发进行了着重探究,具体可参考:深入理解TCP协议及其源代码。
三次握手详细描述
首先服务器端调用socket()创建服务器端的套接字之后调用bind()绑定创建socket是所拿到的socket文件描述符,之后调用acppet()阻塞自己等待客户端的连接。
客户端同样调用socket()创建客户端的套接字,之后调用connect()去连接服务器【根据服务器端的套接字锁定服务器】,此时TCP报文段中SYN=1,seq为一随机数字x,且客户端的连接状态置为SYS_SEND。
服务器端的accept()的阻塞收到该报文段之后被打断,置连接状态为SYN_RECV,并发送TCP报文段,SYN=1,ACK=1,seq为随机数字y,ack=x+1。
客户端收到该报文段后置状态为ESTABLISED,ACK=1,seq=x+1,ack=y+1。
服务器端接收到后置自己状态为ESTABLISED。此时三次握手已经结束。
之后便可调用read与write实现客户端与服务器端的通信。
关于源码部分的探究参考链接:TCP源码探究。
环境搭建参考作业:Linux内核代码调试环境搭建。
3.IP层
网络层的主要任务:
1.进行路由处理,即选择下一跳
2.完成IP与MAC地址映射
其中关于路由转发部分
路由表的转发过程:
ARP解析
ARP是根据IP地址获取物理地址的一个TCP/IP协议。 每个在运行的时候,都会有个arp表,在这个表里面有IP地址和mac地址的对应关系。在网络底层数据交换过程中,每一个终端都会有一个固定的mac地址,这个地址是全世界唯一的,出厂的时候就固化到硬件里面了。网络访问的时候实际上是通过这个唯一的地址来确定数据包的流向的。所以,任何一次数据传输,都需要先访问arp表,从而获得对应的mac地址,才知道传输的对象在哪里。
4.二层交换网络
课程讲授了关于以太网的一些基础知识,其中重点讲述了交换机的工作原理。
交换机实质就是一个多端口的网桥,具备学习能力与转发能力,那么到底是如何实现的呢?
其工作原理如下:
工作总体流程如下:
-
从某个端口收到的二层报文,解析二层报文的源MAC和目的MAC
-
根据源MAC学习形成MAC表
-
根据目的MAC,将该报文转发到出端口,从而保证最终目的设备能收到这个报文。
5.DNS
个人理解:DNS就是IP地址不好记,把IP地址与一个好记忆的东西对应(即域名),之后访问通过好记忆的访问。
具体DNS解析过程参考:DNS解析过程。
最后对网络安全以及互联网的架构设计进行了简要的介绍。
部分知识老师课上只是启发性的传授,若想更好的理解网络协议以及网络编程整个过程,还是需要自己再多下点功夫吧!
二、网络程序设计试卷部分:
一、单选题
1.()完成域名到 IP 地址的映射
A、DNS B、ARP C、RARP D、ICMP
参考答案:A
解析:
概念题,DNS就是IP地址不好记,把IP地址与一个好记忆的东西对应(即域名),之后访问通过好记忆的访问。
来源:个人出题
2.网络管理员配置公司网关路由器时,为了减少路由记录需要把多部门的网络地址进行汇聚,166.100.32.0/22可以汇聚的网段有( )
A、166.100.35.0/24 B、166.100.36.0/24 C、166.100.37.0/24 D、166.100.38.0/24
参考答案:A
解析:
考察CIDR聚合。
需要前22位相同,选项前16位均相同,再比较后6位即可
题目:32:001000//00
A:35:001000//11,匹配
B:36:001001//00,不匹配
C:37:001001//01,不匹配
D:38 :001001//10,不匹配
来源:个人出题
3.在实现基于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()
参考答案:C
解析:见上知识点总结Socket部分。
来源:https://wenku.baidu.com/view/a5a64a9accbff121dd3683ba.html
4.在学校局域网上ping https://www.ustc.edu.cn/ 没有涉及到的网络协议是?()
A、TCP B、DNS C、ICMP D、ARP
参考答案:A
解析:首先我们需要dns协议,将网址转为IP地址,其次ping的原理是使用ICMP的回响机制,所以必然用到了网络层的ICMP协议,最后在到达对方局域网的时候需要使用RARP查找mac地址,在发送主机不知道自己IP的时候也会用到ARP协议,所以综上ping的过程中用到了 dns协议、ICMP协议、ARP协议、RARP协议。
来源:个人改编
5.网络层通过什么来查询路径?()
A、路由表 B、ARP表 C、MAC地址表 D、网桥表
参考答案:A
解析:考察路由器工作原理。路由器在网络层是一个极其重要的设备,每台路由器都由一张转发表。路由器检查到达分组首部中的一个字段的值,然后利用该值在路由器的转发表中进行查询,以决定该如何转发该分组。查询的结果是分组将被转发的路由器的链路接口。路由表可以用netstat -r 或route查看
其他的选项:
MAC表 记录着MAC地址与交换机接口的对应关系, ARP表 ip地址与mac地址的映射 。
来源:个人出题
6.下列哪种说法是正确的()
A、集线器可以对接收到的信号进行放大
B、集线器具有信息过滤功能
C、集线器具有路径检测功能
D、集线器具有交换功能
参考答案:A
解析:考察HUB的工作原理。HUB在网络中只起到 信号放大 和重发作用,其目的是扩大网络的传输范围,而不具备信号的定向传送能力。
来源:根据牛客网个人改编
7.存在以下三个CIDR地址块192.168.11.0/27、192.168.11.32/27和192.168.11.64/26聚合后的CIDR地址块应是( )
A、192.168.11.0/25
B、192.168.11.0/26
C、192.168.11.64/25
D、192.168.11.64/26
参考答案:A
解析:
考察CIDR聚合。存在3个CIDR地址块:192.168.11.0/27, 192.168.11.32/27, 192.168.11.64/26,聚合过程为:① 2个/27地址块之间进行聚合: 192.168.11.0 转化为2进制 11000000.10101000.00001011.00000000; 192.168.11.32转2进制 11000000.10101000.00001011.00100000; 共同前缀是前26位,即11000000.10101000.00001011.00,则聚合的CIDR地址块是192.168.11.0/26。 ② 将结果再与/26地址块之间进行聚合: 192.168.11.0转2进制11000000.10101000.00001011.00000000; 192.168.11.64转2进制11000000.10101000.00001011.01000000; 共同前缀是前25位,则最终的聚合CIDR地址块是192.168.11.0/25。
来源:360公司笔试题
二、简答题【无解析 来源:实验部分与PPT】
1.简述TCP的三次握手过程【结合Socket说明更好】
首先服务器端调用socket()创建服务器端的套接字之后调用bind()绑定创建socket是所拿到的socket文件描述符,之后调用acppet()阻塞自己等待客户端的连接。
客户端同样调用socket()创建客户端的套接字,之后调用connect()去连接服务器【根据服务器端的套接字锁定服务器】,此时TCP报文段中SYN=1,seq为一随机数字x。
服务器端的accept()的阻塞收到该报文段之后被打断,并发送TCP报文段,SYN=1,ACK=1,seq为随机数字y,ack=x+1。
客户端收到该报文段后置状态为ESTABLISED,ACK=1,seq=x+1,ack=y+1。
服务器端接收到后置自己状态为ESTABLISED。此时三次握手已经结束。
2.简述ARP的工作流程?
参考答案:首先主机A根据路由表找到IP地址,然后在自己的本地ARP缓存中检查主机B的匹配MAC地址。
如果主机A在ARP缓存中没有找到映射,将ARP请求帧【请求帧中的请求的MAC地址为IP地址对应的MAC地址】广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。
若主机B收到,发现匹配,则主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。这样即建立了新的IP与MAC的映射。
3.简述交换机是如何"学习"及工作的?
1.它收到一个帧的时候,先检查源MAC地址,看看自己维护的一个地址表中有没有这个地址。如果有,则2;如果没有,则将这个MAC地址、进入的端口、进入的时间放入这个表中【这样交换机就“学习”到了新的转发MAC地址】; 2.检查目的MAC地址,然后到该表中查找,如果有匹配项,则按照表项中的端口号进行转发;如果没有,则转发到除进口之外的其他所有端口。
4.简述Socket通信过程【仅从服务器端或者客户端说明也可】
服务器端:
1:加载套接字库,创建套接字(socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket())。
客户端:
1:加载套接字库,创建套接字(socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket())。