← Назад к вопросам
Что такое устройство сети?
2.0 Middle🔥 131 комментариев
#DevOps и инфраструктура#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Устройство сети (Network Architecture)
Устройство сети — это архитектура и взаимодействие компонентов, которые обеспечивают передачу данных между компьютерами. Для разработчика важно понимать, как данные путешествуют от одной машины к другой, какие протоколы используются и как строится надёжная связь.
Модель OSI (Open Systems Interconnection)
Сеть разделена на 7 уровней, каждый отвечает за свою функцию:
7. Application Layer (приложение) — HTTP, HTTPS, FTP, SMTP, SSH
6. Presentation Layer (представление) — кодирование, шифрование, сжатие
5. Session Layer (сеанс) — управление соединением, сессии
4. Transport Layer (транспорт) — TCP, UDP, надёжность доставки
3. Network Layer (сеть) — IP, маршрутизация, адресация
2. Data Link Layer (канал данных) — MAC, коммутаторы, Ethernet
1. Physical Layer (физический) — кабели, сигналы, электричество
TCP/IP модель (упрощённая)
4. Application — HTTP, DNS, SMTP, SSH
3. Transport — TCP, UDP
2. Internet — IP (IPv4, IPv6)
1. Link/Physical — Ethernet, WiFi
Основные протоколы
TCP (Transmission Control Protocol)
import socket
# TCP сервер (надёжная, упорядоченная доставка)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 5000))
server_socket.listen(1)
print("Сервер слушает на порту 5000...")
connection, client_address = server_socket.accept()
try:
print(f"Подключение от {client_address}")
data = connection.recv(1024) # Получаем данные
print(f"Получено: {data.decode()}")
connection.sendall(b"Hello from TCP server") # Отправляем ответ
finally:
connection.close()
UDP (User Datagram Protocol)
import socket
# UDP сервер (быстрая, но ненадёжная доставка)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 5000))
print("UDP сервер слушает на порту 5000...")
data, client_address = server_socket.recvfrom(1024)
print(f"Получено от {client_address}: {data.decode()}")
server_socket.sendto(b"Hello from UDP", client_address)
TCP vs UDP:
TCP:
- Надёжная доставка
- Упорядоченная доставка
- Медленнее (больше overhead)
- Трёхшаговое рукопожатие (handshake)
- HTTP, HTTPS, Email, SSH
UDP:
- Быстрая доставка
- Пакеты могут потеряться или приходить не по порядку
- Быстрее (меньше overhead)
- Без handshake
- DNS, VoIP, Video Streaming, Online Games
IP адресация и маршрутизация
import socket
# Получить IP адрес хоста
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
print(f"Хост: {hostname}, IP: {ip}")
# Обратное преобразование
host = socket.gethostbyaddr("8.8.8.8")
print(f"IP 8.8.8.8 принадлежит: {host[0]}")
# IPv4 vs IPv6
ipv4 = "192.168.1.1" # 32-битный адрес (4 октета)
ipv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334" # 128-битный адрес
# Проверка типа адреса
import ipaddress
addr4 = ipaddress.ip_address("192.168.1.1")
addr6 = ipaddress.ip_address("2001:db8::1")
print(f"IPv4: {addr4.version}")
print(f"IPv6: {addr6.version}")
Порты и сокеты
import socket
from typing import Tuple
class SimpleServer:
"""Простой TCP сервер"""
def __init__(self, host: str, port: int):
self.host = host
self.port = port
self.socket = None
def start(self):
"""Запустить сервер"""
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((self.host, self.port))
self.socket.listen(5)
print(f"Сервер слушает на {self.host}:{self.port}")
def accept_connection(self) -> Tuple[socket.socket, Tuple[str, int]]:
"""Принять входящее соединение"""
return self.socket.accept()
def close(self):
"""Закрыть сервер"""
if self.socket:
self.socket.close()
# Известные порты:
# 21 - FTP
# 22 - SSH
# 25 - SMTP (Email)
# 53 - DNS
# 80 - HTTP
# 443 - HTTPS
# 3306 - MySQL
# 5432 - PostgreSQL
# 6379 - Redis
HTTP запрос (Application Layer)
import socket
def http_request(host: str, port: int, path: str) -> str:
"""Отправить HTTP запрос"""
# 1. Создаём TCP сокет
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. Подключаемся к серверу
sock.connect((host, port))
# 3. Отправляем HTTP запрос (в тексте)
request = f"GET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n"
sock.sendall(request.encode())
# 4. Получаем ответ
response = b""
while True:
chunk = sock.recv(4096)
if not chunk:
break
response += chunk
# 5. Закрываем соединение
sock.close()
return response.decode()
# HTTP структура
request = """GET /api/users HTTP/1.1
Host: api.example.com
Authorization: Bearer token
Content-Type: application/json
{"id": 1}"""
# response = """HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 27
{"id": 1, "name": "Alice"}"""
DNS (Domain Name System)
import socket
# DNS преобразует доменное имя в IP адрес
hostname = "google.com"
ip_address = socket.gethostbyname(hostname)
print(f"{hostname} -> {ip_address}") # google.com -> 142.250.185.46
# Обратное DNS преобразование
try:
hostname = socket.gethostbyaddr(ip_address)
print(f"{ip_address} -> {hostname[0]}")
except socket.herror:
print("Обратное разрешение не работает")
# Получить все адреса
results = socket.getaddrinfo("example.com", 80)
for family, type, proto, canonname, sockaddr in results:
print(f"IP: {sockaddr[0]}, Port: {sockaddr[1]}")
Асинхронная сетевая программа
import asyncio
async def fetch_data(host: str, port: int) -> str:
"""Асинхронное получение данных"""
reader, writer = await asyncio.open_connection(host, port)
# Отправляем запрос
request = f"GET / HTTP/1.1\r\nHost: {host}\r\n\r\n"
writer.write(request.encode())
await writer.drain()
# Получаем ответ
data = await reader.read(4096)
writer.close()
await writer.wait_closed()
return data.decode()
# Запустить асинхронную функцию
async def main():
response = await fetch_data("example.com", 80)
print(response[:100])
asyncio.run(main())
Сетевые инструменты Python
# 1. Requests (HTTP клиент)
import requests
response = requests.get('https://api.example.com/users')
print(response.status_code)
print(response.json())
# 2. aiohttp (асинхронный HTTP клиент)
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.get('https://api.example.com/users') as resp:
data = await resp.json()
# 3. websockets (WebSocket для real-time связи)
import websockets
async with websockets.connect('wss://echo.websocket.org') as websocket:
await websocket.send('Hello!')
response = await websocket.recv()
print(response)
# 4. paramiko (SSH клиент)
import paramiko
ssh = paramiko.SSHClient()
ssh.connect('example.com', username='user', password='pass')
stdin, stdout, stderr = ssh.exec_command('ls')
print(stdout.read().decode())
ssh.close()
Лучшие практики
- Используйте HTTPS — шифрование данных
- Обрабатывайте таймауты — избегайте зависаний
- Валидируйте входные данные — защита от атак
- Переиспользуйте соединения — Session в requests
- Логируйте сетевые ошибки — для отладки
- Используйте async для I/O — лучше производительность
- Понимайте протоколы — TCP/UDP, HTTP, DNS
Устройство сети — это фундамент, на котором работают все веб-приложения. Понимание протоколов и архитектуры помогает писать эффективный и безопасный код.