← Назад к вопросам

Что такое устройство сети?

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()

Лучшие практики

  1. Используйте HTTPS — шифрование данных
  2. Обрабатывайте таймауты — избегайте зависаний
  3. Валидируйте входные данные — защита от атак
  4. Переиспользуйте соединения — Session в requests
  5. Логируйте сетевые ошибки — для отладки
  6. Используйте async для I/O — лучше производительность
  7. Понимайте протоколы — TCP/UDP, HTTP, DNS

Устройство сети — это фундамент, на котором работают все веб-приложения. Понимание протоколов и архитектуры помогает писать эффективный и безопасный код.

Что такое устройство сети? | PrepBro