Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 215

Автор Уильям БтивСнс

9 gr2000.k2c.wide.ad.jp (2001:200:0:8002::2000:1)

  416.581 ms 422.430 ms 427.692 ms

10 2001:200:0:4819:203:47ff:fea5:3085 (2001:200:0:4819:203:47ff:fea5:3085)

  417.169 ms 434.674 ms 424.037 ms

28.7. Π”Π΅ΠΌΠΎΠ½ сообщСний ICMP

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ асинхронных ошибок ICMP Π½Π° сокСт UDP всСгда Π±Ρ‹Π»ΠΎ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π―Π΄Ρ€ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ICMP, Π½ΠΎ ΠΎΠ½ΠΈ Ρ€Π΅Π΄ΠΊΠΎ Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ прилоТСниям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎ Π½ΠΈΡ… Π·Π½Π°Ρ‚ΡŒ. ΠœΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ для получСния этих ошибок Π² API сокСтов трСбуСтся присоСдинСниС сокСта UDP ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ IP-адрСсу (см. Ρ€Π°Π·Π΄Π΅Π» 8.11). ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ограничСния Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ СдинствСнная ошибка, возвращаСмая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ recvfrom, являСтся цСлочислСнным ΠΊΠΎΠ΄ΠΎΠΌ errno, Π° Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ посылаСт Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ нСскольким адрСсам, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ recvfrom, Ρ‚ΠΎ данная функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, какая ΠΈΠ· Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Π²Ρ‹Π·Π²Π°Π»Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ прСдлагаСтся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ядрС. ΠœΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π΄Π΅ΠΌΠΎΠ½ ICMP-сообщСний icmpd, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ сокСт ICMPv4 ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ сокСт ICMPv6 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ всС ICMP-сообщСния, направляСмыС ΠΊ Π½ΠΈΠΌ ядром. Он Ρ‚Π°ΠΊΠΆΠ΅ создаСт ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ сокСт Π΄ΠΎΠΌΠ΅Π½Π° Unix, связываСт Π΅Π³ΠΎ (ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind) с ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ /tmp/icmpd ΠΈ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅Ρ‚ входящиС соСдинСния (устанавливаСмыС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect) ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² с этим сокСтом. Π‘Ρ…Π΅ΠΌΠ° соСдинСний ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° рис. 28.7.

Рис. 28.7. Π”Π΅ΠΌΠΎΠ½ icmpd: созданиС сокСтов

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ UDP (ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ для Π΄Π΅ΠΌΠΎΠ½Π°) сначала создаСт сокСт UDP, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ асинхронныС ошибки. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ (функция bind) с этим сокСтом динамичСски Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ€Ρ‚; для Ρ‡Π΅Π³ΠΎ это дСлаСтся, Π±ΡƒΠ΄Π΅Ρ‚ пояснСно Π΄Π°Π»Π΅Π΅. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΎ создаСт Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix ΠΈ присоСдиняСтся (функция connect) ΠΊ Π·Π°Ρ€Π°Π½Π΅Π΅ извСстному ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° Π΄Π΅ΠΌΠΎΠ½Π°. Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 28.8.

Рис. 28.8. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ создаСт свой сокСт UDP ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Β«ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Β» свой UDP-сокСт Π΄Π΅ΠΌΠΎΠ½Ρƒ Ρ‡Π΅Ρ€Π΅Π· соСдинСниС Π΄ΠΎΠΌΠ΅Π½Π° Unix, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ дСскрипторов, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.7. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт Π΄Π΅ΠΌΠΎΠ½Ρƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ копию сокСта, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getsockname ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, связанный с сокСтом. На рис. 28.9 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сокСта.

Рис. 28.9. ΠŸΠ΅Ρ€Π΅ΡΡ‹Π»ΠΊΠ° сокСта UDP Π΄Π΅ΠΌΠΎΠ½Ρƒ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π΄Π΅ΠΌΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, связанный с UDP-сокСтом, ΠΎΠ½ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ свою копию сокСта, ΠΈ ΠΌΡ‹ возвращаСмся ΠΊ схСмС, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½Π° рис. 28.8.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Если ΡƒΠ·Π΅Π» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… отправитСля (см. Ρ€Π°Π·Π΄Π΅Π» 15.8), ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π΅ΠΌΠΎΠ½Ρƒ. Π—Π°Ρ‚Π΅ΠΌ Π΄Π΅ΠΌΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ устройству.

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ любой ошибки ICMP, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ Π΄Π΅ΠΌΠΎΠ½ΠΎΠΌ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° UDP-Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠΎΡΠ»Π°Π½Π½ΡƒΡŽ с ΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ связан с UDP-сокСтом прилоТСния, Π΄Π΅ΠΌΠΎΠ½ посылаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ сообщСниС (ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ рассказываСм Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅) Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix. Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ select ΠΈΠ»ΠΈ poll, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ прибытия Π΄Π°Π½Π½Ρ‹Ρ… Π»ΠΈΠ±ΠΎ Π½Π° UDP-сокСт, Π»ΠΈΠ±ΠΎ Π½Π° Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сокСт Unix.

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим исходный ΠΊΠΎΠ΄ прилоТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ Π΄Π΅ΠΌΠΎΠ½, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈ сам Π΄Π΅ΠΌΠΎΠ½. Π’ листингС 28.20 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΈ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, ΠΈ ΠΊ Π΄Π΅ΠΌΠΎΠ½Ρƒ.

Листинг 28.20. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» unpicmpd.h

//icmpd/unpicmpd.h

 1 #ifndef __unpicmp_h

 2 #define __unpicmp_h


 3 #include "unp.h"


 4 #define ICMPD_PATH "/tmp/icmpd" /* извСстноС имя сСрвСра */


 5 struct icmpd_err {

 6 int icmpd_errno; /* EHOSTUNREACH, EMSGSIZE, ECONNREFUSED */

 7 char icmpd_type; /* фактичСский Ρ‚ΠΈΠΏ ICMPv[46] */

 8 char icmpd_code; /* фактичСский ΠΊΠΎΠ΄ ICMPv[46] */

 9 socklen_t icmpd_len; /* Π΄Π»ΠΈΠ½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ структуры sockaddr{} */

10 struct sockaddr_storage icmpd_dest; /* ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ структура

                                          sockaddr_storage */

11 };


12 #endif /* __unpicmp_h */

4-11 ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ся извСстноС ΠΏΠΎΠ»Π½ΠΎΠ΅ имя сСрвСра ΠΈ структура icmpd_err, пСрСдаваСмая ΠΎΡ‚ сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ сразу, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ICMP-сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.

6-8 ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ сообщСний ICMPv4 ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ числСнно (Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ) ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² сообщСний ICMPv6 (см. Ρ‚Π°Π±Π». А.5 ΠΈ А.6). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ значСния Ρ‚ΠΈΠΏΠ° (type) ΠΈ ΠΊΠΎΠ΄Π° (code), Π½ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ значСния errno (icmpd_errno), взятыС ΠΈΠ· послСднСго столбца Ρ‚Π°Π±Π». А.5 ΠΈ А.6. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти значСния вмСсто зависящих ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ICMPv4 ΠΈ ICMPv6. Π’ Ρ‚Π°Π±Π». 28.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ сообщСния ICMP ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ значСния errno.


Π’Π°Π±Π»ΠΈΡ†Π° 28.1. ЗначСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ icmpd_errno, ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ошибки ICMPv4 ΠΈ ICMPv6

icmpd_errno Ошибка ICMPv4 Ошибка ICMPv6 ECONNREFUSED Port unreachable (ΠŸΠΎΡ€Ρ‚ нСдоступСн) Port unreachable (ΠŸΠΎΡ€Ρ‚ нСдоступСн) EMSGSIZE Fragmentation needed but DF bit set (НСобходима фрагмСнтация, Π½ΠΎ установлСн Π±ΠΈΡ‚ DF) Packet too big (Блишком большой ΠΏΠ°ΠΊΠ΅Ρ‚) EHOSTUNREACH Time exceeded (ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ врСмя ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ) Time exceeded (ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ врСмя ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ) EHOSTUNREACH Source quench (ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ отправитСля) EHOSTUNREACH ВсС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сообщСния ΠΎ нСдоступности получатСля (Destination unreachable) ВсС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сообщСния ΠΎ нСдоступности получатСля (Destination unreachable)

Π”Π΅ΠΌΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² ошибок ICMP:

1. Β«Port unreachableΒ» (ΠŸΠΎΡ€Ρ‚ нСдоступСн) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сокСт Π½Π΅ связан с ΠΏΠΎΡ€Ρ‚ΠΎΠΌ получатСля Π½Π° IP-адрСсС получатСля.

2. Β«Packet too bigΒ» (Блишком большой ΠΏΠ°ΠΊΠ΅Ρ‚) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ транспортной MTU. Π’ настоящСС врСмя Π½Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ API, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ UDP-прилоТСниям ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ транспортной MTU. Если ядро ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ транспортной MTU для UDP, Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ошибки ICMP заставляСт ядро Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ транспортной MTU Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ядра, Π½ΠΎ UDP-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, пославшСС Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ, Π½Π΅ извСщаСтся. ВмСсто этого ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ истСчСния Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ядро Π½Π°ΠΉΠ΄Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ (мСньшСС) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MTU Π² своСй Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° этой ошибки ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ позволяСт Π΅ΠΌΡƒ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ смоТСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ посылаСмой Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹.

3. ΠžΡˆΠΈΠ±ΠΊΠ° Β«Time exceededΒ» (ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΎ врСмя ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ с ΠΊΠΎΠ΄ΠΎΠΌ 0 ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля TTL (Π² случаС IPv4), Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ количСство Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² (Π² случаС IPv6) достигло нуля. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°, Ρ‡Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, являСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ошибкой.

4. ΠžΡˆΠΈΠ±ΠΊΠ° Β«Source quenchΒ» (ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ отправитСля) ICMPv4 хотя ΠΈ рассматриваСтся Π² RFC 1812 [6] ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ послана ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (ΠΈΠ»ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ сконфигурированными ΡƒΠ·Π»Π°ΠΌΠΈ, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹). Π’Π°ΠΊΠΈΠ΅ ошибки ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½, ΠΈ поэтому ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ошибки нСдоступности получатСля. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² вСрсии IPv6 Π½Π΅Ρ‚ ошибки ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ отправитСля.

5. Π’сС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ошибки нСдоступности получатСля (Destination unreachble) ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½.

10 Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ icmpd_dest являСтся структурой адрСса сокСта, содСрТащСй IP-адрСс получатСля ΠΈ ΠΏΠΎΡ€Ρ‚Π° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅ΠΉ ICMP-ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π­Ρ‚ΠΎΡ‚ элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ структурой sockaddr_in для ICMPv4 Π»ΠΈΠ±ΠΎ структурой sockaddr_in6 для ICMPv6. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ посылаСт Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ нСскольким адрСсам, ΠΎΠ½ΠΎ, вСроятно, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ структурС адрСса сокСта Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ адрСс. Возвращая эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² структурС адрСса сокСта, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΅Π΅ со своими собствСнными структурами для поиска Ρ‚ΠΎΠΉ, которая Π²Ρ‹Π·Π²Π°Π»Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’ΠΈΠΏ sockaddr_storage ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² структурС ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ адрСса любого Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ систСмой.

Π­Ρ…ΠΎ-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ UDP, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π΅ΠΌΠΎΠ½ icmpd

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ наш эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ UDP (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dg_cli) для использования нашСго Π΄Π΅ΠΌΠΎΠ½Π° icmpd. Π’ листингС 28.21 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° пСрвая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Листинг 28.21. ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ прилоТСния dg_cli

//icmpd/dgcli01.c

 1 #include "unpicmpd.h"