Седьмая встреча SC{2}




 Введение в программирование
     компьютерных сетей

     Анатолий Свириденков
             Codedgers




         Март 2013
Два типа связи

Сети:

●   телекоммуникационные сети;
●   компьютерные сети.

Коммутация:

●   канальная коммутация;
●   пакетная коммутация.
Канальная коммутация
●   Элементарный канал – T1 ~ 2Mb;

●   Составной канал – T3;

●   Кратность каналов;

●   Алло девушка? “Рубин” срочно!
Пакетная коммутация
●   Заголовок, тело, хвост;

●   Буферизация;

●   Сохранение с продвижением.
Методы продвижения пакетов
●   Дейтаграмма;

●   Логическое соединение;

●   Виртуальный канал.
В чем сила, брат?
Дейтограммы (udp)
●   Нет соединений;

●   Не гарантируется порядок;

●   Доставка не гарантируется.
Логическое соединение (TCP)
●   Установление и разрыв соединения;

●   Тройное рукопожатие;

●   “Гарантия” доставки.
Виртуальный канал (тоннель)
●   Разный носитель (tcp, udp, http);

●   Base 64;

●   Возможно шифрование;

●   XXX over YYY.
Взгляд со стороны
           разработчика
●   Беркли API или блокирующий режим
    работы сокетов;

●   BSD-like или не блокирующий режим
    работы сокетов;

●   Асинхронный режим работы.
Berkeley API
●   Выпущены в 1983-м году;

●   4.2BSD Unix;
Cокеты
int socket(int domain, int type, int protocol);

domain:
 ● PF_INET – IPv4;
 ● PF_INET6 - IPv6;
 ● PF_UNIX – файлы в unix.

type:
 ● SOCK_STREAM - TCP;
 ● SOCK_DGRAM – UDP;
 ● SOCK_RAW – IP.

protocol:
 ● IPPROTO_TCP;
 ● IPPROTO_UDP;
 ● и т.д., например - IPPROTO_DCCP.
Получение IP по имени
           (DNS запрос)
●   hostent *gethostbyname(const char *name);

●   Иерархические запросы;

●   Кеширование.
http://www.root-servers.org/
Установление связи
●   int connect(int sockfd, const sockaddr *serv_addr,
    socklen_t addrlen);

●   int bind(int sockfd, const sockaddr *my_addr,
    socklen_t addrlen);

●   int listen(int sockfd, int backlog);

●   shutdown(int sockfd, int flag);

●   close(int sockfd);
Передача данных
●   send
●   recv
●   sendto
●   recvfrom
●   sendmsg
●   recvmsg
Прием входящих соединений
int accept(int sockfd, sockaddr *cliaddr, socklen_t *addrlen);

while(true)
{
  HANDLE newSocket = accept( sock, 0, 0 );
  ProduceSocket(newSocket);
}
BSD-like сокеты
int select(
  _In_ int nfds,
  _Inout_ fd_set *readfds,
  _Inout_ fd_set *writefds,
  _Inout_ fd_set *exceptfds,
  _In_ const struct timeval *timeout
);
Асинхронные сокеты
●   WSAXXXX функции;

●   boost::asio.
Вопросы?

7 встреча — Программирование компьютерных сетей (А. Свириденков)