Сброс сторон приложения
Если вы определили, что сбросы не вызваны переназначением или неправильным параметром или пакетами, которые будут изменены с помощью сетевого следа, сузить его до сброса уровня приложения.
На приведенных ниже скриншотах видно, что пакеты, которые видны в источнике и пункте назначения, одинаковы без каких-либо изменений или капель, но вы видите явный сброс, отправленный пунктом назначения в источник.
Сторона источника
На трассировку в сторону назначения
Вы также видите пакет флага ACK+RST в случае, если syn пакета создания TCP отправляется. Пакет TCP SYN отправляется, когда клиент хочет подключиться к определенному порту, но если пункт назначения/сервера по какой-либо причине не хочет принимать пакет, он отправляет пакет ACK+RST.
Приложение, вызываее сброс (идентифицированное по номерам портов), должно быть исследовано, чтобы понять, что вызывает его для сброса подключения.
Примечание
Вышеуказанная информация о сбросах с точки зрения TCP, а не UDP. UDP — это протокол без подключения, и пакеты отправляются ненадежно. При использовании UDP в качестве транспортного протокола повторной передачи или сброса не будет. Однако UDP использует ICMP в качестве протокола отчетов об ошибках. Когда пакет UDP отправляется в порт, а пункт назначения не указан в списке, вы увидите недостижимый пункт назначения, отправляемый из хоста назначения ICMP: сообщение порт недостижимое сразу после пакета UDP.
Во время устранения неполадок с подключением можно также увидеть в сетевом следе, на который машина получает пакеты, но не реагирует. В таких случаях может произойть снижение уровня сервера. Чтобы понять, сбрасывает ли локальный брандмауэр пакет, введи аудит брандмауэра на компьютере.
Затем можно просмотреть журналы событий безопасности, чтобы просмотреть падение пакета на определенном порт-IP и связанный с ним фильтровый ID.
Теперь запустите команду, это будет создавать wfpstate.xml файл. После открытия этого файла и фильтра для ID, который вы найдете в вышеупомяемом событии (2944008), вы сможете увидеть имя правила брандмауэра, связанное с этим ID, блокирующее подключение.
Узкие места для пропускной способности TCP
Не используйте сетевой монитор и не принимайте журналы уровня пакетов сети во время тестов пропускной способности TCP. Фильтры мониторинга спецификации интерфейса сетевого драйвера (NDIS) добавляют задержку для отправителям и приемникам при каждом записи пакета. Эта операция требует ресурсов ЦП и создает множество IOs хранилища. Производительность снижается при взятии журналов уровня пакетов, так как TCP пытается восстановиться после потери пакета.
Добавление безопасности имеет собственные проблемы с затратами и производительностью. Протоколы безопасности, такие как безопасность протокола Интернета (IPsec), должны быть накладные и дополнительные требования к обработке. Сравнивая защиту данных с целостностью данных, режим целостности IPsec должен быть предпочтительным для меньших затрат на обработку. Программное обеспечение безопасности также имеет огромные затраты на обработку пакетов, что приведет к более медленным выводам.
Если проверенная производительность не оправдала ожиданий, возьмите журналы, как это определено в счетчиках производительности, связанных с сетью.
Проверив проблемы с производительностью TCP, проверьте связанные протоколы верхнего уровня, такие как протоколы файловой системы (Блок сообщений сервера (SMB) или Network File System (NFS)). Эти протоколы требуют ресурсов процессора и IOs диска. Медленная скорость вызвана неисправным драйвером или оборудованием, высокой отложенной очередью вызова процедуры (DPC) или/и медленными IOs диска. Выяснить, какой компонент в ОС вызывает высокие показатели DPCs, сложно, так как для этого требуется анализ с помощью журнала Xperf/Windows Performance Recorder (WPR) (CPU). Поиск проблем, связанных с диском, относительно проще. Дополнительные сведения см. в дополнительных сведениях в examining and Tuning Disk Performance.
Во время тестирования приложения тестирования (клиентские и серверные приложения) могут быть настроены на использование нескольких потоков с достаточно высокими значениями буфера, чтобы достичь максимальной пропускной способности. Однако это может не отражать фактические условия, так как количество потоков и буфера, которые может использовать каждый вызов API, ограничено в зависимости от программирования. Кроме того, протокол уровня приложений (SMB или Common Internet File System (CIFS)) имеет собственный буфер и оптимизацию(Настройка производительности для серверов файлов или SMB: Руководствопо устранению неполадок). Если приложение работает не так, как ожидалось для базового уровня, работайте со специалистом по приложениям, чтобы найти узкий место.
Что такое TCP/IP
Произошло наименование протокола от сокращения двух английских понятий – Transmission Control Protocol и Internet Protocol. Набор правил, входящий в него, позволяет обрабатывать как сквозную передачу данных, так и другие детали этого механизма. Сюда входит формирование пакетов, способ их отправки, получения, маршрутизации, распаковки для передачи программному обеспечению.
Стек протоколов TCP/IP был создан в 1972 году на базе NCP (Network Control Protocol), в январе 1983 года он стал официальным стандартом для всего интернета. Техническая спецификация уровней взаимодействия описана в документе RFC 1122.
В составе стека есть и другие известные протоколы передачи данных – UDP, FTP, ICMP, IGMP, SMTP. Они представляют собой частные случаи применения технологии: например, у SMTP единственное предназначение заключается в отправке электронных писем.
Проблемы с сетевой сетью
В этом разделе описывается, как проверить на факты базовых сетевых проблем при измерении базовой пропускной способности или устранении проблем пропускной способности.
Чтобы получить анализ журналов уровня пакетов, проверьте проблемы с сетью, используя средство захвата сетевых пакетов (например, Microsoft Network Monitor, Wireshark или ctsTraffic).
Действия для записи журналов с помощью средств захвата сетевых пакетов
-
Начните ведение журнала с помощью Microsoft Network Monitor или Wireshark для захвата трафика на обеих конечных точках. Вы также можете использовать встроенный Windows для захвата следующим образом:
-
Откройте командную подсказку в качестве администратора.
-
Выполните следующую команду:
Примечание
При использовании команды может потребоваться несколько захватов.
-
-
Запустите CTStraffic.exe для создания файла .csv.
-
Остановите ведение журнала. Для Windows встроенного средства захвата введите командную подсказку в качестве администратора.
Анализ файла захвата
Вот пример, показывающий, как анализировать отфильтрованный результат. В этом сценарии средство ctsTraffic использует шаблон push (шаблон по умолчанию), который означает, что пакет отправляется от клиента на сервер.
-
Откройте файл захвата в Microsoft Network Monitor.
-
Фильтр сетевого трассировки с помощью фильтра, который находит пакеты ретрансляторов. Повторное выполнение пакета означает, что TCP-подтверждение данной последовательности TCP от отправитель не получает.
Примечание
Чтобы проанализировать файл ETL, перейдите в параметры инструментов > > Parser Profiles > Windows > Set As Active > OK.
Как показано на скриншоте, кадр повторно передается дважды, что означает, что он передается отправителю три раза. Для определения этого кадра используйте тот же номер последовательности TCP (2278877548).
-
Щелкните правой кнопкой мыши SequenceNumber в подробностях кадра и выберите Добавить выбранное значение для отображения фильтра.
-
Отключим предыдущий фильтр, добавив «//» следующим образом:
-
Нажмите Применить. Полная последовательность TCP с этим номером последовательности отображается следующим образом:
Этот результат показывает, что исходный кадр не получается сервером и повторно отправляется отправителю. Повторное выполнение кадра происходит, если не получено подтверждения последовательности. Чтобы понять, как работает TCP, см. трехначерное рукопожатие с помощью TCP/IP и описание Windows Затем скопируйте фильтр последовательности из трассировки клиента и вклеите его на след сервера.
На сервере получается только один пакет данной последовательности, как показано в следующем результате:
Этот результат доказывает, что на промежуточных сетевых устройствах происходит потеря пакета от отправщика к приемнику. Пакеты покидают отправитель, но никогда не достигают приемник. Это проблема с сетевой сетью, которая должна быть решена сетевыми администраторами.
Разрешить состояние time_wait процесса
Просмотр статуса подключения к процессу #netstat -an|awk ‘/tcp/ {print $6}’|sort|uniq -c
описание статуса
Если в системе обнаружено большое количество соединений состояния TIME_WAIT, настройте параметры ядра, чтобы решить эту проблему. vim /etc/sysctl.confTCP-соединение в статусе time_wait под netstat:
Программа запуска обнаруживает, что порт занят. После проверки netstat обнаруживаются следующие явления: Обнаружено, что порт находится в состоянии TIME_WAIT и состоянии FIN_WAIT2 и не может быть освобожден
Источник статуса TIME_WAIT : Это может быть вызвано аварийным завершением работы предыдущей виртуальной машины.Статус TIME_WAIT Причина: Только сторона, которая первой вызывает close () для инициирования активного завершения работы, войдет в состояние TIME_WAIT. TCP-соединение, которое переходит в состояние TIME_WAIT, должно пройти через 2MSL, чтобы вернуться в исходное состояние.Избегание : Попытайтесь активно завершить работу клиентом, чтобы избежать time_wait на сервере
По запросу номер TCP-соединения
Решение
Отредактируйте файл ядра /etc/sysctl.conf и добавьте следующее содержимое:
Затем выполните / sbin / sysctl -p, чтобы параметры вступили в силу.
Проще говоря, это открытие повторного использования системы TIMEWAIT и быстрого восстановления.
Если после указанной выше настройки производительности производительность неудовлетворительна, вы можете продолжить изменять конфигурацию:
Проверить эффект
Сетевая адресация
Сеть и Интернет Протокол управления транспортом / Интернет-протокол соединения производятся от одного айпи адрес к другому. Для удобства мы можем использовать имя веб-сайта, например cloudsavvyit.com, но это базовый IP-адрес, который используется для маршрутизации вашего подключения к соответствующему веб-серверу. То же самое работает и в обратном направлении. Сетевой трафик, который прибывает на вашем компьютере был направлен на его IP-адрес.
На вашем компьютере будет запущено множество программ и служб. На вашем рабочем столе могут быть открыты почтовая программа и браузер. Возможно, вы используете чат-клиент, например Слабина или же Команды Microsoft. Если вы администрируете удаленные машины, вы можете использовать безопасная оболочка (SSH) соединение. Если вы работаете из дома и вам нужно подключиться к своему офису, вы можете использовать Протокол удаленного рабочего стола (RDP) или Виртуальная частная сеть (VPN) соединение.
IP-адрес только идентифицирует компьютер. Это не может быть более детализированным, чем это. Но настоящая конечная точка для сетевого подключения — это запущенное приложение или служба. Итак, как ваш компьютер узнает, в какое приложение отправлять каждый сетевой пакет? Ответ заключается в использовании порты.
Когда курьер доставляет посылку в отель, адрес идентифицирует здание. Номер комнаты идентифицирует комнату и гостя отеля. Уличный адрес подобен IP-адресу, а номер комнаты подобен адресу порта. Приложения и службы используют определенные пронумерованные порты. Таким образом, фактическим местом назначения сетевого пакета является порт с IP-адресом. Этого достаточно, чтобы идентифицировать приложение или службу на конкретном компьютере, для которого предназначен пакет.
Исходный код программы
#include <sys/wait.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]) { pid_t cpid, w; int status; cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Код, выполняемый потомком */ printf("Child PID is %ld\n", (long) getpid()); if (argc == 1) pause(); /* Ожидание сигналов */ _exit(atoi(argv)); } else { /* Код, выполняемый родителем */ do { w = waitpid(cpid, &status, WUNTRACED | WCONTINUED); if (w == -1) { perror("waitpid"); exit(EXIT_FAILURE); } if (WIFEXITED(status)) { printf("exited, status=%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("killed by signal %d\n", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("stopped by signal %d\n", WSTOPSIG(status)); } else if (WIFCONTINUED(status)) { printf("continued\n"); } } while (!WIFEXITED(status) && !WIFSIGNALED(status)); exit(EXIT_SUCCESS); } }
Порты и сокеты – что это и зачем они нужны
Процессы, работающие на прикладном уровне, «общаются» с транспортным, но они видны ему как «черные ящики» с зашифрованной информацией. Зато он понимает, на какой IP-адрес адресованы данные и через какой порт надо их принимать. Этого достаточно для точного распределения пакетов по сети независимо от месторасположения хостов. Порты с 0 до 1023 зарезервированы операционными системами, остальные, в диапазоне от 1024 до 49151, условно свободны и могут использоваться сторонними приложениями.
Комбинация IP-адреса и порта называется сокетом и используется при идентификации компьютера. Если первый критерий уникален для каждого хоста, второй обычно фиксирован для определенного типа приложений. Так, получение электронной почты проходит через 110 порт, передача данных по протоколу FTP – по 21, открытие сайтов – по 80.
Маршрутизация
Более сложный вопрос встаёт, если IP-адрес компьютера-адресата не входит в локальную сеть компьютера-отправителя. Ведь и в этом случае пакет необходимо отослать какому-то абоненту локальной сети, с тем, чтобы тот перенаправил его дальше. Этот абонент, маршрутизатор, подключён к нескольким сетям, и ему вменяется в обязанность пересылать пакеты между ними по определённым правилам. В самом простом случае таких сетей две: «внутренняя», к которой подключены компьютеры, и «внешняя», соединяющая маршрутизатор со всей глобалной сетью. Таблицу, управляющую маршрутизацией пакетов, можно просмотреть с помощью команды или (обе команды имеют ключ «», заставляющий их использовать в выдаче IP-адреса, а не имена компьютеров):
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.102.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 192.168.102.1 0.0.0.0 UG 0 0 0 eth0
Пример 3. Простая таблица маршрутизации
На машине Мефодия в таблице маршрутизации всего три записи: одна — про сеть , доступную по интерфейсу , другая — про сеть , доступную через заглушку, и последняя — про сеть , доступную через маршрутизатор (gateway) с адресом . Сеть — это и есть «весь интернет», потому что ей принадлежат любые IP-адреса (ни одного бита на сетевую маску), такая запись в таблице назывется маршрут по умолчанию. Если маршрут по умолчанию не задан, попытка связаться с удалённым компьютером может окончиться ошибкой «No route to host»: система не сможет определить, кому пересылать пакет.
На маршрутизаторе таблица выглядит посложнее:
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 83.237.29.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 192.168.102.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 10.13.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 83.237.29.1 0.0.0.0 UG 0 0 0 ppp0 # ifconfig ppp0 ppp0 Link encap:Point-to-Point Protocol inet addr:83.237.29.51 P-t-P:83.237.29.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1 RX packets:17104 errors:0 dropped:0 overruns:0 frame:0 TX packets:23839 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:5879278 (5.6 Mb) TX bytes:1750644 (1.6 Mb)
Пример 4. Сложная таблица маршрутизации
Начать с того, что вдобавок к сетевым интерфейсам и тут наличествует интерфейс типа «точка-точка», . Это виртуальный интерфейс: он не соответствует никакому сетевому устройству, а организуется по инициативе демона , работающего в соответствии с протоколом PPP (Point to Point Protocol). PPP-соединение позволяет организовать «сеть», состоящую всего из двух абонентов, связанных любой средой передачи данных: двумя модемами и телефоном, тремя проводами, ethernet и т. п.
Получив IP-пакет, система начинает «примерять» его поочерёдно ко всем записям таблицы маршрутизации, отсортированным в порядке убывания размера сетевой маски (в том же порядке выдаёт их команда ). Если сеть адресата совпадает с сетью из таблицы, пакет нужно пересылать по адресу, указанному в поле «Gateway». Этот адрес используется вместо поля адресата и поиск возобновляется с начала таблицы. Если поле «Gateway» — нулевое, значит, речь идёт об абоненте локальной сети, и пакет надо передать на уровень ниже ( при этом может обновить ARP-таблицу, — действовать как-то ещё). Если ни одна сеть не подходит, выдаётся сообщение об ошибке. В примере все пакеты, не предназначенные сетям , и , отправляются на маршрутизатор по умолчанию с адресом . Первая же запись рассказывает, как добраться до этого маршрутизатора (точнее, до сети , что эквивалентно единственному абоненту ).
Относительно IP-адресов на маршрутизаторе Гуревич как-то заметил, что только один из них — — «настоящий». Он имел в виду стандарт RFC1918, описывающий, какие диапазоны IP-адресов можно использовать в любой внутренней сети. Задача системного администратора — сделать так, чтобы при работе с сетью Internet ни в одном пакете не стояло такого внутреннего адреса отправителя: например, подменять внутренние адреса на единственный внешний («настоящий»). Задача эта решается с помощью межсетевого экрана (firewall), который в Linux называется , но когда Мефодий попросил Гуревича рассказать поподробнее, тот только рукой махнул: надо хорошо знать TCP/IP.
Как защитить эти порты
Все порты должны быть закрыты, если нет задокументированного, проверенного и утвержденного экономического обоснования. Сделайте то же самое для открытых сервисов. Пароли по умолчанию необходимо изменить и заменить надежными уникальными паролями. По возможности следует использовать двухфакторную аутентификацию.
Все службы, протоколы, микропрограммы и приложения должны по-прежнему соответствовать жизненному циклу поддержки производителей, и для них должны быть доступны исправления безопасности и исправления ошибок.
Контролируйте порты, которые используются в вашей сети, и исследуйте любые странности или необъяснимые открытые порты. Поймите, как выглядит ваше обычное использование порта, чтобы можно было определить необычное поведение. Выполните сканирование портов и тесты на проникновение.
Закройте порт 23 и прекратите использование Telnet. Шутки в сторону. Просто перестань.
Порты SSH можно защитить с помощью аутентификации с открытым ключом и двухфакторной аутентификации. Также поможет настройка вашей сети на использование другого номера порта для трафика SSH.
Если вам необходимо использовать IRC, убедитесь, что он находится за брандмауэром, и потребуйте, чтобы пользователи IRC подключились к вашей сети через VPN, чтобы использовать его. Не позволяйте внешнему трафику напрямую попадать в ваш IRC.
Отслеживайте и фильтруйте DNS-трафик. Из порта 53 не должно выходить ничего, кроме подлинных DNS-запросов.
Примите стратегию глубокоэшелонированной защиты и сделайте свою защиту многоуровневой. Используйте межсетевые экраны на основе хоста и сети. Рассмотрим систему обнаружения вторжений (IDS), такую как бесплатный Snort с открытым исходным кодом.
Отключите прокси, которые вы не настраивали или которые вам больше не нужны.
Некоторые возвращаемые строки SNMP содержат учетные данные по умолчанию в виде обычного текста. Отключите это.
Удалите нежелательные заголовки ответов HTTP и HTTPS и отключите баннеры, которые по умолчанию включаются в ответы от некоторого сетевого оборудования. Они напрасно выдают информацию, которая приносит пользу только злоумышленникам.
Памятные числа
Некоторые авторы вредоносных программ выбирают легко запоминающиеся последовательности чисел или повторяющиеся числа для использования в качестве портов. Для этого использовались порты 234, 6789, 1111, 666 и 8888. Обнаружение любого из этих странно выглядящих номеров портов, используемых в вашей сети, должно повлечь за собой более глубокое расследование.
Порт 31337, означающий элиту в позвольте говорить, — еще один распространенный номер порта для использования вредоносными программами. Его использовали как минимум 30 вариантов вредоносного ПО, включая Заднее отверстие и Bindshell.
Методы wait и notify
Последнее обновление: 27.04.2018
Иногда при взаимодействии потоков встает вопрос о извещении одних потоков о действиях других. Например, действия одного потока зависят от результата действий другого потока,
и надо как-то известить один поток, что второй поток произвел некую работу. И для подобных ситуаций у класса Object определено ряд методов:
-
wait(): освобождает монитор и переводит вызывающий поток в состояние ожидания до тех пор, пока другой поток не вызовет метод
-
notify(): продолжает работу потока, у которого ранее был вызван метод
-
notifyAll(): возобновляет работу всех потоков, у которых ранее был вызван метод
Все эти методы вызываются только из синхронизированного контекста — синхронизированного блока или метода.
Рассмотрим, как мы можем использовать эти методы. Возьмем стандартную задачу из прошлой темы — «Производитель-Потребитель» («Producer-Consumer»):
пока производитель не произвел продукт, потребитель не может его купить. Пусть производитель должен произвести 5 товаров, соответственно потребитель
должен их все купить. Но при этом одновременно на складе может находиться не более 3 товаров.
Для решения этой задачи задействуем методы и :
public class Program { public static void main(String[] args) { Store store=new Store(); Producer producer = new Producer(store); Consumer consumer = new Consumer(store); new Thread(producer).start(); new Thread(consumer).start(); } } // Класс Магазин, хранящий произведенные товары class Store{ private int product=0; public synchronized void get() { while (product<1) { try { wait(); } catch (InterruptedException e) { } } product--; System.out.println("Покупатель купил 1 товар"); System.out.println("Товаров на складе: " + product); notify(); } public synchronized void put() { while (product>=3) { try { wait(); } catch (InterruptedException e) { } } product++; System.out.println("Производитель добавил 1 товар"); System.out.println("Товаров на складе: " + product); notify(); } } // класс Производитель class Producer implements Runnable{ Store store; Producer(Store store){ this.store=store; } public void run(){ for (int i = 1; i < 6; i++) { store.put(); } } } // Класс Потребитель class Consumer implements Runnable{ Store store; Consumer(Store store){ this.store=store; } public void run(){ for (int i = 1; i < 6; i++) { store.get(); } } }
Итак, здесь определен класс магазина, потребителя и покупателя. Производитель в методе добавляет в объект Store с помощью его метода
6 товаров. Потребитель в методе в цикле обращается к методу объекта Store для получения
этих товаров. Оба метода Store — и являются синхронизированными.
Для отслеживания наличия товаров в классе Store проверяем значение переменной . По умолчанию товара нет, поэтому переменная равна .
Метод — получение товара должен срабатывать только при наличии хотя бы одного товара. Поэтому в методе
проверяем, отсутствует ли товар:
while (product<1)
Если товар отсутсвует, вызывается метод . Этот метод освобождает монитор объекта Store и блокирует выполнение метода get, пока для этого же монитора не будет вызван
метод .
Когда в методе добавляется товар и вызывается , то метод получает монитор и выходит из
конструкции , так как товар добавлен. Затем имитируется получение покупателем товара. Для этого
выводится сообщение, и уменьшается значение product: . И в конце вызов метода дает сигнал методу продолжить работу.
В методе работает похожая логика, только теперь метод должен срабатывать, если в магазине не более трех товаров. Поэтому в цикле проверяется наличие товара, и если товар уже есть,
то освобождаем монитор с помощью и ждем вызова в методе .
И теперь программа покажет нам другие результаты:
Производитель добавил 1 товар Товаров на складе: 1 Производитель добавил 1 товар Товаров на складе: 2 Производитель добавил 1 товар Товаров на складе: 3 Покупатель купил 1 товар Товаров на складе: 2 Покупатель купил 1 товар Товаров на складе: 1 Покупатель купил 1 товар Товаров на складе: 0 Производитель добавил 1 товар Товаров на складе: 1 Производитель добавил 1 товар Товаров на складе: 2 Покупатель купил 1 товар Товаров на складе: 1 Покупатель купил 1 товар Товаров на складе: 0
Таким образом, с помощью в методе мы ожидаем, когда производитель добавит новый продукт. А после добавления
вызываем , как бы говоря, что на складе освободилось одно место, и можно еще добавлять.
А в методе с помощью мы ожидаем освобождения места на складе. После того, как место освободится, добавляем товар и
через уведомляем покупателя о том, что он может забирать товар.
НазадВперед
Преобразование IP-адресов в символьные адреса
Технология активно используется для назначения буквенно-цифровых названий веб-ресурсов. При вводе домена в адресной строке браузера сначала происходит обращение к специальному серверу DNS. Он всегда прослушивает порт 53 у всех компьютеров, которые подключены к интернету, и по запросу преобразует введенное название в стандартный IP-адрес.
После определения точного местонахождения файлов сайта включается обычная схема работы – от прикладного уровня с кодированием данных до обращения к физическому оборудованию на уровне сетевых интерфейсов. Процесс называется инкапсуляцией информации. На принимающей стороне происходит обратная процедура – декапсуляция.
Уровни модели TCP/IP
Протокол TCP/IP основан на OSI и так же, как предшественник, имеет несколько уровней, которые и составляют его архитектуру. Всего выделяют 4 уровня – канальный (интерфейсный), межсетевой, транспортный и прикладной.
Канальный (сетевой интерфейс)
Аппаратный уровень обеспечивает взаимодействие сетевого оборудования Ethernet и Wi-Fi. Он соответствует физическому из предыдущего стандарта OSI. Здесь задача состоит в кодировании информации, ее делению на пакеты и отправке по нужному каналу. Также измеряются параметры сигнала вроде задержки ответа и расстояния между хостами.
Межсетевой (Internet Layer)
Интернет состоит из множества локальных сетей, объединенных между собой как раз за счет протокола связи TCP/IP. Межсетевой уровень регламентирует взаимодействие между отдельными подсетями. Маршрутизация осуществляется путем обращения к определенному IP-адресу с использованием маски.
Если хосты находятся в одной подсети, маркируемой одной маской, данные передаются напрямую. В противном случае информация «путешествует» по целой цепочке промежуточных звеньев, пока не достигнет нужной точки. Назначение IP-адреса проводится по стандарту IPv4 или IPv6 (они не совместимы между собой).
Транспортный уровень (Transport Layer)
Следующий уровень отвечает за контроль доставки, чтобы не возникало дублей пакетов данных. В случае обнаружения потерь или ошибок информация запрашивается повторно. Такой подход дает возможность полностью автоматизировать процессы независимо от скорости и качества связи между отдельными участками интернета или внутри конкретной подсети.
Протокол TCP отличается большей достоверностью передачи данных по сравнению с тем же UDP, который подходит только для передачи потокового видео и игровой графики. Там некритичны потери части пакетов, чего нельзя сказать о копировании программных файлов и документов. На этом уровне данные не интерпретируются.
Прикладной уровень (Application Layer)
Здесь объединены 3 уровня модели OSI – сеансовый, представления и прикладной. На него ложатся задачи по поддержанию сеанса связи, преобразованию данных, взаимодействию с пользователем и сетью. На этом уровне применяются стандарты интерфейса API, позволяющего передавать команды на выполнение определенных задач.
Возможно и использование «производных» протоколов. Например, для открытия сайтов используется HTTPS, при отправке электронной почты – SMTP, для назначения IP-адресов – DHCP. Такой подход упрощает программирование, снижает нагрузку на сеть, увеличивает скорость обработки команд и передачи данных.
Заключение
В этой статье мы обсудили некоторые основные концепции синхронизации в Java; более конкретно, мы сосредоточились на том, как мы можем использовать wait() и notify() для решения интересных проблем синхронизации. И, наконец, мы рассмотрели пример кода, в котором мы применили эти концепции на практике.
Прежде чем мы закончим здесь, стоит упомянуть, что все эти низкоуровневые API, такие как wait () , notify() и notifyAll () -это традиционные методы, которые хорошо работают, но механизм более высокого уровня часто проще и лучше – например, собственные интерфейсы Java Lock и Condition (доступны в java.util.concurrent.замки пакет).
Для получения дополнительной информации о пакете java.util.concurrent посетите нашу статью обзор java.util.concurrent , а Блокировка и Условие описаны в руководстве по java.util.concurrent.Замки, здесь .
Как всегда, полные фрагменты кода, используемые в этой статье, доступны на GitHub.