Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ β ΡΡΠΎ udp_read, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.11. ΠΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.6.
ΠΠΈΡΡΠΈΠ½Π³ 29.11. Π€ΡΠ½ΠΊΡΠΈΡ udp_read: ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈΠ· ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
//udpcksum/udpread.c
7 struct udpiphdr*
8 udp_read(void)
9 {
10 int len;
11 char *ptr;
12 struct ether_header *eptr;
13 for (;;) {
14 ptr = next_pcap(&len);
15 switch (datalink) {
16 case DLT_NULL: /* Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ»ΠΈ = 4 Π±Π°ΠΉΡΠ° */
17 return (udp_check(ptr + 4, len β 4));
18 case DLT_EN10MB:
19 eptr = (struct ether_header*)ptr;
20 if (ntohs(eptr->ether_type) != ETHERTYPE_IP)
21 err_quit("Ethernet type not IP", ntohs(eptr->ether_type));
22 return (udp_check(ptr + 14, len β 14));
23 case DLT_SLIP: /* Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ SLIP = 24 Π±Π°ΠΉΡΠ° */
24 return (udp_check(ptr + 24, len β 24));
25 case DLT_PPP: /* Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ PPP = 24 Π±Π°ΠΉΡΠ° */
26 return (udp_check(ptr + 24, len β 24));
27 default:
28 err_quit("unsupported datalink (%d)", datalink);
29 }
30 }
31 }
14-29 ΠΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ next_pcap (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 29.12) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΈΠ· ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ pcap_datalink.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠ‘Π΄Π²ΠΈΠ³ΠΈ Π½Π° 4, 14 ΠΈ 24 Π±Π°ΠΉΡΠ° ΠΎΠ±ΡΡΡΠ½ΡΡΡΡΡ Π½Π° ΡΠΈΡ. 31.9 [128]. Π‘Π΄Π²ΠΈΠ³, ΡΠ°Π²Π½ΡΠΉ 24 Π±Π°ΠΉΡΠ°ΠΌ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π΄Π»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² SLIP ΠΈ PPP, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² BSD/OS 2.1.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ DLT_EN10MB ΡΠΈΠ³ΡΡΠΈΡΡΠ΅Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Β«10ΠΠΒ», ΡΡΠΎΡ ΡΠΈΠΏ ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅ΠΉ Ethernet, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ ΡΠ°Π²Π½Π° 100 ΠΠ±ΠΈΡ/Ρ.
ΠΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ udp_check (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 29.13) ΠΈΡΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ°ΠΊΠ΅Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΏΠΎΠ»Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ IP ΠΈ UDP.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.12 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ next_pcap, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΈΠ· ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².
ΠΠΈΡΡΠΈΠ½Π³ 29.12. Π€ΡΠ½ΠΊΡΠΈΡ next_pcap: Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ
//udpcksum/pcap.c
38 char*
39 next_pcap(int *len)
40 {
41 char *ptr;
42 struct pcap_pkthdr hdr;
43 /* ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ»Π΅Π΄ΠΈΡΡ, ΠΏΠΎΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π³ΠΎΡΠΎΠ² */
44 while ((ptr = (char*)pcap_next(pd, &hdr)) == NULL);
45 *len = hdr.caplen; /* Π΄Π»ΠΈΠ½Π° Π·Π°Ρ Π²Π°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° */
46 return (ptr);
47 }
43-44 ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ pcap_next, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ pcap_pkthdr, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠΆΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ:
struct pcap_pkthdr {
struct timeval ts; /* Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠ΅ΡΠΊΠ° */
bpf_u_int32 caplen; /* Π΄Π»ΠΈΠ½Π° Π·Π°Ρ Π²Π°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° */
bpf_u_int32 len; /* ΠΏΠΎΠ»Π½Π°Ρ Π΄Π»ΠΈΠ½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°, Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎΡΡ Π² ΠΊΠ°Π½Π°Π»Π΅ */
};
ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΡΠΌΠ΅ΡΠΊΠ° ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΡΠΎΠΌΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΠΊΠ΅Ρ Π±ΡΠ» ΡΡΠΈΡΠ°Π½ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², Π² ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ caplen ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π»ΠΈΠ½Ρ Π·Π°Ρ Π²Π°ΡΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ (Π²ΡΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.2 Π½Π°ΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ shaplen Π±ΡΠ»ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 200 ΠΈ ΠΎΠ½Π° ΡΠ²Π»ΡΠ»Π°ΡΡ Π²ΡΠΎΡΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ pcap_open_live Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.5). ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΡΠΎΡΡΠΎΠΈΡ Π² Π·Π°Ρ Π²Π°ΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², Π° Π½Π΅ Π²ΡΠ΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ len β ΡΡΠΎ ΠΏΠΎΠ»Π½Π°Ρ Π΄Π»ΠΈΠ½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°, Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎΡΡ Π² ΠΊΠ°Π½Π°Π»Π΅. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ caplen Π±ΡΠ΄Π΅Ρ Π²ΡΠ΅Π³Π΄Π° ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π²Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ len.
45-46 ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Π½Π°Ρ ΡΠ°ΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ (Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ), ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ. Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ 14-Π±Π°ΠΉΡΠΎΠ²ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ethernet Π² ΡΠ»ΡΡΠ°Π΅ ΠΊΠ°Π΄ΡΠ° Ethernet ΠΈΠ»ΠΈ 4-Π±Π°ΠΉΡΠΎΠ²ΡΠΉ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠ°Π½Π°Π»ΡΠ½ΡΠΉ (pseudo-link) Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π² ΡΠ»ΡΡΠ°Π΅ Π·Π°ΠΊΠΎΠ»ΡΡΠΎΠ²ΠΊΠΈ Π½Π° ΡΠ΅Π±Ρ.
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ pcap_next, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Β«ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΄Π°Β», ΡΡ Π΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π° ΡΠΈΡ. 29.5. ΠΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ pcap_, ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΡΠΎΡΡΡ Π΅ΡΡΡ ΠΊΠ°ΠΊ Π·Π°Π²ΠΈΡΡΡΠΈΠ΅, ΡΠ°ΠΊ ΠΈ Π½Π΅ Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ BPF Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ read, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ DLPI Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ getmsg, Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Linux Π²ΡΠ·ΡΠ²Π°Π΅Ρ recvfrom.
Π ΠΈΡ. 29.5. ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
ΠΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ udp_check ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ IP ΠΈ UDP. ΠΠ½Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.13. ΠΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΎΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΡΡΠΎΠ²Π΅Π½Ρ IP Π½Π΅ Π·Π°ΠΌΠ΅ΡΠ°Π΅Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ»Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ.
44-61 ΠΠ»ΠΈΠ½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΊΠ»ΡΡΠ°ΡΡ Ρ ΠΎΡΡ Π±Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ IP ΠΈ UDP. ΠΠ΅ΡΡΠΈΡ IP ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP. ΠΡΠ»ΠΈ ΠΏΠΎΠ»Π΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP, ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ IP/UDP. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΈΠ»ΡΡΡ Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ pcap_setfilter Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.5, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 29.13. Π€ΡΠ½ΠΊΡΠΈΡ udp_check: ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΠ»Π΅ΠΉ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ IP ΠΈ UDP
//udpcksum/udpread.c
38 struct udpiphdr*
39 udp_check(char *ptr, int len)
40 {
41 int hlen;
42 struct ip *ip;
43 struct udpiphdr *ui;
44 if (len < sizeof(struct ip) + sizeof(struct udphdr))
45 err_quit("len = %d", len);
46 /* ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP */
47 ip = (struct ip*)ptr;
48 if (ip->ip_v != IPVERSION)
49 err_quit("ip_v = %d", ip->ip_v);
50 hlen = ip->ip_hl << 2;
51 if (hlen < sizeof(struct ip))
52 err_quit("ip_hl = %d", ip->ip_hl);
53 if (len < hlen + sizeof(struct udphdr))
54 err_quit("len = %d, hlen = %d", len, hlen);
55 if ((ip->ip_sum = in_cksum((u_short )ip, hlen)) != 0)
56 err_quit("ip checksum error");
57 if (ip->ip_p == IPPROTO_UDP) {
58 ui = (struct udpiphdr*)ip;
59 return (ui);
60 } else
61 err_quit("not a UDP packet");
62 }
Π€ΡΠ½ΠΊΡΠΈΡ cleanup, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.14, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ main Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 29.4).
ΠΠΈΡΡΠΈΠ½Π³ 29.14. Π€ΡΠ½ΠΊΡΠΈΡ cleanup
//udpcksum/cleanup.c
2 void
3 cleanup(int signo)
4 {
5 struct pcap_stat stat;
6 fflush(stdout);
7 putc('\n', stdout);
8 if (verbose) {
9 if (pcap_stats(pd, &stat) < 0)
10 err_quit("pcap_stats: %s\n", pcap_geterr(pd));
11 printf("%d packets received by filter\n", stat.ps_recv);
12 printf("%d packets dropped by kernel\n", stat.ps_drop);
13 }
14 exit(0);
15 }
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠΎ Π·Π°Ρ Π²Π°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²8-13 Π€ΡΠ½ΠΊΡΠΈΡ pcap_stats ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²: ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΡΠΈΠ»ΡΡΡΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ ΡΠ΄ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ
Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠΌ Π½Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ -0 ΠΈ ΡΠ±Π΅Π΄ΠΈΠΌΡΡ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠΌΠ΅Π½ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π½Π° ΠΏΡΠΈΡ ΠΎΠ΄ΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π΅ΠΌ ΡΠ»Π°Π³ -v.
macosx # udpcksum -i en1 -0 -v bridget.rudoff.com domain
device = en1
local net = 172.24.37.64. netmask = 255.255.255.224
cmd = udp and src host 206.168.112.96 and src port 53
datalink = 1
sent: 36 bytes of data
UDP checksums on
received UDP checksum = 9d15
3 packets received by filter
0 packets dropped by kernel
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡ ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌ. Π§Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅, ΡΠ΅ΠΌ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π°ΠΉΡΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠΌΠ΅Π½ Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΌ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠΎΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌ.
macosx # udpcksum -i en1 -v freebsd4.unpbook.com domain
device = en1
localnet = 172.24.37.64, netmask = 255.255.255.224
cmd = udp and src host 172.24.37.94 and src port 53
datalink = 1
sent: 36 bytes of data
UDP checksums off
received UDP checksum = 0
3 packets received by filter
0 packets dropped by kernel
Π€ΡΠ½ΠΊΡΠΈΠΈ libnet
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ open_output ΠΈ send_dns_query, Π² ΠΊΠΎΡΠΎΡΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ libnet. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° libnet Π±Π΅ΡΠ΅Ρ Π½Π° ΡΠ΅Π±Ρ Π·Π°Π±ΠΎΡΡ ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ Π΄Π΅ΡΠ°Π»Π΅ΠΉ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΡΡΡΠ°Π½ΡΠ΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌ ΠΈ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠΌ Π±Π°ΠΉΡΠΎΠ² Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅, ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ Π²ΡΡΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ open output ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.15.