Skip to content

Commit 24da8fc

Browse files
committed
Add intro web
1 parent 04c093a commit 24da8fc

2 files changed

Lines changed: 354 additions & 0 deletions

File tree

src/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
- [Оптимизация по времени и памяти](./dev/python/optimization.md)
4848
- [Обработка данных](./dev/python/numpy-and-pandas.md)
4949
- [Визуализация данных](./dev/python/visualization/practice.md)
50+
- [Основы WEB](./dev/web.md)
5051

5152
# Учимся у других
5253

src/dev/web.md

Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,353 @@
1+
# Основы компьютерных сетей и веб-технологий
2+
3+
## Введение в сетевые технологии
4+
5+
Компьютерные сети представляют собой сложные многоуровневые системы, обеспечивающие обмен данными между устройствами. Современный интернет построен на принципах, позволяющих использовать сетевые возможности без необходимости глубокого понимания всех технических деталей.
6+
7+
## Сетевые модели: OSI vs TCP/IP
8+
9+
### Модель OSI (эталонная 7-уровневая модель)
10+
1. **Физический уровень** - передача битов через физическую среду
11+
2. **Канальный уровень** - передача кадров между соседними узлами
12+
3. **Сетевой уровень** - маршрутизация между сетями (IP)
13+
4. **Транспортный уровень** - обеспечение надежной доставки (TCP/UDP)
14+
5. **Сеансовый уровень** - управление сессиями связи
15+
6. **Уровень представления** - преобразование данных
16+
7. **Прикладной уровень** - сетевые приложения (HTTP, DNS, FTP)
17+
18+
### Модель TCP/IP (практическая 4-уровневая модель)
19+
- **Уровень сетевого доступа** (объединяет физический и канальный)
20+
- **Сетевой уровень** (IP)
21+
- **Транспортный уровень** (TCP/UDP)
22+
- **Прикладной уровень** (HTTP, SMTP, DNS)
23+
24+
## Уровень сетевого доступа
25+
26+
### Физический уровень
27+
Обеспечивает передачу необработанных битов через физическую среду:
28+
- **Медные кабели**: витая пара (UTP/STP), коаксиальные кабели
29+
- **Оптоволокно**: одномодовое и многодовое
30+
- **Беспроводные технологии**: Wi-Fi (802.11), Bluetooth, сотовая связь
31+
32+
**Ключевые характеристики**:
33+
- Скорость передачи данных
34+
- Полоса пропускания
35+
- Затухание сигнала
36+
- Помехоустойчивость
37+
38+
**Примеры проблем**:
39+
- Обрыв кабеля
40+
- Электромагнитные помехи
41+
- Неправильная обжимка коннекторов
42+
- Превышение максимальной длины сегмента
43+
44+
### Канальный уровень
45+
Обеспечивает надежную передачу данных между устройствами в одной локальной сети:
46+
47+
**Основные технологии**:
48+
- Ethernet (IEEE 802.3)
49+
- Wi-Fi (IEEE 802.11)
50+
- PPP (точка-точка)
51+
52+
**Ключевые компоненты**:
53+
- **MAC-адреса**: уникальные идентификаторы сетевых интерфейсов
54+
- **Ethernet-фреймы**: структурированные блоки данных
55+
- **ARP-протокол**: разрешение IP-адресов в MAC-адреса
56+
- **VLAN**: логическое разделение сети на виртуальные сегменты
57+
58+
**Диагностика**:
59+
```bash
60+
ip link show # показать сетевые интерфейсы
61+
ethtool eth0 # информация об интерфейсе
62+
arp -a # показать ARP-таблицу
63+
```
64+
65+
## Сетевой уровень (IP)
66+
67+
### Основы IP-адресации
68+
69+
#### IPv4
70+
- 32-битные адреса (4 октета по 8 бит)
71+
- Формат: `192.168.1.1`
72+
- Классы адресов: A, B, C, D, E
73+
- Частные диапазоны:
74+
- `10.0.0.0/8`
75+
- `172.16.0.0/12`
76+
- `192.168.0.0/16`
77+
78+
#### IPv6
79+
- 128-битные адреса (8 групп по 16 бит)
80+
- Формат: `2001:0db8:85a3:0000:0000:8a2e:0370:7334`
81+
- Сокращенная запись: `2001:db8:85a3::8a2e:370:7334`
82+
- Типы адресов: unicast, multicast, anycast
83+
84+
### Маршрутизация
85+
Определение пути для пакетов между различными сетями:
86+
87+
**Таблица маршрутизации**:
88+
```bash
89+
$ ip route show
90+
default via 192.168.1.1 dev eth0
91+
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
92+
10.0.0.0/8 via 192.168.1.254 dev eth0
93+
```
94+
95+
**Политики маршрутизации**:
96+
```bash
97+
$ ip rule
98+
0: from all lookup local
99+
32766: from all lookup main
100+
32767: from all lookup default
101+
```
102+
103+
**Диагностика**:
104+
```bash
105+
traceroute 8.8.8.8
106+
mtr 8.8.8.8
107+
ip route get 8.8.8.8
108+
```
109+
110+
## Транспортный уровень
111+
112+
### UDP (User Datagram Protocol)
113+
- Без установления соединения
114+
- Нет гарантий доставки
115+
- Нет контроля перегрузок
116+
- Низкие накладные расходы
117+
118+
**Применение**:
119+
- DNS-запросы
120+
- VoIP (голосовая связь)
121+
- Онлайн-игры
122+
- Видеотрансляции
123+
124+
### TCP (Transmission Control Protocol)
125+
- Установление соединения (трехстороннее рукопожатие)
126+
- Гарантии доставки и порядка
127+
- Контроль перегрузок
128+
- Механизмы повторной передачи
129+
130+
#### Трехстороннее рукопожатие
131+
1. Клиент → Сервер: SYN (запрос на соединение)
132+
2. Сервер → Клиент: SYN-ACK (подтверждение)
133+
3. Клиент → Сервер: ACK (подтверждение)
134+
135+
#### Заголовок TCP
136+
```
137+
| Source Port | Destination Port |
138+
| Sequence Number |
139+
| Acknowledgment Number |
140+
| Data Offset | Reserved | Flags | Window Size |
141+
| Checksum | Urgent Pointer |
142+
```
143+
144+
#### Управление перегрузками
145+
- **Tahoe/Reno**: классические алгоритмы
146+
- **Cubic**: используется по умолчанию в Linux
147+
- **BBR**: современный алгоритм от Google
148+
149+
**Диагностика TCP**:
150+
```bash
151+
netstat -tn
152+
ss -tlnp
153+
tcpdump -i any tcp port 80
154+
```
155+
156+
## Прикладной уровень
157+
158+
### DNS (Domain Name System)
159+
Преобразование доменных имен в IP-адреса:
160+
161+
**Типы DNS-записей**:
162+
- A/AAAA - IPv4/IPv6 адреса
163+
- MX - почтовые серверы
164+
- CNAME - канонические имена
165+
- TXT - текстовые записи
166+
167+
**Пример на Python**:
168+
```python
169+
import socket
170+
ip_address = socket.gethostbyname('example.com')
171+
```
172+
173+
### URL (Uniform Resource Locator)
174+
Структура: `protocol://host:port/path?query#fragment`
175+
176+
**Примеры**:
177+
- `http://example.com:80/path?search=query`
178+
- `https://api.example.com/v1/data`
179+
- `ftp://ftp.example.com/files`
180+
- `mailto:user@example.com`
181+
182+
### HTTP (HyperText Transfer Protocol)
183+
Протокол прикладного уровня для передачи веб-контента.
184+
185+
#### HTTP-запрос
186+
```
187+
GET /index.html HTTP/1.1
188+
Host: example.com
189+
User-Agent: Mozilla/5.0
190+
Accept: text/html
191+
Connection: keep-alive
192+
```
193+
194+
**Методы HTTP**:
195+
- GET - получение ресурса
196+
- POST - отправка данных
197+
- PUT - обновление ресурса
198+
- DELETE - удаление ресурса
199+
- PATCH - частичное обновление
200+
201+
#### HTTP-ответ
202+
```
203+
HTTP/1.1 200 OK
204+
Content-Type: text/html
205+
Content-Length: 1234
206+
Server: nginx
207+
Date: Mon, 21 Nov 2022 00:18:53 GMT
208+
```
209+
210+
**Коды состояния**:
211+
- 1xx - информационные
212+
- 2xx - успешные (200 OK, 201 Created)
213+
- 3xx - перенаправления (301 Moved Permanently)
214+
- 4xx - ошибки клиента (404 Not Found)
215+
- 5xx - ошибки сервера (500 Internal Server Error)
216+
217+
### Работа с HTTP в Python
218+
219+
#### Использование сокетов
220+
```python
221+
import socket
222+
223+
# TCP-соединение
224+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
225+
sock.connect(('example.com', 80))
226+
request = b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'
227+
sock.sendall(request)
228+
response = sock.recv(4096)
229+
```
230+
231+
#### Библиотека requests
232+
```python
233+
import requests
234+
235+
response = requests.get('https://api.example.com/data')
236+
print(response.status_code)
237+
print(response.headers)
238+
print(response.json())
239+
```
240+
241+
### SSL/TLS
242+
Защищенная передача данных через шифрование:
243+
244+
```python
245+
import ssl
246+
import socket
247+
248+
context = ssl.create_default_context()
249+
with socket.create_connection(('example.com', 443)) as sock:
250+
with context.wrap_socket(sock, server_hostname='example.com') as ssock:
251+
ssock.sendall(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
252+
response = ssock.recv(4096)
253+
```
254+
255+
## Веб-скрапинг и парсинг HTML
256+
257+
### Библиотека BeautifulSoup
258+
```python
259+
from bs4 import BeautifulSoup
260+
import requests
261+
262+
html = requests.get('http://example.com').text
263+
soup = BeautifulSoup(html, 'html.parser')
264+
265+
# Извлечение данных
266+
title = soup.find('title').text
267+
links = soup.find_all('a', href=True)
268+
for link in links:
269+
print(link['href'], link.text)
270+
```
271+
272+
### Практические советы по скрапингу
273+
1. Проверяйте `robots.txt`
274+
2. Используйте задержки между запросами
275+
3. Устанавливайте User-Agent заголовок
276+
4. Обрабатывайте ошибки
277+
5. Кэшируйте полученные данные
278+
279+
## Работа с API
280+
281+
### Публичные API
282+
```python
283+
import requests
284+
import json
285+
286+
# Пример работы с API словаря
287+
DICTIONARY_API = 'https://dictionary.yandex.net/api/v1/dicservice.json/lookup'
288+
params = {
289+
'key': 'your_api_key',
290+
'lang': 'en-ru',
291+
'text': 'hello'
292+
}
293+
294+
response = requests.get(DICTIONARY_API, params=params)
295+
data = response.json()
296+
translations = data['def'][0]['tr']
297+
```
298+
299+
### OAuth авторизация
300+
```python
301+
class ApiClient:
302+
def __init__(self, token):
303+
self.session = requests.Session()
304+
self.session.headers['Authorization'] = f'Bearer {token}'
305+
306+
def get_user_info(self):
307+
response = self.session.get('https://api.example.com/user')
308+
return response.json()
309+
```
310+
311+
### JSON формат
312+
JavaScript Object Notation - стандартный формат для обмена данными:
313+
314+
```python
315+
import json
316+
317+
# Сериализация
318+
data = {'name': 'John', 'age': 30}
319+
json_string = json.dumps(data)
320+
321+
# Десериализация
322+
parsed_data = json.loads(json_string)
323+
```
324+
325+
## Асинхронные HTTP-запросы
326+
327+
### Библиотека httpx
328+
```python
329+
import httpx
330+
331+
# Синхронные запросы
332+
with httpx.Client() as client:
333+
response = client.get('https://example.com')
334+
print(response.status_code)
335+
336+
# Асинхронные запросы
337+
import asyncio
338+
339+
async def fetch_data():
340+
async with httpx.AsyncClient() as client:
341+
response = await client.get('https://example.com')
342+
return response.json()
343+
```
344+
345+
## Заключение
346+
347+
Современные сетевые технологии представляют собой многоуровневую систему, где каждый уровень решает определенные задачи:
348+
- **Физический и канальный уровни** обеспечивают базовую передачу данных
349+
- **Сетевой уровень** отвечает за маршрутизацию между сетями
350+
- **Транспортный уровень** гарантирует надежную доставку
351+
- **Прикладной уровень** предоставляет интерфейсы для конкретных сервисов
352+
353+
Понимание этих принципов позволяет эффективно диагностировать проблемы, разрабатывать сетевые приложения и взаимодействовать с веб-сервисами через API. Современные инструменты и библиотеки Python значительно упрощают работу с сетевыми протоколами, делая разработку сетевых приложений доступной для широкого круга программистов.

0 commit comments

Comments
 (0)