這是我的最后一門博客了,主要總結了網絡協議棧的部分內容(內容實在太龐大,只抽取一小部分來理解)。
此外作為最后的總結,我結合老師每個課件相關內容,找了相對應的題目。
一、網絡協議棧總結
首先上圖,此圖是客戶端發到服務器消息所經過的完整路徑(圖片源自: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地址通信。