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

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

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

 2 void

 3 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

 4 {

 5  int n;

 6  char sendline[MAXLINE], recvline[MAXLINE + 1];

 7  Connect(sockfd, (SA*)pservaddr, servlen);


 8  while (Fgets(sendline, MAXLINE, fp) != NULL) {


 9   Write(sockfd, sendline, strlen(sendline));


10   n = Read(sockfd, recvline, MAXLINE);


11   recvline[n] = 0; /* Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π½ΡƒΠ»ΡŒ */

12   Fputs(recvline, stdout);

13  }

14 }

ИзмСнСния ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсиСй β€” это Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect ΠΈ Π·Π°ΠΌΠ΅Π½Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ sendto ΠΈ recvfrom Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ write ΠΈ read. Ѐункция dg_cli остаСтся Π½Π΅ зависящСй ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ Π²Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² структуру адрСса сокСта, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect. Наша функция main ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, показанная Π² листингС 8.3, остаСтся Ρ‚ΠΎΠΉ ΠΆΠ΅.

Если ΠΌΡ‹ запустим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΡƒΠ·Π»Π΅ macosx, Π·Π°Π΄Π°Π² IP-адрСс ΡƒΠ·Π»Π° freebsd4 (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ запускаСт наш сСрвСр Π½Π° ΠΏΠΎΡ€Ρ‚Π΅ 9877), ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

macosx % udpcli04 172.24.37.94

hello, world

read error: Connection refused

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π°ΠΌΠ΅Ρ‡Π°Π΅ΠΌ, β€” ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° запускаСм процСсс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Ошибка происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ отправляСм сСрвСру ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ. ИмСнно ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° этой Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ICMP ΠΎΡ‚ ΡƒΠ·Π»Π° сСрвСра. Но ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ TCP Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ connect, задавая ΡƒΠ·Π΅Π» сСрвСра, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ процСсс сСрвСра, функция connect Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° трСхэтапного рукопоТатия TCP, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ этот ΠΏΠ°ΠΊΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сСгмСнта RST ΠΎΡ‚ собСсСдника (см. Ρ€Π°Π·Π΄Π΅Π» 4.3).

Π’ листингС 8.8 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ tcpdump.

Листинг 8.8. Π’Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ tcpdump ΠΏΡ€ΠΈ запускС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dg_cli

macosx % tcpdump

01 0.0            macosx.51139 > freebsd4 9877:udp 13

02 0.006180 ( 0.0062) freebsd4 > macosx: icmp: freebsd4 udp port 9877 unreachable

Π’ Ρ‚Π°Π±Π». A.5 ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΡˆΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ ICMP ядро сопоставляСт ошибкС ECONNREFUSED, которая соотвСтствуСт Π²Ρ‹Π²ΠΎΠ΄Ρƒ строки сообщСния Connection refused (Π’ соСдинСнии ΠΎΡ‚ΠΊΠ°Π·Π°Π½ΠΎ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ err_sys.

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

К соТалСнию, Π½Π΅ всС ядра Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ сообщСния ICMP присоСдинСнному сокСту UDP, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ядра Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, происходящих ΠΎΡ‚ Π‘Π΅Ρ€ΠΊΠ»ΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π° ядра System V β€” Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚. НапримСр, Ссли ΠΌΡ‹ запустим Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π° ΡƒΠ·Π»Π΅ Solaris 2.4 ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect соСдинимся с ΡƒΠ·Π»ΠΎΠΌ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ наш сСрвСр, Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ tcpdump ΠΌΡ‹ смоТСм ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ошибка ICMP ΠΎ нСдоступности ΠΏΠΎΡ€Ρ‚Π° возвращаСтся ΡƒΠ·Π»ΠΎΠΌ сСрвСра, Π½ΠΎ вызванная ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ функция read Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Π­Ρ‚Π° ситуация Π±Ρ‹Π»Π° исправлСна Π² Solaris 2.5. UnixWare Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ AIX, Digital Unix, HP-UX ΠΈ Linux Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚.

8.13. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π² UDP

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ влияСт Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния отсутствиС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π² UDP. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dg_cli Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° отправляла фиксированноС число Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ. Она большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π°. Π’ листингС 8.9 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° новая вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚Π° функция отправляСт сСрвСру 2000 Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ UDP ΠΏΠΎ 1400 Π±Π°ΠΉΡ‚ каТдая.

Листинг 8.9. Ѐункция dg_cli, ΠΎΡ‚ΡΡ‹Π»Π°ΡŽΡ‰Π°Ρ фиксированноС число Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ сСрвСру

//udpcliserv/dgcliloop1.c

 1 #include "unp.h"


 2 #define NDG 2000 /* количСство Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ */

 3 #define DGLEN 1400 /* Π΄Π»ΠΈΠ½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ */


 4 void

 5 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

 6 {

 7  int i;

 8  char sendline[DGLEN];


 9  for (i = 0; i < NDG; i++) {

10   Sendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);

11  }

12 }

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ измСняСм сСрвСр Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π» Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ считал число ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ. Π‘Π΅Ρ€Π²Π΅Ρ€ большС Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π’ листингС 8.10 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° новая функция dg_echo. Когда ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ процСсс сСрвСра Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиши прСрывания Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ (Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сигнала SIGINT процСссу), сСрвСр Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ число ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

Листинг 8.10. Ѐункция dg_echo, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹

//udpcliserv/dgecholoop1.c

 1 #include "unp.h"


 2 static void recvfrom_int(int);

 3 static int count;


 4 void

 5 dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)

 6 {

 7  socklen_t len;

 8  char mesg[MAXLINE];


 9  Signal (SIGINT, recvfrom_int);


10  for (;;) {

11   len = clilen;

12   Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);


13   count++;

14  }

15 }


16 static void

17 recvfrom_int(int signo)

18 {

19  printf("\nreceived %d datagrams\n", count);

20  exit(0);

21 }

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ запускаСм сСрвСр Π½Π° ΡƒΠ·Π»Π΅ freebsd, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ SPARCStation. ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΡ‹ запускаСм Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ быстрой систСмС RS/6000 с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой aix. Они соСдинСны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊΠ°Π½Π°Π»ΠΎΠΌ Ethernet Π½Π° 100 ΠœΠ±ΠΈΡ‚/с. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ запускаСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ netstat -s Π½Π° ΡƒΠ·Π»Π΅ сСрвСра ΠΈ Π΄ΠΎ, ΠΈ послС запуска ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ выводимая статистика ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, сколько Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ ΠΌΡ‹ потСряли. Π’ листингС 8.11 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π²Ρ‹Π²ΠΎΠ΄ сСрвСра.

Листинг 8.11. Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΡƒΠ·Π»Π΅ сСрвСра

freebsd % netstat -s -p udp

udp:

 71208 datagrams received

 0 with incomplete header

 0 with bad data length field

 0 with bad checksum

 0 with no checksum

 832 dropped due to no socket

 16 broadcast/multicast datagrams dropped due to no socket

 1971 dropped due to full socket buffers

 0 not for hashed pcb

 68389 delivered

 137685 datagrams output

freebsd % udpserv06 Π·Π°ΠΏΡƒΡΠΊΠ°Π΅ΠΌ наш сСрвСр

                    ΠΊΠ»ΠΈΠ΅Π½Ρ‚ посылаСт Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹

^C Π΄Π»Ρ окончания Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π²Π²ΠΎΠ΄ΠΈΠΌ наш символ прСрывания

freebsd % netstat -s -Ρ€ udp

udp

 73208 datagrams received

 0 with incomplete header

 0 with bad data length field

 0 with bad checksum

 0 with no checksum

 832 dropped due to no socket

 16 broadcast/multicast datagrams dropped due to no socket

 3941 dropped due to full socket buffers

 0 not for hashed pcb

 68419 delivered

 137685 datagrams output

ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» 2000 Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-сСрвСр ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 30 ΠΈΠ· Π½ΠΈΡ…, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ 98%. Ни сСрвСр, Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ сообщСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эти Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ потСряны. Как ΠΌΡ‹ ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, UDP Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ возмоТности управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ β€” ΠΎΠ½ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΅Π½. Как ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, для отправитСля UDP Π½Π΅ составляСт Ρ‚Ρ€ΡƒΠ΄Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ получатСля.

Если ΠΌΡ‹ посмотрим Π½Π° Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ netstat, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ число Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠΌ сСрвСра (Π½Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ-сСрвСром) Ρ€Π°Π²Π½ΠΎ 2000 (73 208 – 71 208). Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ dropped due to full socket buffers (ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΠ·-Π·Π° пСрСполнСния Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² сокСта) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сколько Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ UDP ΠΈ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ сокСта Π±Ρ‹Π» ΠΏΠΎΠ»ΠΎΠ½ [128, с. 775]. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 1970 (3941 – 1971), Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ счСтчика Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (30), Π΄Π°Π΅Ρ‚ 2000 Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠΌ. К соТалСнию, счСтчик Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ·-Π·Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ netstat распространяСтся Π½Π° всю систСму. НС сущСствуСт способа ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ прилоТСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Ρ‹ UDP) это влияСт.

Число Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… сСрвСром Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ. Оно зависит ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сСти, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ ΡƒΠ·Π»Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡƒΠ·Π»Π° сСрвСра.

Если ΠΌΡ‹ запустим Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ сСрвСр, Π½ΠΎ Π½Π° этот Ρ€Π°Π· ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ систСмС Sun, Π° сСрвСр Π½Π° быстрой систСмС RS/6000, Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ.

aix % udpserv06

^? ΠΏΠΎΡΠ»Π΅ окончания Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π²Π²ΠΎΠ΄ΠΈΠΌ наш символ прСрывания

received 2000 datagrams

ΠŸΡ€ΠΈΠ΅ΠΌΠ½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ сокСта UDP

Число Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ UDP, установлСнных Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ UDP, для Π΄Π°Π½Π½ΠΎΠ³ΠΎ сокСта ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта SO_RCVBUF, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.5. Π’ FreeBSD ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° сокСта UDP Ρ€Π°Π²Π΅Π½ 42 080 Π±Π°ΠΉΡ‚, Ρ‡Ρ‚ΠΎ допускаСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ хранСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 30 ΠΈΠ· Π½Π°ΡˆΠΈΡ… 1400-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ. Если ΠΌΡ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° сокСта, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сСрвСр ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹. Π’ листингС 8.12 прСдставлСна измСнСнная функция dg_echo ΠΈΠ· листинга 8.10, которая ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° сокСта Π΄ΠΎ 240 ΠšΠ±Π°ΠΉΡ‚. Если ΠΌΡ‹ запустим этот сСрвСр Π² систСмС Sun, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ β€” Π² систСмС RS/6000, Ρ‚ΠΎ счСтчик ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 103. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это лишь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π°, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ясно, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.