这是我的最后一门博客了,主要总结了网络协议栈的部分内容(内容实在太庞大,只抽取一小部分来理解)。
此外作为最后的总结,我结合老师每个课件相关内容,找了相对应的题目。
一、网络协议栈总结
首先上图,此图是客户端发到服务器消息所经过的完整路径(图片源自:https://www.cnblogs.com/sammyliu/p/5225623.html)
1. linux内核ipv4网络部分分层结构:
BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件主要有:/net/socket.c /net/protocols.c etc
INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock结构。文件主要
有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc
TCP/UDP层:处理传输层的操作,传输层用struct inet_protocol和struct proto两个结构表示。文件主要有:
/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.cetc
IP层:处理网络层的操作,网络层用struct packet_type结构表示。文件主要有:/net/ipv4/ip_forward.c ip_fragment.c ip_input.c ip_output.c etc.
数据链路层和驱动程序:每个网络设备以struct net_device表示,通用的处理在dev.c中,驱动程序都在/driver/net目录下。
下图为TCP/IP协议初始化过程,本文主要分析了初始化函数的相关代码
图源自:https://blog.csdn.net/wswifth/article/details/5794900
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 处理流程
do_initcalls() 中做了其它的初始化,其中包括 协议初始化,路由初始化,网络接口设备初始化
(例如inet_init函数以_init开头表示是系统初始化时做,函数结束后跟module_init(inet_init),这是一个宏,在include/linux/init.c中定义,展开为_initcall(inet_init),表示这个函数在do_initcalls被调用了)
此处主要列举inet协议的初始化过程。
static int __init inet_init(void) { struct sk_buff *dummy_skb; struct inet_protocol *p; struct inet_protosw *q; struct list_head *r; printk(KERN_INFO "NET4: Linux TCP/IP 1.0 for NET4.0/n"); if (sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)) { printk(KERN_CRIT "inet_proto_init: panic/n"); return -EINVAL; } /* * Tell SOCKET that we are alive... 注册socket,告诉socket inet类型的地址族已经准备好了 */ (void) sock_register(&inet_family_ops); /* * Add all the protocols. 包括arp,ip、ICMP、UPD、tcp_v4、tcp、igmp的初始化,主要初始化各种协议对应的inode和socket变量。 其中arp_init完成系统中路由部分neighbour表的初始化 ip_init完成ip协议的初始化。在这两个函数中,都通过定义一个packet_type结构的变量将这种数据包对应的协议发送数据、允许发送设备都做初始化。 */ printk(KERN_INFO "IP Protocols: "); for (p = inet_protocol_base; p != NULL;) { struct inet_protocol *tmp = (struct inet_protocol *) p->next; inet_add_protocol(p); printk("%s%s",p->name,tmp?", ":"/n"); p = tmp; } /* Register the socket-side information for inet_create. */ for(r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r) INIT_LIST_HEAD(r); for(q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q) inet_register_protosw(q); /* * Set the ARP module up */ arp_init(); /* * Set the IP module up */ ip_init(); tcp_v4_init(&inet_family_ops); /* Setup TCP slab cache for open requests. */ tcp_init(); /* * Set the ICMP layer up */ icmp_init(&inet_family_ops); /* I wish inet_add_protocol had no constructor hook... I had to move IPIP from net/ipv4/protocol.c :-( --ANK */ #ifdef CONFIG_NET_IPIP ipip_init(); #endif #ifdef CONFIG_NET_IPGRE ipgre_init(); #endif /* * Initialise the multicast router */ #if defined(CONFIG_IP_MROUTE) ip_mr_init(); #endif /* * Create all the /proc entries. */ #ifdef CONFIG_PROC_FS proc_net_create ("raw", 0, raw_get_info); proc_net_create ("netstat", 0, netstat_get_info); proc_net_create ("snmp", 0, snmp_get_info); proc_net_create ("sockstat", 0, afinet_get_info); proc_net_create ("tcp", 0, tcp_get_info); proc_net_create ("udp", 0, udp_get_info); #endif /* CONFIG_PROC_FS */ ipfrag_init(); return 0; } module_init(inet_init);
二、计算机网络知识技能水平的测评试题
本试题完全和老师上课内容相关,作为跨专业调剂过来的,说实话大佬们的题目可以说绝大多数都不会做。各种网络方面的大题,没考408真头疼。
我觉得这门课完全没有必要出太难的卷子,难得可以在专业课中考察,所以我觉得这门课考试内容可以广泛些(不脱离上课内容),但是没有必要考的过于深入。
故我选的题目大多数是一些和本课程内容相关的基础概念题。
选择题:
1.【百度文库】在创建Linux分区时,一定要创建( )两个分区
A. FAT/NTFS B. FAT/SWAP C. NTFS/SWAP D.SWAP/根分区
答:D,linux基础概念;我们搭建linux系统时肯定要考虑的东西,做过实验肯定知道
2.【原创】要将实验下载的linux-5.0.1.tar.xz文件解压,需要经过哪些步骤()
A. xz -d linux-5.0.1.tar.xz、tar -xvf linux-5.0.1.tar B. rm linux-5.0.1.tar.xz、linux-5.0.1
C. zip linux-5.0.1.tar.xz D. cat linux-5.0.1.tar.xz、linux-5.0.1
答:A,linux基础概念;送分题,做过实验肯定知道
3.【原创】实验中我们使用什么工具来跟踪内核代码()
A. vim B. visual studio code C. gdb server D.gedit
答:C,实验相关;送分题,做过实验肯定知道
4.【原创】我们构建好MenuOS后,采用()来加载内核
A. ftrace B. QEMU虚拟机 C. gdb server D.DebugFS
答:B,实验相关;送分题,做过实验肯定知道
5.【原创】我们编译好内核后,最后生成的内核文件是(即我们加载的是)()
A. vmlinuz B.zImage C. vmlinux D.bzImage
答:D,实验相关;送分题,做过实验肯定知道
解析:
vmlinux 是ELF文件。即编译出来的最原始的文件,用于kernel-debug,产生system.map符号表
不能用于直接加载,不可以作为启动内核,只是启动过程中的中间媒体。
vmlinuz应该是由ELF文件vmlinux经过OBJCOPY后。并经过压缩后的文件
zImage是vmlinuz经过gzip压缩后的文件,适用于小内核
bzImage是vmlinuz经过gzip压缩后的文件,适用于大内核
6,【百度文库】在实现基于TCP的网络应用程序时,服务器端正确的处理流程是( )
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基础概念。和实验二自己写一个聊天程序相关。
7.以下哪个是MAC地址( B) --链路层【百度文库】
A OD-01-02-AA B 00-01-22-OA-AD-01 C AO.O1.00 D 139.216.000.012.002
答:B,socket基础概念。考察MAC地址,处于网络中的每台设备都有一个唯一的硬件地址,也就是MAC地址,由网络设备制造商生产时写在硬件内部,有六个字节,前三个字节是生产厂家的标识,后三个是设备的ID
8.【2012年408真题】ARP协议的功能是( )
A、根据域名查询IP地址
B、根据MAC地址查询IP地址
C、根据IP地址查询MAC地址
D、根据IP地址查询域名
答:C,考察ARP的基本概念。
二、简答题&名词解释
1.DNS (答案来自老师ppt)【原创】
答:DNS 全称是:Domain Name System 域名系统
DNS是因特网的一项核心服务,它作为可以将域名和IP地址 相互映射的一个分布式数据库,能够使人更方便的访问互 联网,而不用去记住能够被机器直接读取的IP数串。
eg: www.ustc.edu.cn -> 218.22.21.21
2.简述域名查询的解析过程,以www.ustc.edu.cn为例 (答案借鉴自博客:https://www.cnblogs.com/myguaiguai/p/12175143.html)
答:1.先查本地缓存
2.查本地DNS的域名缓存,若没有则访问根域名服务器
3.查根域名服务器得到.cn的地址
4.查一级域名服务器得到edu.cn
5.查二级域名服务器得到ustc.edu.cn
3.请解释TCP和UDP通信的区别,最好有实际例子支撑。【答案借鉴自https://blog.csdn.net/zhang6223284/article/details/81414149】
答:
TCP 是面向连接的,UDP 是面向无连接的
TCP 是面向字节流的,UDP 是基于数据报的
TCP 保证数据正确性,UDP 可能丢包
TCP 保证数据顺序,UDP 不保证
UDP应用如:qq微信聊天、语音;实时游戏等
TCP应用如:SSH:安全登录、文件传送。qq中的在线发送文件即是TCP,离线发送即是UDP。
4.简述TCP/IP各层的作用【答案借鉴自https://blog.csdn.net/qq_22238021/article/details/80279001】
答:
应用层(application layer):是体系结构中的最高。直接为用户的应用进程(例如电子邮件、文件传输和终端仿真)提供服务。
在因特网中的应用层协议很多,如支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,支持文件传送的FTP协议,DNS,POP3,SNMP,Telnet等等。
运输层(transport layer):负责向两个主机中进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能。
网络层(network layer)主要包括以下两个任务:(1) 负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报。(2) 选中合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。协议:IP,ICMP,IGMP,ARP,RARP
数据链路层(data link layer):常简称为链路层,我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间传送数据是直接传送的(点对点),这时就需要使用专门的链路层的协议。
物理层(physical layer):在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。
三、综合分析题
(20分)某网络拓扑如下图所示,其中R为路由器,主机H1~H4的IP地址配置以及R的各接口IP地址配置如图中所示。现有若干台以太网交换机(无VLAN功能)和路由器两类网络互连设备可供选择。(2019年408真题第47题)
请回答下列问题:
(1) 设备1、设备2和设备3分别应选择什么类型网络设备?
(2) 设备1、设备2和设备3中,哪几个设备的接口需要配置IP地址?并为对应的接口配置正确的IP地址。
(3) 为确保主机H1~H4能够访问Internet,R需要提供什么服务?
(4) 若主机H3发送一个目的地址为192.168.1.127的IP数据报,网络中哪几个主机会接收该数据报?
答案:
(1)设备1:路由器,设备2:以太网交换机,设备3:以太网交换机
答案解析:以太网交换机工作在局域网,只分配一个网络号,用于连接多台局域网主机;路由器用来将多个网络互连,每个接口的网络号不同。
(2)设备1的接口需要配置IP地址;设备1的IFl、IF2和IF3接口的IP地址分别是:192.168.1.254、192.168.1.1和192.168.1.65。
答案解析:路由器需要配置IP地址,交换机只用来交换数据,无需具有IP地址,设备1的IF1接口与路由器R的192.168.1.253/30相连,由于主机号全0或全1都为特殊地址,只剩下192.168.1.254可选,因而IF1分配IP地址为192.168.1.254,IF2和IF3比较简单,由与其相连的主机的默认网关决定。
(3)R需要提供NAT服务
答案解析:NAT为网络地址转换技术,提供专用地址和全球地址之间的相互映射,主机H1~H4的网络地址为内部地址,要想访问外部网络,需要使用NAT将内部地址转换为全球地址。
(4)主机H4会接收该数据报。
答案解析:主机H1、H2的IP地址都不是192.168.1.127,H3发出的数据报会在局域网中传播,因而H4会收到该数据报。
本大题节选自2019年考研408网络真题,主要考察网路通信设备、IP地址通信。
来源:https://www.cnblogs.com/xiaofengustc/p/12178332.html