Реализация TCP-состояний - PullRequest
1 голос
/ 05 марта 2011

В моем сетевом курсе я изучал, что существует 11 состояний TCP, они следующие:

  1. Закрыто
  2. Слушай
  3. Syn_Sent
  4. Syn_Rcvd
  5. Установлено
  6. Fin_Wait_1
  7. FIN_WAIT_2
  8. Закрытие
  9. Время ожидания
  10. Last_Ack
  11. Close_Wait

Я не знаю точно, сколько из этих состояний фактически реализовано в сетевой архитектуре ядра Linux.

Я хочу написать программу с использованием системных вызовов, которая может захватить все эти состояния, которые реализованы в ядре Linux.

На самом деле я хочу использовать программирование сокетов и системные вызовы просто для захвата таких состояний, как:

всякий раз, когда я делаю netstat -taupen | grep tcp, я хочу видеть все эти состояния соединения в столбце State для одного и того же соединения tcp в разное время.

Кто-нибудь подскажет, как запрограммировать такой код.

Ответы [ 3 ]

2 голосов
/ 06 марта 2011

Прежде всего, вам нужно реализовать как клиентскую, так и серверную стороны соединения, и вам, вероятно, нужно будет запустить их из внешнего скрипта, чтобы они могли передавать правильные параметры и / или уничтожаться при нужно время, чтобы продемонстрировать различные состояния способом, видимым из netstat. Лучшим справочным материалом для подробностей о чем-то подобном может быть Стивен Сетевое программирование Unix . Если вы просматриваете книгу и исходный код (, который можно загрузить здесь ), вы увидите примеры способов преднамеренного создания различных состояний TCP-соединения в видимой форме. Одна вещь, которую вы захотите посмотреть, это код неблокирующих соединений, а также поиск SO_REUSEADDR, SO_LINGER, убийство с ожиданием времени . Ничто не заменит чтение Стивена, когда дело доходит до такой темы.

2 голосов
/ 05 марта 2011

Все они реализованы, но вы можете наблюдать их только через вызовы API сокетов:

  1. Закрыто
  2. Прослушивать
  3. Syn_Sent (только неблокирующая)
  4. Установлено
  5. Fin_Wait_1 (неявное)
  6. Fin_Wait_2 (только при попытке чтения и получения EOF)
  7. Закрытие (только неблокирующее)
  8. Последнее подтверждение (только при повторном использовании порта)
1 голос
/ 26 марта 2011

Если вас не устраивает вывод состояния из внешнего наблюдения (отслеживание пакетов), вам придется обрабатывать код ядра: добавить несколько операторов журнала в код перехода, перекомпилировать ядро ​​..

/ usr / src / linux-source-2.6.32 / net / ipv4 # head -n 250 tcp.c |grep -n "^ [^ a-zA-Z0-9] * TCP_" |sed "s | ^. * (TCP_ [A-Z0-9 _] ). | \ 1 |"|пока читаешь S;do echo -e "\ n $ S:";grep -l $ S ./* |tr '\ n' '';сделанный ;echo

TCP_SYN_SENT: ./af_inet.c ./tcp.c ./tcp_input.c ./tcp_ipv4.c ./tcp_output.c

TCP_SYN_RECV: ./inet_connection_sock.g ./.c ./tcp.c ./tcp_input.c ./tcp_ipv4.c ./tcp_minisocks.c

TCP_ESTABLISHED: ./datagram.c ./raw.c ./tcp.c ./tcp_input.c./tcp_ipv4.c ./udp.c

TCP_FIN_WAIT1: ./tcp.c ./tcp_input.c

TCP_FIN_WAIT2: ./tcp.c ./tcp_input.c ./tcp_minisocks.c ./tcp_timer.c

TCP_CLOSING: ./tcp.c ./tcp_input.c

TCP_TIME_WAIT: ./inet_diag.c ./inet_timewait_sock.c ./tcp.c ./tcp.cput.c ./tcp_ipv4.c ./tcp_minisocks.c

TCP_CLOSE_WAIT: ./tcp.c ./tcp_input.c

TCP_LAST_ACK: ./tcp.c ./tcp_input.c

TCP_CLOSE: ./af_inet.c ./inet_connection_sock.c ./inet_hashtables.c ./raw.c ./tcp.c ./tcp_cong.c ./tcp_input.c ./tcp_ipv4.c ./tcp_output.c ./tcp_timer.c ./udp.c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...