Сеансы TCP и изменения IP
Что происходит с сеансом TCP при изменении IP-адреса клиента?
Я выполнил простой тест на прослушивание netcat через порт и подключение к этому порту с клиентского компьютера. Затем я изменил IP-адрес клиента, когда этот сеанс nc был открыт, и отправил некоторые данные, после изменения IP-адреса сервер не получил никаких данных.
- Я знаю, что это разные уровни, но использует ли TCP IP для части того, как он различает сессии?
- Мой пример не работает из-за того, как приложение обрабатывает его, или это не работает из-за того, что что-то происходит на уровнях TCP/IP/Ethernet?
- Это зависит от реализации ОС? (В данный момент меня больше всего интересует Linux)
6 ответов
Насколько я понимаю, сокет TCP состоит из номера порта IP +, поэтому изменение IP-адреса разрывает это соединение. У nc нет возможности узнать, изменился ли IP-адрес, поэтому он продолжает отправлять данные на исходный IP-адрес до истечения времени ожидания сеанса.
См. RFC 793 (Протокол управления передачей), в частности, раздел 2.7:
2,7. Установление и очистка соединения
Чтобы идентифицировать отдельные потоки данных, которые может обрабатывать TCP, TCP предоставляет идентификатор порта. Поскольку идентификаторы портов выбираются независимо каждым TCP, они могут быть не уникальными. Чтобы обеспечить уникальные адреса в каждом TCP, мы объединяем интернет-адрес, идентифицирующий TCP, с идентификатором порта, чтобы создать сокет, который будет уникальным во всех сетях, соединенных вместе.
Я предлагаю использовать Wireshark или другой анализатор пакетов, чтобы самим наблюдать за трафиком и видеть его в действии.
Предыдущие ответы скажут вам, что TCP-соединения не могут быть сохранены при изменении IP-адреса. Это было правильно в 2009 году, когда эти ответы были написаны.
Однако в январе 2013 года был опубликован RFC 6824, в котором представлен способ поддерживать TCP-соединения живыми при изменении IP-адреса. По состоянию на июнь 2014 года он еще не получил широкой поддержки. В частности, эталонная реализация существует в виде патча для Linux, и iOS7 по умолчанию поддерживает MPTCP. В Википедии перечислено пять реализаций.
Сессия умрет. TCP-сокеты - это порт dst, dst ip, порт src, src ip. Если что-то из этого изменится, соединение должно быть разорвано (по крайней мере, согласно Стивенсу).
РЕДАКТИРОВАТЬ: Это верно для любой реализации RFC. RFC 793, раздел 2.7
Другие ответили с точки зрения соединения, определяемого парой IP+ порт. Позвольте мне немного рассказать о том, как это работает в многоуровневой структуре.
TCP - это уровень, который обеспечивает "иллюзию" надежного потока поверх ненадежного пакетного уровня (IP). Для этого он должен вести учет нескольких переменных для управления потоком, а также предоставлять соответствующие параметры для уровня ниже.
Итак, когда вы просите TCP открыть поток, вы указываете ему IP+ порт назначения. Он сохраняет этот IP-номер и каждый раз, когда ему необходимо что-то передать, собирает IP-пакет и сообщает IP-уровню отправить его на предполагаемый компьютер, идентифицируемый только исходным IP-номером.
Когда вы изменили номер IP одного компьютера, уровень TCP другого не имеет никакого способа узнать, что произошло. Он только видит, что на любой IP-пакет, отправленный на исходный IP-номер, больше нет ответа (возможно, он получает сообщение ICMP, говорящее о том, что нет машины с таким IP-номером). Кроме того, он не получает больше пакетов с этим номером IP. Очевидно, что соединение будет разорвано через некоторое время.
Хуже того, он может начать получать некоторые несвязанные пакеты из другого источника (новый IP-номер), но они предполагают, что соединение уже установлено! Конечно, единственным ответом, который может получить машина (если она вообще есть), является пакет RST, который заставляет его немедленно прекратить и отказаться.
Сеансы TCP определяются по IP-адресу и номеру порта на обеих сторонах соединения. Изменение ip-адреса на одной стороне нарушило бы эту сессию.
Комбинация (адрес источника, порт источника, адрес назначения, порт назначения) называется парой сокетов. Он используется стеком TCP для идентификации соединения. После установки TCP не может обновить ни один из них.
Протокол SCTP позволяет конечным точкам изменять свои адреса на лету, но он не получил широкого распространения (во всяком случае, пока).