В соответствии со спецификациями TCP, идентичность TCP-соединения определяется комбинацией этих четырех вещей:
- IP-адрес конечной точки A
- Номер порта TCP конечной точки A
- IP-адрес конечной точки B
- Номер порта TCP конечной точки B
Если какая-либо из этих четырех вещей изменяется, то по определению базового протокола TCP это больше не то же самое соединение .
Когда ваш Хост B переключился со своего старого IP-адреса на новый, все существующие соединения и связанное с ними состояние были привязаны к старому IP-адресу. Операционная система достаточно умна, чтобы знать, что после изменения IP-адреса интерфейса любые существующие TCP-соединения не могут быть продолжены, так как старый IP-адрес больше не может использоваться.
Очевидно, что изменение IP-адреса было довольно резким в том, что касается хоста B: нет ни DHCPRELEASE, ни каких-либо попыток упорядоченного завершения существующих соединений перед разрушением старого IP-адреса.
В результате на сетевом интерфейсе хоста B, поскольку старый IP-адрес разрушен, также возникают любые TCP-соединения, которые были связаны со старым IP-адресом.
Ваша программно-определяемая сеть, очевидно, позаботится о преобразовании адресов назначения пакетов, поступающих с хоста A, на новый IP-адрес - но операционная система хоста B не знает об этом, и поэтому не имеет ни малейшего представления, что в этом конкретном случае она было бы возможно сохранить состояние соединения и продолжать использовать его даже с новым IP-адресом.
Таким образом, как только хост B получает один из повторно переданных пакетов от хоста A, он видит, что он адресован с 192.168.2.2, с порта 1234 по 192.168.2.5, с порта 37186. Нет записи о существующем TCP-соединении с этими точными параметрами. - поэтому операционная система может отправлять только TCP RST в качестве ответа.
(Даже если информация о старом соединении была сохранена, она имела сторону хоста B в IP-адресе как 192.168.2.3, поэтому, насколько известно узлу B, этот новый пакет для 192.168.2.5 не имеет абсолютно никакого отношения к этому старому соединению.)
Когда ответ RST возвращается к хосту A, SDN преобразует свой адрес источника в 192.168.2.3, поэтому хост A распознает его как принадлежащий существующему соединению. И поэтому узел A получит сообщение о том, что поток мертв.