10 char *buf, *ptr;
11 buf = Malloc(sizeof(struct udpiphdr) + 100);
12 ptr = buf + sizeof(struct udpiphdr); /* ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² IP ΠΈ UDP */
13 *((uint16_t*)ptr) = htons(1234); /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ */
14 ptr += 2;
15 *((uint16_t*)ptr) = htons(0x0100); /* ΡΠ»Π°Π³ΠΈ */
16 ptr += 2;
17 *((uint16_t*)ptr) = htons(1); /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ² */
18 ptr += 2;
19 *((uint16_t*)ptr) = 0; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΠΎΡΠ²Π΅ΡΠ΅ */
20 ptr += 2;
21 *((uint16_t*)ptr) = 0; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ */
22 ptr += 2;
23 *((uint16_t*)ptr) = 0; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ */
24 ptr += 2;
25 memcpy(ptr, "\001a\014root-servers\003net\000", 20);
26 ptr += 20;
27 *((uint16_t*)ptr) = htons(1); /* ΡΠΈΠΏ Π·Π°ΠΏΡΠΎΡΠ° = Π */
28 ptr += 2;
29 *((uint16_t*)ptr) = htons(1); /* ΠΊΠ»Π°ΡΡ Π·Π°ΠΏΡΠΎΡΠ° = 1 (IP-Π°Π΄ΡΠ΅Ρ) */
30 ptr += 2;
31 nbytes = (ptr - buf) - sizeof(struct udpiphdr);
32 udp_write(buf, mbytes),
33 if (verbose)
35 printf("sent: %d bytes of data\n", nbytes);
36 }
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π±ΡΡΠ΅Ρ11-12 Π Π±ΡΡΠ΅ΡΠ΅ buf ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ 20-Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP, 8-Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP ΠΈ Π΅ΡΠ΅ 100 Π±Π°ΠΉΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ . Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ptr ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π±Π°ΠΉΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ .
Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ° DNS13-24 ΠΠ»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠΎΡΠΌΠ°ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ DNS. ΠΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 14.3 [111]. ΠΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1234, ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ΠΈ, Π·Π°Π΄Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ² β 1, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠ΅ΡΡΡΡΠΎΠ² (RR, resource records), ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΡΡ Π² ΠΎΡΠ²Π΅Ρ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ RR, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠΈΡ, ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ RR.
25-30 ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠΉ Π·Π°ΠΏΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°: Π·Π°ΠΏΡΠΎΡ ΡΠΈΠΏΠ° Π IP-Π°Π΄ΡΠ΅ΡΠ° ΡΠ·Π»Π° a.root-servers.net. ΠΡΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈΠΌΡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 20 Π±Π°ΠΉΡ ΠΈ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· 4 ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠ²: ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡΠΎΠ²Π°Ρ ΡΠ°ΡΡΡ a, 12-Π±Π°ΠΉΡΠΎΠ²Π°Ρ ΡΠ°ΡΡΡ root-servers, 3-Π±Π°ΠΉΡΠΎΠ²Π°Ρ ΡΠ°ΡΡΡ net ΠΈ ΠΊΠΎΡΠ½Π΅Π²Π°Ρ ΡΠ°ΡΡΡ, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 0 Π±Π°ΠΉΡ. Π’ΠΈΠΏ Π·Π°ΠΏΡΠΎΡΠ° 1 (ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ Π·Π°ΠΏΡΠΎΡ ΡΠΈΠΏΠ° Π), ΠΈ ΠΊΠ»Π°ΡΡ Π·Π°ΠΏΡΠΎΡΠ° ΡΠ°ΠΊΠΆΠ΅ 1.
ΠΠ°ΠΏΠΈΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP31-32 ΠΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· 36 Π±Π°ΠΉΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ (Π²ΠΎΡΠ΅ΠΌΡ 2-Π±Π°ΠΉΡΠΎΠ²ΡΡ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ 20-Π±Π°ΠΉΡΠΎΠ²ΠΎΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈΠΌΡ). ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π½Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ udp_write Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² UDP ΠΈ IP ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π·Π°ΠΏΠΈΡΠΈ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP Π² Π½Π°Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.9 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ open_output, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ°Ρ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΌΠΈ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ.
ΠΠΈΡΡΠΈΠ½Π³ 29.9. Π€ΡΠ½ΠΊΡΠΈΡ open_output: ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°
2 int rawfd; /* ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ */
3 void
4 open_output(void)
5 {
6 int on=1;
7 /*
8 * ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ IP-Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ Π½ΡΠΆΠ΅Π½ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ
9 * ΠΠ»Ρ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΡΠΆΠ½Ρ ΠΏΡΠ°Π²Π° ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
10 * ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΎΠΊΠ΅ΡΠ° IP_HDRINCL.
11 */
12 rawfd = Socket(dest->sa_family, SOCK_RAW, 0);
13 Setsockopt(rawfd, IPPROTO_IP, IP_HDRINCL, &on., sizeof(on));
14 }
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°2 ΠΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° IP_HDRINCL7-13 ΠΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ ΠΈ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΎΠΊΠ΅ΡΠ° IP_HDRINCL. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ IP-Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ, Π²ΠΊΠ»ΡΡΠ°Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ IP.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.10 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ udp_write, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ IP ΠΈ UDP, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ.
ΠΠΈΡΡΠΈΠ½Π³ 29.10. Π€ΡΠ½ΠΊΡΠΈΡ udp_write: ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² UDP ΠΈ IP ΠΈ Π·Π°ΠΏΠΈΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ IP Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ
//udpcksum/udpwrite.c
19 void
20 udp_write(char *buf, int userlen)
21 {
22 struct udpiphdr *ui;
23 struct ip *ip;
24 /* Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ */
25 ip = (struct ip*)buf;
26 ui = (struct udpiphdr*)buf;
27 bzero(ui, sizeof(*ui));
28 /* Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ 8 ΠΊ Π΄Π»ΠΈΠ½Π΅ ΠΏΡΠ΅Π²Π΄ΠΎΠ·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */
29 ui->ui_len = htons((uint16_t)(sizeof(struct udphdr) + userlen));
30 /* Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ 28 ΠΊ Π΄Π»ΠΈΠ½Π΅ IP-Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ */
31 userlen += sizeof(struct udpiphdr);
32 ui->ui_pr = IPPROTO_UDP;
33 ui->ui_src.s_addr = ((struct sockaddr_in*)local)->sin_addr.s_addr;
34 ui->ui_dst.s_addr = ((struct sockaddr_in*)dest)->sin_addr.s_addr;
35 ui->ui_sport = ((struct sockaddr_in*)local)->sin_port;
36 ui->ui_dport = ((struct sockaddr_in*)dest)->sin_port;
37 ui->ui_ulen = ui->ui_len;
38 if (zerosum == 0) {
39 #if 1 /* Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° if 0 Π΄Π»Ρ Solaris 2.x. x < 6 */
40 if ((ui->ui_sum = m_cksum((u_int16_t*)in, userlen)) == 0)
41 ui->ui_sum = 0xffff;
42 #else
43 ui->ui_sum = ui->ui_len;
44 #endif
45 }
46 /* Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡΡΠ°Π²ΡΠ΅ΠΉΡΡ ΡΠ°ΡΡΠΈ IP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */
47 /* ΡΡΠ½ΠΊΡΠΈΡ p_output() Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ IP */
48 ip->ip_v = IPVERSION;
49 ip->ip_hl = sizeof(struct ip) >> 2;
50 ip->ip_tos = 0;
51 #if defined(linux) || defined(__OpenBSD__)
52 ip->ip_len = htons(userlen); /* ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡΠΎΠ² */
53 #else
54 ip->ip_len = userlen; /* ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡΠΎΠ² ΡΠ·Π»Π° */
55 #endif
56 ip->ip_id = 0; /* ΡΡΠΎ ΠΏΡΡΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΡΠΎΠ²Π΅Π½Ρ IP */
57 ip->ip_off = 0; /* ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π°Π³ΠΎΠ², ΡΠ»Π°Π³ΠΈ MF ΠΈ DF */
58 ip->ip_ttl = TTL_OUT;
59 Sendto(rawfd, buf, userlen, 0, dest, destlen);
60 }
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²24-26 Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ip ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π½Π°ΡΠ°Π»ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP (ΡΡΡΡΠΊΡΡΡΡ ip), Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ui ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΎ ΠΆΠ΅ ΠΌΠ΅ΡΡΠΎ, Π½ΠΎ ΡΡΡΡΠΊΡΡΡΠ° udpiphdr ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² IP ΠΈ UDP.
ΠΠ±Π½ΡΠ»Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°27 ΠΡ ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π½ΡΠ»ΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΡΠ΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΌΡΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠ³ ΠΎΡΡΠ°ΡΡΡΡ Π² Π±ΡΡΠ΅ΡΠ΅, ΠΏΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ.
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π΄Π»ΠΈΠ½Ρ28-31 ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ui_len β ΡΡΠΎ Π΄Π»ΠΈΠ½Π° Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΏΠ»ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP (8 Π±Π°ΠΉΡ). ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ userlen (ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡ Π·Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ UDP) ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° 28 (20 Π±Π°ΠΉΡ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ IP ΠΈ 8 Π±Π°ΠΉΡ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ UDP), Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ ΡΠ°Π·ΠΌΠ΅ΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ IP.
ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ UDP32-45 ΠΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ UDP ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ Π΄Π°Π½Π½ΡΠ΅ UDP, Π½ΠΎ ΠΈ ΠΏΠΎΠ»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP. ΠΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP ΠΎΠ±ΡΠ°Π·ΡΡΡ ΡΠΎ, ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΠ·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ (pseudoheader). ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠ·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ Π²Π΅ΡΠ½ΠΎ, ΡΠΎ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ»Π° Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠ·Π΅Π» ΠΈ Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. Π ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊΠ°Ρ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π² IP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅, ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΡ ΠΏΡΠ΅Π²Π΄ΠΎΠ·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ. ΠΠ°Π½Π½ΡΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΡΠ°Π½, Π½ΠΎ Π΅Π³ΠΎ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 23.6 [128]. ΠΠΎΠ½Π΅ΡΠ½ΡΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΏΠΈΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ UDP Π² ΠΏΠΎΠ»Π΅ ui_sum, Π΅ΡΠ»ΠΈ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠ»Π°Π³ zerosum (ΡΡΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ -0).
ΠΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ 0, Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0xffff. Π ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΡΠΈ ΡΠΈΡΠ»Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, Π½ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» UDP ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ Π² Π½ΡΠ»Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠΈΡΡ, ΡΡΠΎ ΠΎΠ½Π° Π²ΠΎΠ²ΡΠ΅ Π½Π΅ Π±ΡΠ»Π° Π²ΡΡΠΈΡΠ»Π΅Π½Π°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 28.10 ΠΌΡ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΠ°Π²Π½ΠΎ Π»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ Π½ΡΠ»Ρ: Π΄Π΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ICMPv4 Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π΅Π΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠ‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π² Solaris 2.x, Π³Π΄Π΅ x<6, Π² ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP ΠΈΠ»ΠΈ ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ TCP ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ IP_HDRINCL, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΠ΄ΡΠΎ, Π° ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ»Π΅ ui_sum ΡΠ°Π²Π½ΡΠΌ Π΄Π»ΠΈΠ½Π΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP.
ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP36-49 ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΎΠΊΠ΅ΡΠ° IP_HDRINCL, Π½Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ ΠΏΠΎΠ»Π΅ΠΉ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ IP. (Π ΡΠ°Π·Π΄Π΅Π»Π΅ 28.3 ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΡΡΡ Π·Π°ΠΏΠΈΡΡ Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ ΠΏΡΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ IP_HDRINCL.) ΠΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½ΡΠ»Ρ (ip_id), ΡΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ IP Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π·Π°Π΄Π°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ. IP ΡΠ°ΠΊΠΆΠ΅ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ IP, Π° ΡΡΠ½ΠΊΡΠΈΡ sendto Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ IP.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΠΎΠ»Π΅ ip_len ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡΠΎΠ², Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π±Π°ΠΉΡΠΎΠ² ΡΠ·Π»Π°. ΠΡΠΎ ΡΠΈΠΏΠΈΡΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠ°Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ².