个人感觉网络工程师的能力应该与解决问题分析问题的能力匹配,所以我选取了个人认为408考题中较为优秀的几道解答题和少量选择题;
部分解答是个人理解,不够准确的地方还望海涵。
梳理一下上课的主要内容:
1. Linux 网络路径
应用层
(1) Socket
应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的。Linux Socket 是从 BSD Socket 发展而来的,它是 Linux 操作系统的重要组成部分之一,它是网络应用程序的基础。从层次上来说,它位于应用层,是操作系统为应用程序员提供的 API,通过它,应用程序可以访问传输层协议。
- socket 位于传输层协议之上,屏蔽了不同网络协议之间的差异
- socket 是网络编程的入口,它提供了大量的系统调用,构成了网络程序的主体
- 在Linux系统中,socket 属于文件系统的一部分,网络通信可以被看作是对文件的读取,使得我们对网络的控制和对文件的控制一样方便。
(2) 应用层处理流程
- 网络应用调用Socket API socket (int family, int type, int protocol) 创建一个 socket,该调用最终会调用 Linux system call socket() ,并最终调用 Linux Kernel 的 sock_create() 方法。该方法返回被创建好了的那个 socket 的 file descriptor。对于每一个 userspace 网络应用创建的 socket,在内核中都有一个对应的 struct socket和 struct sock。其中,struct sock 有三个队列(queue),分别是 rx , tx 和 err,在 sock 结构被初始化的时候,这些缓冲队列也被初始化完成;在收据收发过程中,每个 queue 中保存要发送或者接受的每个 packet 对应的 Linux 网络栈 sk_buffer 数据结构的实例 skb。
- 对于 TCP socket 来说,应用调用 connect()API ,使得客户端和服务器端通过该 socket 建立一个虚拟连接。在此过程中,TCP 协议栈通过三次握手会建立 TCP 连接。默认地,该 API 会等到 TCP 握手完成连接建立后才返回。在建立连接的过程中的一个重要步骤是,确定双方使用的 Maxium Segemet Size (MSS)。因为 UDP 是面向无连接的协议,因此它是不需要该步骤的。
- 应用调用 Linux Socket 的 send 或者 write API 来发出一个 message 给接收端
- sock_sendmsg 被调用,它使用 socket descriptor 获取 sock struct,创建 message header 和 socket control message
- _sock_sendmsg 被调用,根据 socket 的协议类型,调用相应协议的发送函数。
- 对于 TCP ,调用 tcp_sendmsg 函数。
- 对于 UDP 来说,userspace 应用可以调用 send()/sendto()/sendmsg() 三个 system call 中的任意一个来发送 UDP message,它们最终都会调用内核中的 udp_sendmsg() 函数。
传输层
传输层的最终目的是向它的用户提供高效的、可靠的和成本有效的数据传输服务,主要功能包括 (1)构造 TCP segment (2)计算 checksum (3)发送回复(ACK)包 (4)滑动窗口(sliding windown)等保证可靠性的操作。
TCP 栈简要过程:
- tcp_sendmsg 函数会首先检查已经建立的 TCP connection 的状态,然后获取该连接的 MSS,开始 segement 发送流程。
- 构造 TCP 段的 playload:它在内核空间中创建该 packet 的 sk_buffer 数据结构的实例 skb,从 userspace buffer 中拷贝 packet 的数据到 skb 的 buffer。
- 构造 TCP header。
- 计算 TCP 校验和(checksum)和 顺序号 (sequence number)。
- TCP 校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。TCP校验和覆盖 TCP 首部和 TCP 数据。
- TCP的校验和是必需的
- 发到 IP 层处理:调用 IP handler 句柄 ip_queue_xmit,将 skb 传入 IP 处理流程。
UDP 栈简要过程:
- UDP 将 message 封装成 UDP 数据报
- 调用 ip_append_data() 方法将 packet 送到 IP 层进行处理。
网络层
网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。其主要任务包括 (1)路由处理,即选择下一跳 (2)添加 IP header(3)计算 IP header checksum,用于检测 IP 报文头部在传播过程中是否出错 (4)可能的话,进行 IP 分片(5)处理完毕,获取下一跳的 MAC 地址,设置链路层报文头,然后转入链路层处理。
数据链路层
功能上,在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。
实现上,Linux 提供了一个 Network device 的抽象层,其实现在 linux/net/core/dev.c。具体的物理网络设备在设备驱动中(driver.c)需要实现其中的虚函数。Network Device 抽象层调用具体网络设备的函数。
物理层 - 物理层封装和发送
- 物理层在收到发送请求之后,通过 DMA 将该主存中的数据拷贝至内部RAM(buffer)之中。在数据拷贝中,同时加入符合以太网协议的相关header,IFG、前导符和CRC。对于以太网网络,物理层发送采用CSMA/CD,即在发送过程中侦听链路冲突。
- 一旦网卡完成报文发送,将产生中断通知CPU,然后驱动层中的中断处理程序就可以删除保存的 skb 了。
简单总结
题目
1.(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。
2.(2011年 408)主机甲向主机乙发送一个(SYN=1,seq=11220)的TCP段,期望与主机乙建立TCP连接,若主机乙接受该连接请求,则主机乙向主机甲发送的正确的TCP段可能是()。
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)
解答:C。主机乙收到连接请求报文后,如同意连接,则向甲发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是甲发送的TCP段的初始序号seq=11220加1,即为ack= 11221,同时也要选择并消耗一个初始序号seq,seq值由主机乙的TCP进程确定,本题取seq= 11221与确认号、甲请求报文段的序号没有任何关系。
3.(2011年 408)主机甲与主机乙之间已建立一个TCP连接,主机甲向主机乙发送了3个连续的TCP段,分别包含300字节、400字节和500字节的有效载荷,第3个段的序号为900。若主机乙仅正确接收到第1和第3个段,则主机乙发送给主机甲的确认序号是()。
A. 300 B. 500 C. 1200 D. 1400
解答:B。TCP段首部中的序号字段是指本报文段所发送的数据的第一个字节的序号。第三个段的序号为900,则第二个段的序号为900-400=500。而确认号是期待收到对方下一个报文段的第一个字节的序号。现在主机乙期待收到第二个段,故甲的确认号是500。
4、(2009考研试题)某网络拓扑如图 A-3 所示,路由器 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。
R1 和 R2 的路由表结构为:
(1)将 IP 地址空间 202.118.1.0/24 划分为 2 个子网,分别分配给局域网 1、局域网 2, 每个局域网需分配的 IP 地址数不少于 120 个。请给出子网划分结果,说明理由或给出必要 的计算过程。
(2)请给出 R1 的路由表,使其明确包括到局域网 1 的路由、局域网 2 的路由、域名服 务器的主机路由和互联网的路由。
(3)请采用路由聚合技术,给出 R2 到局域网 1 和局域网 2 的路由。
解析:
(1)CIDR 中的子网号可以全 0 或全 1,但主机号不能全 0 或全 1。
因此若将 IP 地址空间 202.118.1.0/24 划分为 2 个子网,且每个局域网需分配的 IP 地址
个数不少于 120 个,子网号至少要占用一位。
由 26-2<120<27-2 可知,主机号至少要占用 7 位。
由于源 IP 地址空间的网络前缀为 24 位,因此主机号位数+子网号位数=8。
综上可得主机号位数为 7,子网号位数为 1。
因此子网的划分结果为子网 1:202.118.1.0/25,子网 2:202.118.1.128/25。
地址分配方案:子网 1 分配给局域网 1,子网 2 分配给局域网 2;或子网 1 分配给局域网 2,子网 2 分配给局域网 1。
(2)由于局域网 1 和局域网 2 分别与路由器 R1 的 E1、E2 接口直接相连,因此在 R1 的路由表中,目的网络为局域网 1 的转发路径是直接通过接口 E1 转发的,目的网络为局域 网 2 的转发路径是直接通过接口 E1 转发的。
由于局域网 1、2 的网络前缀均为 25 位,因此 它们的子网掩码均为 255.255.255.128。 根据题意,R1 专门为域名服务器设定了一个特定的路由表项,因此该路由表项中的子 网掩码应为 255.255.255.255。对应的下一跳转发地址是 202.118.2.2,转发接口是 L0。
根据题意,到互联网的路由实质上相当于一个默认路由,默认路由一般写作 0/0,即目 的地址为 0.0.0.0,子网掩码为 0.0.0.0。对应的下一跳转发地址是 202.118.2.2,转发接口是 L0。 综上可得到路由器 R1 的路由表如下: 若子网 1 分配给局域网 1,子网 2 分配给局域网 2,见表 A-6
若子网 1 分配给局域网 2,子网 2 分配给局域网 1,见表 A-7。
(3)局域网 1 和局域网 2 的地址可以聚合为 202.118.1.0/24,而对于路由器 R2 来说,通 往局域网 1 和局域网 2 的转发路径都是从 L0 接口转发,因此采用路由聚合技术后,路由器 R2 到局域网 1 和局域网 2 的路由,见表 A-8。
5、(2011考研试题)某主机的 MAC 地址为 00-15-C5-C1-5E-28,IP 地址为 10.2.128.100(私有地址)。题 47-a 图是网络拓扑,题 47-b 图是该主机进行 Web 请求的 1 个以太网数据帧前 80B 的 十六进制及 ASCII 码内容。
请参考图中的数据回答以下问题。
(1)Web 服务器的 IP 地址是什么?该主机的默认网关的 MAC 地址是什么?
(2)该主机在构造题 47-b 图的数据帧时,使用什么协议确定目的 MAC 地址?封装该协议请求报文的以太网帧的目的 MAC 地址是什么?
注:以太网数据帧结构和 IP 分组头结构分别如题 47-c 图、题 47-d 图所示。
解析:
(1)以太网帧的数据部分是 IP 数据报,只要数出相应字段所在的字节即可。由图可知以太网帧头部有 6+6+2=14 字节, IP 数据报首部的目的 IP 地址字段前有 4×4=16 字节,从帧第 1 字节开始数 14+16=30 字节,得目的 IP 地址 40.aa.62.20(十六进制),转换成十进制为 64.170.98.32。又,以太网帧的前 6 字节 00-21-27-21 -51-ee 是目的 MAC 地址,即为主机的默认网关 10.2.128.1 端口的 MAC 地址。
(2)ARP 协议用于解决 IP 地址到 MAC 地址的映射问题。主机的 ARP 进程在本以太网 以广播的形式发送 ARP 请求分组,在以太网上广播时,以太网帧的目的地址为全 1,即 FF-FF-FF-FF-FF-FF。
6、(2017考研试题)甲乙双方均采用后退N帧协议(GBN)进行持续的双向数据传输,且双方始终采用捎带确认,帧长均为1000 B。Sx,y和Rx,y分别表示甲方和乙方发送的数据帧,其中:x是发送序号;y是确认序号(表示希望接收对方的下一帧序号);数据帧的发送序号和确认序号字段均为3比特。信道传输速率为100 Mbps,RTT=0.96 ms。下图给出了甲方发送数据帧和接收数据帧的两种场景,其中t0为初始时刻,此时甲方的发送和确认序号均为0,t1时刻甲方有足够多的数据待发送。请回答下列问题。
(1)对于图(a),t0时刻到t1时刻期间,甲方可以断定乙方已正确接收的数据帧数是多少?正确 接收的是哪几个帧(请用Sx,y形式给出)?
(2)对于图(a),从t1时刻起,甲方在不出现超时且未收到乙方新的数据帧之前,最多还可以发送多少个数据帧?其中第一个帧和最后一个帧分别是哪个(请用Sx,y形式给出)?
(3)对于图(b),从t1时刻起,甲方在不出现新的超时且未收到乙方新的数据帧之前,需要重发多少个数据帧?重发的第一个帧是哪个(请用Sx,y形式给出)?
答案解析:
(1)、t0时刻到t1时刻期间,甲方可以断定乙方已正确接收了3个数据帧,分别是S0,0、 S1,0、S2,0。
(2)、从t1时刻起,甲方最多还可以发送5个数据帧,其中第一个帧是S5,2,最后一个数据帧是S1,2。
(3)、甲方需要重发3个数据帧,重发的第一个帧是S2,3。