УРОК #1: OSI модель — что разработчику реально нужно знать
Начинаем серию "Умнее собаки". Сегодня разберем OSI модель с точки зрения разработчика, а не сетевика. Без воды, только то, что пригодится в продакшене.
⚠️ SPOILER: Вам нужно понимать только L3, L4 и L7. Остальное — проблемы DevOps.
🔧 ЧТО РЕАЛЬНО ВАЖНО ДЛЯ РАЗРАБОТЧИКА:
Layer 7: Application — ваш код живет здесь
• HTTP/HTTPS, WebSocket, gRPC
• REST API, GraphQL
• Здесь ваши ошибки 400, 404, 500
• Здесь же CORS, cookies, JWT токены
Типичные проблемы:
- "405 Method Not Allowed" — забыли разрешить POST
- "431 Request Header Too Large" — напихали в cookies мегабайт
- "504 Gateway Timeout" — ваш endpoint тормозит
Layer 4: Transport — TCP vs UDP
TCP: socket.socket(AF_INET, SOCK_STREAM) — гарантированная доставка
UDP: socket.socket(AF_INET, SOCK_DGRAM) — скорость важнее надежности
Когда какой:
- REST API, базы данных → TCP
- Метрики, логи, DNS, игры → UDP
- Video streaming → UDP (или QUIC)
Layer 3: Network — IP адресация и роутинг
ping api.service.com # ICMP, проверка L3
telnet api.service.com 443 # проверка L3+L4
curl -I https://api.service.com # проверка L3+L4+L7
💀 РЕАЛЬНЫЕ КЕЙСЫ ИЗ ПРОДАКШЕНА:
Case 1: "Почему тормозит API?"
❌ for (let i = 0; i < 1000; i++) {
await fetch('https://api.example.com/data') // новое TCP соединение
}
✅ const agent = new https.Agent({ keepAlive: true, maxSockets: 50 })
Проблема: TCP handshake (L4) + TLS handshake = +100-200ms латенси на каждый запрос
Case 2: "Too many connections"
❌ conn = psycopg2.connect(...) # не закрыли соединение
✅ with psycopg2.connect(...) as conn: # автоматическое закрытие
Проблема на L4: исчерпание портов (max ~64K) и файловых дескрипторов
Case 3: "CORS не работает"
❌ Access-Control-Allow-Origin: localhost:3000
✅ Access-Control-Allow-Origin: http://localhost:3000
Проблема на L7: браузер блокирует из-за неправильных заголовков
🔍 ОТЛАДКА ПО СЛОЯМ (снизу вверх):
L3: ping 8.8.8.8 # есть сеть вообще?
L4: nc -zv google.com 443 # порт открыт?
L7: curl -v https://api.example.com # что отвечает сервер?
Если ping работает, но curl не работает → проблема на L4-L7
Если ping не работает → проблема на L1-L3 (зовите DevOps)
📊 СТАТИСТИКА ПРОБЛЕМ В ПРОДЕ:
• 40% — неправильные HTTP заголовки/методы (L7)
• 30% — connection pool / таймауты (L4)
• 20% — файрволы / security groups (L3-L4)
• 10% — реальные сетевые проблемы (L1-L3)
🐕 ПОДХОД СОБАКИ VS РАЗРАБОТЧИКА:
Собака: Нюхает порт 443 → Работает/Не работает → Идет спать
Разработчик: Tcpdump → Wireshark → 3 часа анализа → "Забыл добавить localhost в CORS"
🎯 ГЛАВНОЕ ЗА СЕГОДНЯ:
1. OSI — 7 слоев, но вам нужны только 3: Network (L3), Transport (L4), Application (L7)
2. Большинство проблем на L7 (ваш код) или L4 (соединения)
3. Connection pooling решает 50% проблем производительности
4. Если ping работает, но приложение нет — проблема в вашем коде
5. Собака debuggit быстрее, потому что не усложняет
📝 ДОМАШНЕЕ ЗАДАНИЕ:
Запустите tcpdump -i any port 443 и откройте любой HTTPS сайт. Попробуйте найти:
- TCP 3-way handshake (SYN, SYN-ACK, ACK)
- TLS ClientHello
- HTTP запрос (если повезет)
Завтра: TCP vs UDP — почему ваш REST API использует протокол 1981 года с гарантиями доставки для запросов, которые вы все равно ретраите.
#УмнееСобаки #OSI #NetworkingForDevs #L7Problems
Начинаем серию "Умнее собаки". Сегодня разберем OSI модель с точки зрения разработчика, а не сетевика. Без воды, только то, что пригодится в продакшене.
⚠️ SPOILER: Вам нужно понимать только L3, L4 и L7. Остальное — проблемы DevOps.
🔧 ЧТО РЕАЛЬНО ВАЖНО ДЛЯ РАЗРАБОТЧИКА:
Layer 7: Application — ваш код живет здесь
• HTTP/HTTPS, WebSocket, gRPC
• REST API, GraphQL
• Здесь ваши ошибки 400, 404, 500
• Здесь же CORS, cookies, JWT токены
Типичные проблемы:
- "405 Method Not Allowed" — забыли разрешить POST
- "431 Request Header Too Large" — напихали в cookies мегабайт
- "504 Gateway Timeout" — ваш endpoint тормозит
Layer 4: Transport — TCP vs UDP
TCP: socket.socket(AF_INET, SOCK_STREAM) — гарантированная доставка
UDP: socket.socket(AF_INET, SOCK_DGRAM) — скорость важнее надежности
Когда какой:
- REST API, базы данных → TCP
- Метрики, логи, DNS, игры → UDP
- Video streaming → UDP (или QUIC)
Layer 3: Network — IP адресация и роутинг
ping api.service.com # ICMP, проверка L3
telnet api.service.com 443 # проверка L3+L4
curl -I https://api.service.com # проверка L3+L4+L7
💀 РЕАЛЬНЫЕ КЕЙСЫ ИЗ ПРОДАКШЕНА:
Case 1: "Почему тормозит API?"
❌ for (let i = 0; i < 1000; i++) {
await fetch('https://api.example.com/data') // новое TCP соединение
}
✅ const agent = new https.Agent({ keepAlive: true, maxSockets: 50 })
Проблема: TCP handshake (L4) + TLS handshake = +100-200ms латенси на каждый запрос
Case 2: "Too many connections"
❌ conn = psycopg2.connect(...) # не закрыли соединение
✅ with psycopg2.connect(...) as conn: # автоматическое закрытие
Проблема на L4: исчерпание портов (max ~64K) и файловых дескрипторов
Case 3: "CORS не работает"
❌ Access-Control-Allow-Origin: localhost:3000
✅ Access-Control-Allow-Origin: http://localhost:3000
Проблема на L7: браузер блокирует из-за неправильных заголовков
🔍 ОТЛАДКА ПО СЛОЯМ (снизу вверх):
L3: ping 8.8.8.8 # есть сеть вообще?
L4: nc -zv google.com 443 # порт открыт?
L7: curl -v https://api.example.com # что отвечает сервер?
Если ping работает, но curl не работает → проблема на L4-L7
Если ping не работает → проблема на L1-L3 (зовите DevOps)
📊 СТАТИСТИКА ПРОБЛЕМ В ПРОДЕ:
• 40% — неправильные HTTP заголовки/методы (L7)
• 30% — connection pool / таймауты (L4)
• 20% — файрволы / security groups (L3-L4)
• 10% — реальные сетевые проблемы (L1-L3)
🐕 ПОДХОД СОБАКИ VS РАЗРАБОТЧИКА:
Собака: Нюхает порт 443 → Работает/Не работает → Идет спать
Разработчик: Tcpdump → Wireshark → 3 часа анализа → "Забыл добавить localhost в CORS"
🎯 ГЛАВНОЕ ЗА СЕГОДНЯ:
1. OSI — 7 слоев, но вам нужны только 3: Network (L3), Transport (L4), Application (L7)
2. Большинство проблем на L7 (ваш код) или L4 (соединения)
3. Connection pooling решает 50% проблем производительности
4. Если ping работает, но приложение нет — проблема в вашем коде
5. Собака debuggit быстрее, потому что не усложняет
📝 ДОМАШНЕЕ ЗАДАНИЕ:
Запустите tcpdump -i any port 443 и откройте любой HTTPS сайт. Попробуйте найти:
- TCP 3-way handshake (SYN, SYN-ACK, ACK)
- TLS ClientHello
- HTTP запрос (если повезет)
Завтра: TCP vs UDP — почему ваш REST API использует протокол 1981 года с гарантиями доставки для запросов, которые вы все равно ретраите.
#УмнееСобаки #OSI #NetworkingForDevs #L7Problems