Флаг сброса TCP (RST)
Я пытаюсь транслировать видео между двумя хостами, также пытаюсь смоделировать сценарий изменения IP, клиент начал слушать сервер, затем я переместил клиента на новый коммутатор, и он получил 192.168.2.5, я использую Mininet и Ryu контроллер. моя топология выглядит следующим образом:
ha-eth0<->s1-eth1 (OK OK)
hb-eth0<->s2-eth12 (OK OK)
hc-eth0<->s1-eth3 (OK OK)
s2-eth1<->s1-eth4 (OK OK)
s2-eth2<->s3-eth1 (OK OK)
Я использую vlc-wraper и HTTP-протокол для streaminh. также я установил следующие потоки, чтобы изменить IP-адрес клинта на коммутаторах 1 и 2:
cookie=0x0, duration=1012.669s, table=0, n_packets=2, n_bytes=1894, idle_age=1004, priority=3,ip,nw_src=192.168.2.2,nw_dst=192.168.2.3 actions=output:4
cookie=0x0, duration=1012.668s, table=0, n_packets=1, n_bytes=54, idle_age=1004, priority=3,ip,nw_src=192.168.2.3,nw_dst=192.168.2.2 actions=output:1
cookie=0x0, duration=1059.340s, table=0, n_packets=1, n_bytes=947, idle_age=1051, priority=3,ip,nw_src=192.168.2.2,nw_dst=192.168.2.3 actions=mod_nw_dst:192.168.2.5,output:12
cookie=0x0, duration=1059.340s, table=0, n_packets=1, n_bytes=54, idle_age=1051, priority=3,ip,nw_src=192.168.2.5,nw_dst=192.168.2.2 actions=mod_nw_src:192.168.2.3,output:1
ha (Host A) IP 192.168.2.2 (клиентский хост)
hb (Host B) старый IP-адрес 192.168.2.3 и новый IP-адрес 192.168.2.5 (хост сервера)
когда поток остановился, я проверил Wireshark и заметил, что там был TCP RST, но я не знаю почему? может кто-нибудь посмотреть в файлах Wireshark и сказать мне причины.
Я прикрепил вывод Wireshark для обоих хостов https://drive.google.com/open?id=1rcVlNT2cwnvNL4-4j061xGpKJohSdU9z
1 ответ
В соответствии со спецификациями 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 получит сообщение о том, что поток мертв.