Коротка версія: Один апарат Windows Server 2012 у моїй мережі отримує стійкі, але переривчасті TCP RST під час підключення до певних веб-сайтів. Данно, звідки вони родом. Ознайомтеся з журналом проводів про мої аналізи та запитання.
Довга версія:
Ми запускаємо кешування веб-проксі на одному з наших серверів для обслуговування нашого маленького офісу. Співробітник повідомив, що під час підключення до певних сайтів виникає багато помилок "Скидання з’єднання" або "Сторінка не може бути відображена", але оновлення зазвичай виправляє це.
Я перевірив поведінку веб-переглядача, а потім безпосередньо, спробувавши непроксі-браузер на самому сервері. Але пінг та відстеження до проблемних сайтів не показують жодних проблем; проблеми, здається, обмежуються підключенням tcp.
Потім я створив сценарій для тестування постраждалих сайтів, надсилаючи їм запити HTTP HEAD безпосередньо через CURL і перевіряючи, наскільки часто вони досягають успіху. Типовий тест виглядає приблизно так: (це непроксимоване, працює безпосередньо на поганому сервері)
C:\sdk\Apache24\htdocs>php rhTest.php
Sending HTTP HEAD requests to "http://www.washingtonpost.com/":
20:21:42: Length: 0 Response Code: NULL (0%)
20:22:02: Length: 0 Response Code: NULL (0%)
20:22:22: Length: 0 Response Code: NULL (0%)
20:22:42: Length: 0 Response Code: NULL (0%)
20:23:02: Length: 3173 Response Code: HTTP/1.1 302 Moved Temporarily (20%)
20:23:22: Length: 3174 Response Code: HTTP/1.1 302 Moved Temporarily (33.33%)
20:23:43: Length: 0 Response Code: NULL (28.57%)
20:24:03: Length: 3171 Response Code: HTTP/1.1 302 Moved Temporarily (37.5%)
20:24:23: Length: 3173 Response Code: HTTP/1.1 302 Moved Temporarily (44.44%)
20:24:43: Length: 3172 Response Code: HTTP/1.1 302 Moved Temporarily (50%)
20:25:03: Length: 0 Response Code: NULL (45.45%)
В довгостроковій перспективі лише близько 60% запитів досягають успіху, решта не повертає нічого, з кодом помилки згортання: "CURL-помилка (56): Невдача при отриманні даних від однорангової" Погане поведінка узгоджується з веб-сайтами I тест (жоден сайт ніколи не став «кращим»), і він досить наполегливий, я вже тиждень виправляю неполадки, і співробітники повідомляють, що проблема існує місяцями.
Я протестував сценарій запиту HEAD на інших машинах в нашій мережі: немає проблем, усі з'єднання проходять на всі сайти мого тестового списку. Потім я встановив проксі-сервер на своєму персональному робочому столі, і коли я запускаю HEAD-запити з проблемного сервера, хоча це, всі з'єднання проходять через. Отже, яка б проблема не була, вона дуже специфічна для цього сервера.
Далі я спробував визначити, які веб-сайти демонструють поведінку для скидання з'єднання:
- Жоден з наших інтранет-сайтів (192.168.xx) не перериває з'єднання.
- Жоден ipv6 сайт, який я перевіряв, не підключає з'єднання. (Ми з двома стеками)
- Лише невелика частина сайтів ipv4 в Інтернеті припиняє з'єднання.
- Кожен сайт, який використовує cloudflare як CDN (що я тестував), припиняє з'єднання. (але здається, що проблема не є виключною для сайтів, що працюють із хмарними областями)
Цей кут не перетворювався на щось дійсно корисне, тому наступним чином я встановив провідну ручку, щоб подивитися, що відбувається, коли запит не вдався. Невдалі запити HEAD виглядають так: (більший скріншот тут: http://imgur.com/TNfRUtX )
127 48.709776000 192.168.1.142 192.33.31.56 TCP 66 52667 > http [SYN, ECN, CWR] Seq=0 Win=8192 Len=0 MSS=8960 WS=256 SACK_PERM=1
128 48.728207000 192.33.31.56 192.168.1.142 TCP 66 http > 52667 [SYN, ACK, ECN] Seq=0 Ack=1 Win=42340 Len=0 MSS=1460 SACK_PERM=1 WS=128
129 48.728255000 192.168.1.142 192.33.31.56 TCP 54 52667 > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
130 48.739371000 192.168.1.142 192.33.31.56 HTTP 234 HEAD / HTTP/1.1
131 48.740917000 192.33.31.56 192.168.1.142 TCP 60 http > 52667 [RST] Seq=1 Win=0 Len=0
132 48.757766000 192.33.31.56 192.168.1.142 TCP 60 http > 52667 [ACK] Seq=1 Ack=181 Win=42240 Len=0
133 48.770314000 192.33.31.56 192.168.1.142 TCP 951 [TCP segment of a reassembled PDU]
134 48.807831000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
135 48.859592000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
138 49.400675000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
139 50.121655000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
141 51.564009000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
143 54.452561000 192.33.31.56 192.168.1.142 TCP 951 [TCP Retransmission] http > 52667 [PSH, ACK] Seq=1 Ack=181 Win=42240 Len=897
Я читаю це (виправте мене, якщо я не прав, це насправді не моя область):
- Ми відкриваємо tcp-з'єднання з веб-сервером
- веб-сервер ACK
- Запит HTTP HEAD надсилається
- Існує пакет RST, позначений як IP-адреса веб-сервера, який вбиває з'єднання.
- Веб-сервер надсилає ACK
- Веб-сервер (намагається) відповісти на запит HEAD з дійсними даними HTTP (відповідь 951 байт містить правильний заголовок HTTP)
- Веб-сервер повторно передає (кілька разів протягом декількох секунд) дійсну відповідь HTTP, але вона не може досягти успіху, оскільки з'єднання було RST
Отже, якщо веб-сервер надіслав дійсну RST, чому він продовжує намагатися заповнити запит? І якщо веб-сервер не генерував RST, що, до біса?
Те, що я спробував, не мав ефекту:
- Відключення об’єднання в NIC
- Зміна мережного адаптера (відомо, що NIC заміни працював)
- Призначення статичного ip.
- Відключення ipv6.
- Відключення джамбо-кадрів.
- Підключіть сервер безпосередньо до нашого модему на одну ніч, минаючи наші комутатори та маршрутизатор.
- Відключення брандмауера Windows.
- Скидання параметрів TCP через мережу
- Відключення практично будь-якого іншого сервера на сервері. (Ми в основному використовуємо це як сервер файлів, але є апачі та пара БД)
- Стукаючи головою по столу (повторно)
Я підозрюю, що щось на сервері генерує пакети RST, але все життя я не можу його знайти. Мені здається, ніби я знав: чому це просто цей сервер? А Чому лише деякі веб-сайти? це б дуже допомогло Поки мені все ще цікаво, я все більше схильний нукерувати з орбіти і починати спочатку.
Ідеї / пропозиції?
-Спасибі