У меня длительный процесс прослушивания сокета TCP и запуска под Linux.После нескольких недель работы он загадочным образом прекратил обработку входящих соединений.После исследования я обнаружил, что для каждого соединения удаленный конец отправляет пакет SYN, на который моя система отвечает SYN / ACK.Затем удаленный конец отправляет ACK для завершения трехстороннего рукопожатия и пытается отправить данные.
Однако моя сторона никогда не ACKs ни один из этих пакетов данных и вместо этого продолжает ретранслировать SYN / ACK, на который удаленный конец отвечает дублирующим ACK, но моя сторона снова игнорирует его.Процесс повторяется некоторое время, и, наконец, моя сторона отправляет RST.
Если бы не тот факт, что захват пакета был сделан на той же машине, на которой выполнялся мой процесс, я бы подумал, что в сети произошла потеря пакетови удаленные ACK никогда не были получены, ядро действует так, как будто это правда, но ясно, что ACK поступают, как показывает wireshark.в wireshark (скриншот прилагается) мои исходящие TCP-пакеты имеют неправильную контрольную сумму, но я полагаю, что это просто из-за того, что я использую PCAP в этой системе, а вычисление контрольной суммы выполняется позже.
Перезапуск процесса заставил все работать снова нормально.
Мой вопрос: что могло вызвать это, и что я мог изменить в своей программе, чтобы предотвратить это?Кажется, это проблема низкого уровня внутри ядра, я не уверен, что может быть не так в пользовательском пространстве, чтобы вызвать это