1.正点原子lwIP学习笔记——ICMP协议
2.TCP/IP详解å·1ï¼åè®®çä½åç®å½
3.什么是报文报文电脑系统最小化
4.ping命令全链路分析(2)
正点原子lwIP学习笔记——ICMP协议
ICMP协议是一个网络层协议。一个新搭建好的源码网络,通常需要先进行一个基本的代码测试,以验证网络是报文报文否畅通;但IP协议并不提供可靠传输。如果数据包丢失了,源码IP协议并不能通知传输层是代码qt源码分享否丢失以及丢失的原因。因此,报文报文我们需要ICMP协议来完成这样的源码功能。
总结来说,代码为了更有效地转发IP数据报和提高交付成功机会。报文报文
ICMP协议类型与结构:对于ICMP协议中的源码差错报告报文,在lwIP中实现的代码是目的不可达以及超时的报文;对于超时报文,又分为两种,报文报文一种是源码生存时间TTL(在IP首部中),另一种是代码分片传输中,接收到一个分片后的超时等待时间超时;ICMP协议中的询问报文,lwIP实现的currenthashmap源码则是回送请求/应答报文。
无论是差错还是询问报文,前4个字节是一样的:第一个是类型,第二个是代码,例如超时就是0/1,0代表生存时间为0、1则是超时等待时间为0;后两个是校验和;之后的4个字节则是取决于ICMP报文的类型;整个ICMP的数据部分,长度取决于类型;整个ICMP报文是在网络层,可以说IP数据包包含了IP首部以及ICMP报文。
ICMP差错报文用于检测IP数据报在传输过程中的异常信息(目的不可达、源站抑制、重定向、超时、参数错误)。
ICMP类型为3,则代表了是目的不可达;lwIP实现了代码值2、3、jmq源码4的差错;ICMP类型为则代表了是超时错误;代码值0代表传输期间生存时间为0,1代表数据报组装期间生存时间为0。
ICMP查询报文用于诊断两个网络设备之间是否能够通信。
lwIP只处理ICMP类型0/8,代表了回显请求/应答;目的主机收到ICMP回送请求报文后立即回送应答报文,若源主机能收到ICMP回送应答报文,则说明到达该主机的网络正常(PING)。
ICMP报文数据结构:以上结构体位于icmp.h中;包括有ICMP的类型、代码、校验和、标志符以及序号五个变量。
差错报文中,前4个字节是类型、代码和校验后;后4个字节全为0;然后传输的数据就是因其差错的IP首部以及他的pbuf的前8个字节的数据;查询报文的前4个字节与差错报文一样;后4个字节中,2格式标识符,2个事序号;数据部分则是请求报文发送和应答报文重复(就是类型为8,就是orbslam源码回送请求,直接把类型改为0,变成回送应答)。
lwIP只实现目的不可达、超时差错报文,它们分别为icmp_dest_unreach和icmp_time_exceeded函数;这两种差错报文都是调用icmp_send_response发送;其源码和注释如下:
以上源码的逻辑,就是根据当前的type和code判断处理方式,判断得到是差错报文,就把被丢弃数据包的pbuf中的IP首部和前8个字节数据拷贝到差错报文中(同样也是一个pbuf)。
请求报文发送,应答报文重复。简单来讲,应答包是在请求包的基础上修改得来;查询报文的源码和注释如下:
总结来说,ICMP的回送请求,把ICMP结构体的type从8改成0,然后把pbuf的payload上移个字节,添加IP首部,球赛源码就变成了回送应答包。
这一篇的源码还是比较简单易懂的,没有太多要F跳转的内容,总的原理也比较清晰。
至此,lwIP的大部分协议都学完了,还剩下TCP和UDP协议,现在的lwIP框架如下:
TCP/IP详解å·1ï¼åè®®çä½åç®å½
è¯è åºåè¨
第1ç« æ¦è¿°1
1.1 å¼è¨1
1.2 åå±1
1.3 TCP/IPçåå±4
1.4 äºèç½çå°å5
1.5 ååç³»ç»6
1.6 å°è£ 6
1.7 åç¨8
1.8 客æ·-æå¡å¨æ¨¡å8
1.9 端å£å·9
1. æ ååè¿ç¨
1. RFC
1. æ åçç®åæå¡
1. äºèç½
1. å®ç°
1. åºç¨ç¼ç¨æ¥å£
1. æµè¯ç½ç»
1. å°ç»
第2ç« é¾è·¯å±
2.1 å¼è¨
2.2 以太ç½åIEEE å°è£
2.3 å°¾é¨å°è£
2.4 SLIPï¼ä¸²è¡çº¿è·¯IP
2.5 å缩çSLIP
2.6 PPPï¼ç¹å¯¹ç¹åè®®
2.7 ç¯åæ¥å£
2.8 æå¤§ä¼ è¾åå MTU
2.9 è·¯å¾MTU
2. 串è¡çº¿è·¯ååé计ç®
2. å°ç»
第3ç« IPï¼ç½é åè®®
3.1 å¼è¨
3.2 IPé¦é¨
3.3 IPè·¯ç±éæ©
3.4 åç½å¯»å
3.5 åç½æ©ç
3.6 ç¹æ®æ åµçIPå°å
3.7 ä¸ä¸ªåç½çä¾å
3.8 ifconfigå½ä»¤
3.9 netstatå½ä»¤
3. IPçæªæ¥
3. å°ç»
第4ç« ARPï¼å°å解æåè®®
4.1 å¼è¨
4.2 ä¸ä¸ªä¾å
4.3 ARPé«éç¼å
4.4 ARPçåç»æ ¼å¼
4.5 ARP举ä¾
4.5.1 ä¸è¬çä¾å
4.5.2 对ä¸åå¨ä¸»æºçARP请æ±
4.5.3 ARPé«éç¼åè¶ æ¶è®¾ç½®
4.6 ARP代ç
4.7 å è´¹ARP
4.8 arpå½ä»¤
4.9 å°ç»
第5ç« RARPï¼éå°å解æåè®®
5.1 å¼è¨
5.2 RARPçåç»æ ¼å¼
5.3 RARP举ä¾
5.4 RARPæå¡å¨ç设计
5.4.1 ä½ä¸ºç¨æ·è¿ç¨çRARPæå¡å¨
5.4.2 æ¯ä¸ªç½ç»æå¤ä¸ªRARPæå¡å¨
5.5 å°ç»
第6ç« ICMPï¼Internetæ§å¶æ¥æåè®®
6.1 å¼è¨
6.2 ICMPæ¥æçç±»å
6.3 ICMPå°åæ©ç 请æ±ä¸åºç
6.4 ICMPæ¶é´æ³è¯·æ±ä¸åºç
6.4.1 举ä¾
6.4.2 å¦ä¸ç§æ¹æ³
6.5 ICMP端å£ä¸å¯è¾¾å·®é
6.6 ICMPæ¥æç4.4BSDå¤ç
6.7 å°ç»
第7ç« Pingç¨åº
7.1 å¼è¨
7.2 Pingç¨åº
7.2.1 LANè¾åº
7.2.2 WANè¾åº
7.2.3 线路SLIPé¾æ¥
7.2.4 æ¨å·SLIPé¾è·¯
7.3 IPè®°å½è·¯ç±é项
7.3.1 é常çä¾å
7.3.2 å¼å¸¸çè¾åº
7.4 IPæ¶é´æ³é项
7.5 å°ç»
第8ç« Tracerouteç¨åº
8.1 å¼è¨
8.2 Traceroute ç¨åºçæä½
8.3 å±åç½è¾åº
8.4 广åç½è¾åº
8.5 IPæºç«éè·¯é项
8.5.1 宽æ¾çæºç«éè·¯çtraceroute
ç¨åºç¤ºä¾
8.5.2 ä¸¥æ ¼çæºç«éè·¯çtraceroute
ç¨åºç¤ºä¾
8.5.3 宽æ¾çæºç«éè·¯tracerouteç¨åº
çå¾è¿è·¯ç±
8.6 å°ç»
第9ç« IPéè·¯
9.1 å¼è¨
9.2 éè·¯çåç
9.2.1 ç®åè·¯ç±è¡¨
9.2.2 åå§åè·¯ç±è¡¨
9.2.3 è¾å¤æçè·¯ç±è¡¨
9.2.4 没æå°è¾¾ç®çå°çè·¯ç±
9.3 ICMP主æºä¸ç½ç»ä¸å¯è¾¾å·®é
9.4 转åæä¸è½¬å
9.5 ICMPéå®åå·®é
9.5.1 ä¸ä¸ªä¾å
9.5.2 æ´å¤çç»è
9.6 ICMPè·¯ç±å¨åç°æ¥æ
9.6.1 è·¯ç±å¨æä½
9.6.2 主æºæä½
9.6.3 å®ç°
9.7 å°ç»
ç¬¬ç« å¨æéè·¯åè®®
.1 å¼è¨
.2 å¨æéè·¯
.3 Unixéè·¯å®æ¤ç¨åº
.4 RIPï¼é路信æ¯åè®®
.4.1 æ¥ææ ¼å¼
.4.2 æ£å¸¸è¿è¡
.4.3 度é
.4.4 é®é¢
.4.5 举ä¾
.4.6 å¦ä¸ä¸ªä¾å
.5 RIPçæ¬
.6 OSPFï¼å¼æ¾æçè·¯å¾ä¼å
.7 BGPï¼è¾¹çç½å ³åè®®
.8 CIDRï¼æ ç±»ååé´éè·¯
.9 å°ç»
ç¬¬ç« UDPï¼ç¨æ·æ°æ®æ¥åè®®
.1 å¼è¨
.2 UDPé¦é¨
.3 UDPæ£éªå
.3.1 tcpdumpè¾åº
.3.2 ä¸äºç»è®¡ç»æ
.4 ä¸ä¸ªç®åçä¾å
.5 IPåç
.6 ICMPä¸å¯è¾¾å·®éï¼éè¦åçï¼
.7 ç¨Tracerouteç¡®å®è·¯å¾MTU
.8 éç¨UDPçè·¯å¾MTUåç°
.9 UDPåARPä¹é´ç交äºä½ç¨
. æ大UDPæ°æ®æ¥é¿åº¦
. ICMPæºç«æå¶å·®é
. UDPæå¡å¨ç设计
..1 客æ·IPå°åå端å£å·
..2 ç®æ IPå°å
..3 UDPè¾å ¥éå
..4 éå¶æ¬å°IPå°å
..5 éå¶è¿ç«¯IPå°å
..6 æ¯ä¸ªç«¯å£æå¤ä¸ªæ¥æ¶è
. å°ç»
ç¬¬ç« å¹¿æåå¤æ
.1 å¼è¨
.2 广æ
.2.1 åéç广æ
.2.2 æåç½ç»ç广æ
.2.3 æååç½ç广æ
.2.4 æåææåç½ç广æ
.3 广æçä¾å
.4 å¤æ
.4.1 å¤æç»å°å
.4.2 å¤æç»å°åå°ä»¥å¤ªç½å°åç转æ¢
.4.3 FDDIå令çç¯ç½ç»ä¸çå¤æ
.5 å°ç»
ç¬¬ç« IGMPï¼Internetç»ç®¡çåè®®
.1 å¼è¨
.2 IGMPæ¥æ
.3 IGMPåè®®
.3.1 å å ¥ä¸ä¸ªå¤æç»
.3.2 IGMPæ¥ååæ¥è¯¢
.3.3 å®ç°ç»è
.3.4 çåæ¶é´å段
.3.5 ææ主æºç»
.4 ä¸ä¸ªä¾å
.5 å°ç»
ç¬¬ç« DNSï¼ååç³»ç»
.1 å¼è¨
.2 DNSåºç¡
.3 DNSçæ¥ææ ¼å¼
.3.1 DNSæ¥è¯¢æ¥æä¸çé®é¢é¨å
.3.2 DNSååºæ¥æä¸çèµæºè®°å½é¨å
.4 ä¸ä¸ªç®åçä¾å
.5 æéæ¥è¯¢
.5.1 举ä¾
.5.2 主æºåæ£æ¥
.6 èµæºè®°å½
.7 é«éç¼å
.8 ç¨UDPè¿æ¯ç¨TCP
.9 å¦ä¸ä¸ªä¾å
. å°ç»
ç¬¬ç« TFTPï¼ç®åæä»¶ä¼ éåè®®
.1 å¼è¨
.2 åè®®
.3 ä¸ä¸ªä¾å
.4 å®å ¨æ§
.5 å°ç»
ç¬¬ç« BOOTP: å¼å¯¼ç¨åºåè®®
.1 å¼è¨
.2 BOOTPçåç»æ ¼å¼
.3 ä¸ä¸ªä¾å
.4 BOOTPæå¡å¨ç设计
.5 BOOTPç©¿è¶è·¯ç±å¨
.6 ç¹å®ååä¿¡æ¯
.7 å°ç»
ç¬¬ç« TCPï¼ä¼ è¾æ§å¶åè®®
.1 å¼è¨
.2 TCPçæå¡
.3 TCPçé¦é¨
.4 å°ç»
ç¬¬ç« TCPè¿æ¥ç建ç«ä¸ç»æ¢
.1 å¼è¨
.2 è¿æ¥ç建ç«ä¸ç»æ¢
.2.1 tcpdumpçè¾åº
.2.2 æ¶é´ç³»å
.2.3 建ç«è¿æ¥åè®®
.2.4 è¿æ¥ç»æ¢åè®®
.2.5 æ£å¸¸çtcpdumpè¾åº
.3 è¿æ¥å»ºç«çè¶ æ¶
.3.1 第ä¸æ¬¡è¶ æ¶æ¶é´
.3.2 æå¡ç±»åå段
.4 æ大æ¥æ段é¿åº¦
.5 TCPçåå ³é
.6 TCPçç¶æåè¿å¾
.6.1 2MSLçå¾ ç¶æ
.6.2 å¹³éæ¶é´çæ¦å¿µ
.6.3 FIN_WAIT_2ç¶æ
.7 å¤ä½æ¥æ段
.7.1 å°ä¸åå¨ç端å£çè¿æ¥è¯·æ±
.7.2 å¼å¸¸ç»æ¢ä¸ä¸ªè¿æ¥
.7.3 æ£æµåæå¼è¿æ¥
.8 åæ¶æå¼
.9 åæ¶å ³é
. TCPé项
. TCPæå¡å¨ç设计
..1 TCPæå¡å¨ç«¯å£å·
..2 éå®çæ¬å°IPå°å
..3 éå®çè¿ç«¯IPå°å
..4 å¼å ¥è¿æ¥è¯·æ±éå
. å°ç»
ç¬¬ç« TCPç交äºæ°æ®æµ
.1 å¼è¨
.2 交äºå¼è¾å ¥
.3 ç»åæ¶å»¶ç确认
.4 Nagleç®æ³
.4.1 å ³éNagleç®æ³
.4.2 ä¸ä¸ªä¾å
.5 çªå£å¤§å°éå
.6 å°ç»
ç¬¬ç« TCPçæåæ°æ®æµ
.1 å¼è¨
.2 æ£å¸¸æ°æ®æµ
.3 æ»å¨çªå£
.4 çªå£å¤§å°
.5 PUSHæ å¿
.6 æ ¢å¯å¨
.7 æåæ°æ®çååé
.7.1 带宽æ¶å»¶ä¹ç§¯
.7.2 æ¥å¡
.8 ç´§æ¥æ¹å¼
.9 å°ç»
ç¬¬ç« TCPçè¶ æ¶ä¸éä¼
.1 å¼è¨
.2 è¶ æ¶ä¸éä¼ çç®åä¾å
.3 å¾è¿æ¶é´æµé
.4 å¾è¿æ¶é´RTTçä¾å
.4.1 å¾è¿æ¶é´RTTçæµé
.4.2 RTT估计å¨ç计ç®
.4.3 æ ¢å¯å¨
.5 æ¥å¡ä¸¾ä¾
.6 æ¥å¡é¿å ç®æ³
.7 å¿«ééä¼ ä¸å¿«éæ¢å¤ç®æ³
.8 æ¥å¡ä¸¾ä¾ï¼ç»ï¼
.9 ææ¯æ¡è·¯ç±è¿è¡åº¦é
. ICMPçå·®é
. éæ°åç»
. å°ç»
ç¬¬ç« TCPçåæå®æ¶å¨
.1 å¼è¨
.2 ä¸ä¸ªä¾å
.3 ç³æ¶çªå£ç»¼åç
.4 å°ç»
ç¬¬ç« TCPçä¿æ´»å®æ¶å¨
.1 å¼è¨
.2 æè¿°
.3 ä¿æ´»ä¸¾ä¾
.3.1 å¦ä¸ç«¯å´©æº
.3.2 å¦ä¸ç«¯å´©æºå¹¶éæ°å¯å¨
.3.3 å¦ä¸ç«¯ä¸å¯è¾¾
.4 å°ç»
ç¬¬ç« TCPçæªæ¥åæ§è½
.1 å¼è¨
.2 è·¯å¾MTUåç°
.2.1 ä¸ä¸ªä¾å
.2.2 大åç»è¿æ¯å°åç»
.3 é¿è¥ç®¡é
.4 çªå£æ©å¤§é项
.5 æ¶é´æ³é项
.6 PAWSï¼é²æ¢åç»çåºå·
.7 T/TCPï¼ä¸ºäºå¡ç¨çTCPæ©å±
.8 TCPçæ§è½
.9 å°ç»
ç¬¬ç« SNMPï¼ç®åç½ç»ç®¡çåè®®
.1 å¼è¨
.2 åè®®
.3 管çä¿¡æ¯ç»æ
.4 对象æ è¯ç¬¦
.5 管çä¿¡æ¯åºä»ç»
.6 å®ä¾æ è¯
.6.1 ç®ååé
.6.2 è¡¨æ ¼
.6.3 åå ¸å¼æåº
.7 ä¸äºç®åçä¾å
.7.1 ç®ååé
.7.2 get-nextæä½
.7.3 è¡¨æ ¼ç访é®
.8 管çä¿¡æ¯åº(ç»)
.8.1 systemç»
.8.2 interfaceç»
.8.3 atç»
.8.4 ipç»
.8.5 icmpç»
.8.6 tcpç»
.9 å ¶ä»ä¸äºä¾å
.9.1 æ¥å£MTU
.9.2 è·¯ç±è¡¨
. trap
. ASN.1åBER
. SNMPv
. å°ç»
ç¬¬ç« TelnetåRloginï¼è¿ç¨ç»å½
.1 å¼è¨
.2 Rloginåè®®
.2.1 åºç¨è¿ç¨çå¯å¨
.2.2 æµéæ§å¶
.2.3 客æ·çä¸æé®
.2.4 çªå£å¤§å°çæ¹å
.2.5 æå¡å¨å°å®¢æ·çå½ä»¤
.2.6 客æ·å°æå¡å¨çå½ä»¤
.2.7 客æ·ç转ä¹ç¬¦
.3 Rloginçä¾å
.3.1 åå§ç客æ·-æå¡å¨åè®®
.3.2 客æ·ä¸æé®
.4 Telnetåè®®
.4.1 NVT ASCII
.4.2 Telnetå½ä»¤
.4.3 é项åå
.4.4 åé项åå
.4.5 ååå·¥ãä¸æ¬¡ä¸å符ãä¸æ¬¡
ä¸è¡æè¡æ¹å¼
.4.6 åæ¥ä¿¡å·
.4.7 客æ·ç转ä¹ç¬¦
.5 Telnet举ä¾
.5.1 åå符æ¹å¼
.5.2 è¡æ¹å¼
.5.3 ä¸æ¬¡ä¸è¡æ¹å¼(åè¡æ¹å¼)
.5.4 è¡æ¹å¼ï¼å®¢æ·ä¸æé®
.6 å°ç»
ç¬¬ç« FTPï¼æä»¶ä¼ éåè®®
.1 å¼è¨
.2 FTPåè®®
.2.1 æ°æ®è¡¨ç¤º
.2.2 FTPå½ä»¤
.2.3 FTPåºç
.2.4 è¿æ¥ç®¡ç
.3 FTPçä¾å
.3.1 è¿æ¥ç®¡çï¼ä¸´æ¶æ°æ®ç«¯å£
.3.2 è¿æ¥ç®¡çï¼é»è®¤æ°æ®ç«¯å£
.3.3 ææ¬æä»¶ä¼ è¾ï¼NVT ASCII
表示è¿æ¯å¾å表示
.3.4 å¼å¸¸ä¸æ¢ä¸ä¸ªæ件çä¼ è¾ï¼
Telnetåæ¥ä¿¡å·
.3.5 å¿åFTP
.3.6 æ¥èªä¸ä¸ªæªç¥IPå°åçå¿åFTP
.4 å°ç»
ç¬¬ç« SMTPï¼ç®åé®ä»¶ä¼ éåè®®
.1 å¼è¨
.2 SMTPåè®®
.2.1 ç®åä¾å
.2.2 SMTPå½ä»¤
.2.3 ä¿¡å°ãé¦é¨åæ£æ
.2.4 ä¸ç»§ä»£ç
.2.5 NVT ASCII
.2.6 éè¯é´é
.3 SMTPçä¾å
.3.1 MXè®°å½ï¼ä¸»æºéç´æ¥è¿å°
Internet
.3.2 MXè®°å½ï¼ä¸»æºåºæ é
.3.3 VRFYåEXPNå½ä»¤
.4 SMTPçæªæ¥
.4.1 ä¿¡å°çååï¼æ©å çSMTP
.4.2 é¦é¨ååï¼éASCIIå符
.4.3 æ£æååï¼éç¨Interneté®ä»¶
æ©å
.5 å°ç»
ç¬¬ç« ç½ç»æ件系ç»
.1 å¼è¨
.2 Sunè¿ç¨è¿ç¨è°ç¨
.3 XDRï¼å¤é¨æ°æ®è¡¨ç¤º
.4 端å£æ å°å¨
.5 NFSåè®®
.5.1 æ件å¥æ
.5.2 å®è£ åè®®
.5.3 NFSè¿ç¨
.5.4 UDPè¿æ¯TCP
.5.5 TCPä¸çNFS
.6 NFSå®ä¾
.6.1 ç®åçä¾åï¼è¯»ä¸ä¸ªæ件
.6.2 ç®åçä¾åï¼å建ä¸ä¸ªç®å½
.6.3 æ ç¶æ
.6.4 ä¾åï¼æå¡å¨å´©æº
.6.5 çå¹è¿ç¨
.7 第3ççNFS
.8 å°ç»
ç¬¬ç« å ¶ä»çTCP/IPåºç¨ç¨åº
.1 å¼è¨
.2 Fingeråè®®
.3 Whoisåè®®
.4 ArchieãWAISãGopherãVeronica
åWWW
.4.1 Archie
.4.2 WAIS
.4.3 Gopher
.4.4 Veronica
.4.5 ä¸ç»´ç½WWW
.5 Xçªå£ç³»ç»
.5.1 Xscopeç¨åº
.5.2 LBX: ä½å¸¦å®½X
.6 å°ç»
éå½A tcpdumpç¨åº
éå½B 计ç®æºæ¶é
éå½C sockç¨åº
éå½D é¨åä¹ é¢ç解ç
éå½E é ç½®é项
éå½F å¯ä»¥å è´¹è·å¾çæºä»£ç
åèæç®
缩ç¥è¯
什么是电脑系统最小化
应该是最小系统法,不是系统最小化。
“最小系统法”是指只保留主板、内存条、CPU、显示卡、显示器和电源等基本设备,先通电检查这些基本设备组成的最小系统,经检查确认保留的最小系统能正常工作以后,再进一步检查其它设备。
使用“最小系统法”时,在打开机箱拔去其它设备前,建议先用替换法检查显示器是否能正常工作。如果仅保留最小系统,通电后电脑还是不能正常工作,一般用替换法依次检查内存条、显示卡和CPU。确认显示器、内存条、显示卡和CPU能够工作后,故障源只剩下主板和电源,区分是主板故障还是电源故障的最简单方法是换一只好电源试试。
ping命令全链路分析(2)
本文使用 Zhihu On VSCode 创作并发布
上篇文章对开源网络协议栈实现 tapip 触发进行了分析,探讨了执行 ping 命令时,数据包是如何到达网络协议栈的。本文将继续探讨 ping 命令与网络协议栈的联系。目前广泛使用的网络协议栈是五层协议划分:应用层、传输层、网络层、链路层和物理层。ping 命令采用的 ICMP 协议位于网络层,但特别之处在于 ICMP 报文是封装在 IP 报文之内的。下文将从 ICMP 协议开始分析。
ICMP 协议
ping 命令的执行过程实际上包含了源端向目的端发送 ICMP 请求报文和目的端向源端发送 ICMP 回复报文的过程。ICMP 报文头包含了 ICMP type、code、id、seq 等字段,报文头部为 字节,payload 部分数据长度为可变长度。
ICMP 报文头部包含 8bit 类型码 type、8bit 代码 code 和 bit 校验和 checksum,其余部分内容和类型码 type 相关。ICMP 报文中定义 type 字段包含以下几种,type 字段与 code 的详细对应关系见附录 1:
其中,ping 命令使用的报文类型为响应请求和响应应答,其报文格式如图:
ICMP 响应请求
在 tapip 中,ICMP 响应请求报文构造是在 ping.c:send_packet() 函数中完成的。ICMP 报文填充构建代码如下:
根据上一篇文章的分析,tapip 采用一个 tap 设备作为虚拟网卡,ICMP 数据报文最终通过 wirte() 接口写入 tap 设备文件中,最终被 Linux 内核中的网络协议栈处理。这里还是先从 tapip 出发,研究下网络协议栈中如何处理 ICMP 响应请求报文。在 tapip 源码中,处理 ICMP 响应请求报文在函数 icmp_echo_request() 中,其函数调用栈如下:
在 Linux 系统中,数据包到达网络设备后会触发中断,网卡驱动程序将对应数据包传递到内核网络协议栈处理,处理结果通过系统调用接口返回给应用程序(ping 应用)。
tapip 作为一种用户态实现,网络设备 net device 是通过 tap 设备模拟的,tap 设备文件描述符中被写入数据包就相当于网卡设备接收到网络数据包;
网卡驱动程序的工作对应 tapip 中 netdev_interrupt() 到 veth_rx() 之间的过程:首先在中断处理函数中调用 veth_poll() 函数采用轮询的方式检查 tap 设备的文件描述符是否有写入事件;当发生写入事件时,veth_rx() 函数被调用,从文件描述符中读取数据包,并传递到网络协议栈中处理,此时,网络协议栈处理的入口 net_in() 被调用。
网络协议栈按照网络分层模型进行处理:
ICMP 响应回复
ICMP 响应回复的处理过程与接收侧处理 ICMP 响应请求的流程基本一致,不同点在于最后 icmp 报文响应的处理,其 type 为 0,对应的处理函数为 icmp_echo_reply(),具体函数调用栈如下:
总结
本文主要分析了用户态网络协议栈 tapip 处理 ping 命令对应的 ICMP 报文的过程,后续将结合 Linux 内核分析这个过程在内核中是如何处理的,另外还会分析下 ARP 协议的实现。
学海无涯,感觉 tapip 的实现逻辑清晰,读起来非常舒服,非常推荐对网络感兴趣的同学学习参考。
(最近特别水逆,希望能早日走出困境,迎来光明吧。)
附录 1: ICMP 报文类型表
markdown
| 类型 Type | 代码 Code | 描述 |
| :------: | :------: | :--------------------------: |
| 0 | 0 | 回显应答(ping 应答) |
| 3 | 0 | 网络不可达 |
| 3 | 1 | 主机不可达 |
| 3 | 2 | 协议不可达 |
| 3 | 3 | 端口不可达 |
| ... | ... | ... |
TODO: