О. С. Попова Хіхловська І. В. Системне та прикладне програмне забезпечення у телекомунікаціях Конспект

Вид материалаКонспект
Чтение длины записи
Проверка того, поместится ли в буфер запись
Считывание записи
Функции разрешения имён
Подобный материал:
1   ...   4   5   6   7   8   9   10   11   ...   14

Чтение длины записи




Длина записи считывается в переменную reclen. Функция readvrec возвращает 0(конец файла), если число байтов, прочитанных readn не точно совпадает с размером целого или –1 в случае ошибки.

Размер записи преобразуется из сетевого порядка в машинный.

Проверка того, поместится ли в буфер запись



Проверка того, поместится ли в буфер запись, достаточна ли длина буфера, предоставленного вызывающей программой, для размещения в ней записи. Если места недостаточно, то данные считываются в буфер частями по len байт, то есть по сути отбрасываются. Изъяв из потока отбрасываемые данные, функция присваивает переменной errno значение EMSGSIZE и возвращает –1.

Считывание записи



Считывается сама запись, readvrec возвращает –1,0 или reclen в зависимости от того, вернула ли readn код ошибки, неполный счётчик или нормальное значение.


Функция strlen


Функция strlen возвращает длину строки sl(число символов в строке sl до нулевого символа в строке, обозначающего её конец).


Функции ntohe и ntohs


Преобразуют целое число из сетевого порядка в машинный. В современных компьютерах целые числа хранятся по-разному в зависимости от архитектуры процессора.

Например, число $12345678 может храниться в памяти:
  1. big endian(Motorola)тупоконечные 12 34 56 78
  2. little endian(INTEL)остроконечные 78563412


Терминология введена Коэном в 1981г.

Определить формат, применяемый в конкретной машине, можно с помощью следующей программы:
  1. #include
  2. #include
  3. #include”etcp.h”
  4. int main(void)
  5. {
  6. u_int32_t x=0x12345678;/*305419896*/
  7. unsigned char xp=(char)&x;
  8. printf(“%0x%0x%0x%0x)n”;
  9. xp[0],xp[1],xp[2],xp[3];
  10. exit(0);
  11. }


Формат хранения байтов важен, так как машины с разным принципом хранения часто общаются друг с другом по протоколам TCP/IP. Такая информация, как адреса отправления и назначения, номера портов, длина дейтограмм, размеры окон, представляются в виде целых чисел, необходимо их одинаково интерпретировать.

Чтобы обеспечить взаимодействие компьютеров с разными архитектурами, величины, относящиеся к протоколам, передаются в сетевом порядке, который по определению является тупоконечным. Сетевые адреса, номера портов, другие данные, представленные в заголовках, задаются программистом, и их нужно преобразовывать в сетевой порядок.

Функции htone и htons возвращают 32 и 16-разрядные числа в сетевом порядке. Функции ntone и ntons возвращают целое число в машинном порядке. На любой машине эти функции следует применять всегда, остальное делает система.


#include

u
В сетевой
int32_t htone(uint32_t host32);

uint16_t htons(uint16_t host16);


u
В машинный
int32_t ntohe(uint32_tnetwork32);

uint16_t ntohs(uint16_t network16)

Функции разрешения имён



Gethostbyname и getservbyname

Преобразование имён хостов

Эти функции возвращают значение, представленные в сетевом порядке. Фрагмент программы:

Struct servent*sp;

Struct sockaddr_in*sap;

Sp=getservbyname(name,protocol);

Sap->sin_port=htons(sp->ss_port);

Приведёт к ошибке, если исполняется не на тупоконечной машине.


Аккуратное размыкание соединение

В работе TCP – соединения есть три фазы:
  1. Установление соединения
  2. Передача данных
  3. Разрыв соединения



Так как TCP –соединения полудуплексные, потоки данных в разных направлениях не зависят друг от друга.

Например, клиент может соединиться с сервером, отправить серию запросов и закрыть свою половину соединения, предоставив серверу информацию о том, что больше запросов не будет. Сервер может продолжать посылать данные после того, как клиент прекратил отправлять запросы.

С другой стороны сервер может посылать в ответ сколько угодно данных, и клиент не знает заранее, когда ответ закончится, и тогда сервер закроет свой конец соединения, сигнализируя о конце передачи. После закрытия сервером своего конца соединения, TCP завершает фазу разрыва, чем сообщает клиенту о прекращении передачи данных.


Вызов shutdown


Используется как вызов close, но при этом передаётся дополнительный параметр, означающий, какую сторону закрыть.

#include

#int shutdown(int s,int how)

Возвращаемые значения:0-нормально, 1-ошибка.

How=0-закрывается принимающая сторона соединения. В UNIX все полученные после выполнения данные уничтожаются.

How=1-закрывается отправляющая сторона соединения. В сокете делается отметка, что данные посылаться больше не будут.

How=2-закрываются обе стороны соединения.

При выполнении shutdown не закрывает сокет по настоящему, так как ресурсы не освобождаются.


Алгоритм Найгла


Алгоритм Найгла предложен в 1984г. и влияет на стратегию отправки TCP-регулирует количество передаваемых по сети данных, достигая наиболее эффективного использования полосы пропускания. TCP посылает данные блоками, размер которых равен MSS-максимальный размер сегмента. При установлении соединения TCP может указать максимальный размер сегмента(MSS), но не больше, чем разрешено окном передачи. Для того, чтобы избежать перегрузки сети и затора (при превышении памяти маршрутизатора дейтограммы отбрасываются), а повторные передачи ещё больше загрузят сеть, используют два окна – окно передачи и окно перегрузки. Окно передачи, объявляемое TCP на клиентской стороне, предохраняет от переполнения его буферов. Окно перегрузки на серверной стороне не даёт превысить пропускную способность сети. Если ограничить объём передачи минимальным из этих окон, то оба требования управления потоком будут удовлетворены. Это алгоритм –медленный старт. Второй алгоритм –Найгла -требует, чтобы в TCP не было более одного неподтверждённого маленького сегмента менее MSS. Цель алгоритма Найгла - не дать TCP последовательностью мелких сегментов, а сохраняет в своих буферах небольшие блоки данных, пока не получит подтверждение на предыдущий маленький сегмент. При каждом вызове процедуры вывода TCP вычисляет объём данных, которые можно послать. Это минимальное значение количества данных в буфере передачи, размера окон передачи и перегрузки и MSS. Данные отправляются при выполнении хотя бы одного из следующих условий:
  1. можно послать полный сегмент размером MSS
  2. соединение простаивает и можно освободить буфер передачи
  3. алгоритм Найгла отключён и можно опустошить буфер передачи
  4. есть срочные данные для отправки
  5. есть маленький сегмент, но его отправка уже задержана на длительный срок
  6. окно приёма, объявленное на приёмной стороне открыть не менее чем наполовину
  7. необходимо повторно передать сегмент
  8. требуется послать ACK на принятые данные



Алгоритм Найгла нужно иметь возможность отключить, так как он уменьшает производительность const int on=1;

Setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&on,sizeof(on));