Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1737 clevermous 1
Что осуществлено
2
==================
3
 
4
Следующие особенности присутствуют в коде TCP/IP стека:
5
 
6
 
7
  Уровень IP.
8
  ICMP.
9
  Уровень TCP.
10
  Уровень UDP.
11
  Локальный возврат цикла.
12
  Realtek 8029 интерфейсов сети стандарта Ethernet PCI.
13
  Realtek 8139 интерфейсов сети стандарта Ethernet PCI.
14
  Intel i8255x PCI интерфейс сети стандарта Ethernet.
15
  Динамическая таблица протокола определения адресов.
16
  Point-to-point протокол(PPP)
17
 
18
И следующие Интернет программы:
19
 
20
  HTTP сервер
21
  POP клиент
22
  Telnet
23
  DNS Name resolver
24
  Mp3 сервер
25
  TFTP клиент
26
  IRC клиент
27
  FTP клиент
28
  PPP - звонилка
29
 
30
Есть ряд экспериментальных приложений для проигрывания потоковой музыки и
31
выполнения взаимодействия процессов через сокеты. Также есть простенький
32
браузер, позволяющий лазить по всемирной паутине(WWW).
33
 
34
 
35
Что не осуществлено
36
===================
37
 
38
Уровень IP не обрабатывает опции заголовка.
39
Уровень IP не поддерживает маршрутизацию.
40
Фрагментация пакета не поддерживается.
41
 
42
 
43
Конфигурация PPP в Колибри
44
===========================
45
 
46
Смотрите ppp.txt(или ppp_rus.txt с русским переводом)
47
 
48
 
49
Как сконфигурировать Колибри для локальной сети
50
==============================================
51
 
52
Для начала у вас должна быть сетевая карта стандарта Ethernet или, если её нет,
53
встроенную в вашу системную плату. Если вы, не знаете, есть ли у вас сетевая
54
карта, то пробуйте сконфигурировать стек. Если она есть и поддерживается, то
55
сможете использовать её.
56
 
57
Установка таблицы протокола определения адресов
58
-----------------------------------------------
59
 
60
Таблица протокола определения адресов в Колибри уже динамически создана и
61
сконфигурированна. Вы можете посмотреть, с какими компьютерами Колибри работает,
62
выполнив приложение ARPSTAT.
63
 
64
Подключение к локальной сети
65
---------------------------
66
 
67
Загрузите Колибри, затем выберите STACKCFG(конфигурация стека) в меню NET(сеть).
68
 
69
Нажмите Кнопку 'Чтения', затем выберите 'Драйвер Пакета'.
70
Нажмите "Change"(выбор) рядом с адресом IP, и введите нужный IP, который вы
71
хотите использовать. Удостоверьтесь, что он находится в той же самой подсети,
72
что и сама локальная сеть, к которой вы подключены. Нажмите "Apply"(применить)
73
для подтверждения изменений.
74
Закройте программу.
75
 
76
Стек сконфигурирован и запущен. Вы можете проверить его работу, пропинговав
77
Колибри с удаленного компьютера.
78
 
79
Самый простой способ подключить два PC вместе - это использовать нулевое
80
модемное соединение. Это обычное соединение компьютеров посредством кабеля. Они
81
могут быть куплены вместе с памятью или просто сделаны. Подробности можно найти
82
в Интернете. Ищите на поисковиках, (например www.gogle.ru) введя в строку
83
поиска: 'организация соединения компьютеров с помощью кабеля' или подобные.
84
 
85
Как использовать TCP/IP без подключения к сети
86
=============================================
87
 
88
Колибри поддерживает форму локального возврата цикла, а это значит, что
89
приложения на одном и том же самом PC могут общаться друг с другом через
90
сокеты, как если бы они находились на удалённых компьютерах. Чтобы соединяться
91
с приложением на локальной машине, определите локальный адрес IP как адрес
92
назначения. Вы даже не должны конфигурировать стек для сети стандарта Ethernet,
93
локальный возврат цикла будет работать без любых сетевых, аппаратных средств.
94
Хорошо подходит для проверки и отладки сетевых приложений.
95
 
96
Прикладной программный интерфейс
97
================================
98
 
99
Разработчик может обратиться к стеку через прерывание 0x40, функции 53. Файл
100
TFTPC.ASM - хороший пример того, как можно использовать программный интерфейс
101
(по крайней мере, для UDP), но как сетевая коммуникация, довольно сложен. Я дам
102
краткий обзор.
103
 
104
Сокеты
105
=======
106
 
107
Приложения соединяются друг с другом и передают информацию между собой через
108
механизм, названный 'сокетом'. Сокеты - оконечные точки для коммуникации. Для
109
каждого нужного сетевого приложения должен быть открыт хотя бы один сокет.
110
 
111
Использование сокетов немного походит на использования файлов в ОС. Вы
112
открываете, читаете и пишете в них, затем закрываете. Единственная вещь,
113
которая делает жизнь немного более сложной - это то, что в отличие от работы с
114
файлами, у вас появится трудности с работой сокетов (например, не захочет
115
закрываться)
116
 
117
Познакомимся с терминологией прежде, чем мы пойдём дальше.
118
 
119
*Сокет                Уникальный идентификатор, используемый приложением для
120
коммуникации.
121
 
122
*Локальный порт       Число, которое идентифицирует нужное приложение на
123
локальном компьютере. Порты - способ, позволяющих множествам приложений
124
общаться с другими компьютерами, благодаря чему нет путаницы в передаваемых
125
данных (Техническое определение 'мультиплексные'). Число порта - 16 бит.
126
 
127
*Удалённый порт       Число, которое идентифицирует приложение на удалённом
128
компьютере, к которому мы обращаемся. На удалённом компьютере - это 'локальный
129
порт'. Число порта - 16 бит.
130
 
131
*Адрес IP             Это 32 битное число, которое идентифицирует удалённый PC,
132
с которым мы общаемся.
133
 
134
*Пассивный режим      Это режим, в котором сокет открыт, а локальный PC ждёт
135
соединения.
136
 
137
*Активный режим       Это режим, в котором сокет открыт, а локальный PC пытается
138
соединиться с удалённым PC.
139
 
140
Соединяясь с сокетом на удаленном PC, вы должны не только определить IP адрес,
141
но и полностью квалифицировать его, т.е. определить IP адрес и число порта.
142
Иначе стек на удалённом PC не будет знать, какому приложению предназначаются
143
посланные данные. Вот небольшой пример:
144
 
145
192.168.1.10:80     ;Мы присоединяемся к компьютеру с IP адресом 192.168.1.10 к
146
80 порту.
147
 
148
Числа порта являются важными. Некоторые 'известны' и обеспечивают доступ к
149
общим приложениям. Например, порт 80 используется серверами гипертекстового
150
транспортного протокола(HTTP). Таким путём я могу соединиться с вебсервером на
151
нужном компьютере без необходимости узнавать прослушиваемый приложением номер
152
порта.
153
 
154
Как вы знаете, есть два режима: Пассивный и Активный. Вебсервер открыл
155
пассивный сокет, поскольку он ждет входящих запросов на подключение.
156
Web-броузер открыл активный сокет, потому что он пытается соединиться с
157
указанным удалённым компьютером.
158
 
159
Доступ к программированию интерфейса
160
====================================
161
Разработчик обращается к функциям стека через прерывание 0x40, функции 53. К
162
некоторым функциям можно обратиться через функцию 52, но они главным образом
163
предназначены для конфигурации стека.
164
Вот функций, которые вы можете использовать:
165
 
166
Получаем локальный IP адрес
167
---------------------------
168
eax = 52
169
ebx = 1
170
 
171
IP адрес возвратился в eax (в виде байтов, из которых состоит Интернет адрес)
172
 
173
Запись для расположения в стеке входной очереди
174
-----------------------------------------------
175
eax = 52
176
ebx = 6
177
edx = число байтов для записи
178
esi = указатель на данные (в прикладном пространстве)
179
 
180
По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка.
181
Этот интерфейс - только для медленных сетевых драйверов (PPP, SLIP)
182
 
183
Чтение данных из сетевой очереди вывода
184
---------------------------------------
185
eax = 52
186
ebx = 8
187
esi = указатель на данные (в прикладном пространстве)
188
 
189
По возвращению, eax считает число байтов переданным.
190
Этот интерфейс -  только для медленных сетевых драйверов (PPP, SLIP)
191
 
192
Открываем UDP сокет
193
-------------------
194
eax = 53
195
ebx = 0
196
ecx = локальный порт
197
edx = удаленный порт
198
esi = удаленный ip адрес (в виде байтов, из которых состоит Интернет адрес)
199
 
200
Номер сокета возвращён в eax.
201
Возвращаемое значение 0xFFFFFFFF означает, что сокеты не открылись.
202
 
203
Открываем TCP сокет
204
-------------------
205
eax = 53
206
ebx = 5
207
ecx = локальный порт
208
edx = удаленный порт
209
esi = удаленный ip адрес (в виде байтов, из которых состоит Интернет адрес)
210
edi = режим: SOCKET_PASSIVE или SOCKET_ACTIVE (определён в stack.inc)
211
 
212
Номер сокета возвращается в eax.
213
Возвращаемое значение 0xFFFFFFFF означает, что сокеты не открылись.
214
 
215
Закрытие сокета (Только UDP)
216
----------------------------
217
eax = 53
218
ebx = 1
219
ecx = номер сокета
220
 
221
По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка.
222
 
223
Закрытие сокета (Только TCP)
224
----------------------------
225
eax = 53
226
ebx = 8
227
ecx = число сокета
228
 
229
По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка.
230
 
231
Опрос сокета
232
-------------
233
eax = 53
234
ebx = 2
235
ecx = номер сокета
236
 
237
По возвращению, eax сохраняет число байтов в возвращённом буфере.
238
 
239
Чтение данных с сокета
240
----------------------
241
eax = 53
242
ebx = 3
243
ecx = число сокета
244
 
245
По возвращению, eax содержит число сохранённых байт, bl содержит байт данных.
246
 
247
Запись в сокет (Только UDP)
248
---------------------------
249
eax = 53
250
ebx = 4
251
ecx = число сокета
252
edx = число байтов для записи
253
esi = указатель на данные (в прикладном пространстве)
254
 
255
По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка.
256
 
257
Возвращение состояния сокета (Только TCP)
258
-----------------------------------------
259
eax = 53
260
ebx = 6
261
ecx = номер сокета
262
 
263
По возвращению, в eax содержится состояние TCP сокетов.
264
 
265
Эта функция может использоваться, чтобы определить, когда сокет фактически
266
соединился с другим сокетом. Вообще, данные не могут быть записаны в сокет,
267
пока подключение не установлено (TCB_ESTABLISHED). Состояния сокетов определены
268
в файле stack.inc, как TCB_
269
 
270
Запись в сокет (Только TCP)
271
---------------------------
272
eax = 53
273
ebx = 7
274
ecx = номер сокета
275
edx = число байт, нужных для записи
276
esi = указатель на данные (в прикладном пространстве)
277
 
278
По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка.
279
 
280
Проверка номера порта
281
---------------------
282
eax = 53
283
ebx = 9
284
ecx = номер порта
285
 
286
Эта функция используется, чтобы определить, используется ли номер порта какими
287
- либо сокетами. Локальный номер порта обычно уникален.
288
 
289
По возвращению, eax = - 1 для номера порта, который используется, иначе
290
возвращается 0.
291
 
292
 
293
Открытие TCP сокета в Колибри
294
=============================
295
 
296
Есть два способа открытия сокета - Пассивный или Активный.
297
 
298
При Пассивном подключении, приложение 'слушает' входящие запросы от удаленных
299
приложений. Обычно вы это делаете, осуществляя операцию клиент - сервер. Она
300
позволяет любому другому приложению соединяться с данным. Для этого нужно
301
определить 'известный' номер локального порта (80 для Веб-сервера), поставить
302
удаленный IP и удаленное номер порта равным 0(указывает, что любое удаленное
303
приложение может соединиться).
304
 
305
Как только сокет будет открыт, придётся ждать входящего подключения перед
306
выполнением чего - либо. Это может быть проверкой состояния разъема для
307
TCB_ESTABLISHED или ожиданием данных в получающемся буфере.
308
 
309
На Активном подключении вы соединяетесь с указанным удаленным портом. Удаленный
310
IP и удаленные параметры порта должны быть переведены в ненулевые значениями
311
(иначе, с чем соединятся?). Также, определите уникальный  номер локального
312
порта, так чтобы удаленное приложение могло найти нужную программу и установить
313
с ней соединение. Ведь, могут быть несколько программ на вашей машине,
314
подключенные к одному и тому же удалённому компьютеру.
315
Ниже написано, как найти уникальный номер порта.
316
 
317
Как находить неиспользованный номер локального порта
318
====================================================
319
 
320
Создавая активное подключение с удаленным сокетом, у вас может появиться
321
желание выбрать уникальный номер локального порта. Обычно, номера локального
322
порта начинаются с 1000. Следующий код может использоваться, чтобы получить
323
неиспользованный номер порта до создания сокета.
324
 
325
   mov    ecx, 1000         ; Определяем локальный порт, начинаем с 1000
326
 
327
getlp:
328
   inc    ecx
329
   push   ecx
330
   mov    eax, 53
331
   mov    ebx, 9
332
   int    0x40
333
   pop    ecx
334
   cmp    eax, 0            ; этот локальный порт используется?
335
   jz     getlp             ; да - продолжаем перебирать
336
 
337
   ; ecx содержит номер свободного локального порта
338
 
339
 
340
 
341
Запись данных в сокет
342
=====================
343
 
344
Есть две функции, зависящие от того, был ли разъем открыт для протокола TCP или
345
UDP. параметры запроса - то же самое как бы то ни было. Когда сокет открывается
346
для TCP, используйте функцию состояния, чтобы опросить для подключения - данные
347
не могут быть переданы сокету, пока другой не соединился с этим. Состояние
348
сокета - TCB_ESTABLISHED.
349
 
350
Когда вы посылаете данные, происходит создание и отправка одного IP пакета. А
351
это значит, что пользовательское приложение отвечает за размер передаваемых
352
пакетов. Сохраняется менее чем 768 байтов размера пакета. Если вы пишете
353
оконченную программу (такую, как telnet), то можете захотеть отправлять пакет
354
за каждое (неэффективное) нажатие клавиши. Можно использовать таймер, чтобы
355
отправлять данные периодически (скажем, каждую секунду).
356
 
357
Чтение данных из сокета
358
=======================
359
 
360
Есть одна функция для чтения данных из сокета, возвращающая данные в буфер. Эта
361
функция одновременно восстанавливает один байт. Вы можете использовать функцию
362
опроса, чтобы проверить получающийся буфер на данные.
363
 
364
Закрытие сокета
365
================
366
 
367
Просто вызовите соответствующую функцию (для TCP или UDP, соответственно).
368
Закрывая TCP сокет, не забудьте, что на другой конце соединения, сокет может
369
продолжить отправлять данные, так что он остаётся активным в течение нескольких
370
секунд после вашего запроса.
371
 
372
 
373
 
374
Если у вас есть вопросы или предложения по улучшению этого документа, то
375
пошлите мне письмо на mikeh@oceanfree.net.
376
Перевёл документ Hex.
377
Если есть вопросы или предложения по содержанию, то просьба написать мне на
378
mestack@yandex.ru или на наш форум: http://meos.sysbin.com