TCP протокол от фамилията TCP

1. TCP протокол от семейството TCP/IP

2. Портове и гнезда

Приложение, което използва TCP (или UDP), се идентифицира уникално с номер, наречен номер на порт. По принцип номерата на портовете могат да бъдат избрани произволно, но за да се улесни комуникацията между различни реализации на TCP софтуер, са приети конвенции относно номерата на портове, присвоени на определени услуги. По принцип портове между 0 и 255 се присвояват на системни процеси, докато портове над 255 се присвояват на потребителски процеси. В Интернет портовете се управляват от Internet Assigned Numbers Authority (IANA). Списък с номера на портове за интернет услуги може да бъде намерен в съответния RFC. Извадки от него са дадени в таблицата. Портове 0 и 255 са запазени.

4. TCP сегменти от данни

5. TCP връзка

TCP комуникацията се управлява от множество правила. Процедурите за установяване на връзка, прехвърляне на полезна информация и прекъсване на връзка обикновено се представят от държавни машини. (TCP е управляван от състоянието протокол и следователно неговите операции зависят от състоянията на флагове или подобни структури). Вместо това ще използвам прости комуникационни схеми. Има две опции за установяване на връзки: действителната връзка и приемането на връзката. Преди да започнете връзка, трябва да инициализирате и стартирате WSA - Windows Socket Architecture. Нека изпълним функцията 1 за това. WSAStartup (wVersionRequested, lpWSAData): Цяло число;

където: wVersionRequested е номерът на необходимата версия за стартиране на приложението. В нашия случай този параметър трябва да бъде равен на $0101. lpWSAData - структура, вкоито WSA сокетът връща: номер на версията, описание, статус, максимален брой сокети на сокета, информация за разработчиците и т.н. Тази структура няма значение за нас. Дешифрирането на тези кодове е във файла sock.hlp, включен в дистрибуцията на Delphi.

Опция "Свързване" Преди да свържете конектори, гнезда, трябва да създадете функция за гнездо на конектор 2. Сокет (af, тип, протокол) : Цяло число;

където: Sock - резултатът от изпълнение на функцията Socket. Buf - буферът, където ще отидат получените данни. BufSize - размерът на буфера. Flags - флагове. Може да е MSG_PEEK или MSG_OOB. Задайте това поле на 0. Ако не е възникнала грешка, се връща броят на получените байтове, ако връзката е затворена правилно - 0, в противен случай, в случай на прекъсване, се връща отрицателно число. 5. Изпращане (Sock, Buf, BufSize, Flags) : Цяло число;

където: Sock - резултатът от изпълнение на функцията Socket. Buf - буфер от данни за изпращане. BufSize - размер на буфера. Flags - флагове. Равно е на 0. Ако не е възникнала грешка, се връща броят на получените байтове, ако връзката е затворена правилно - 0, в противен случай, в случай на прекъсване, се връща отрицателно число. За да прекратите връзката, използвайте функцията 6. CloseSocket( Sock ): Цяло число;

където: Sock е резултатът от изпълнението на функцията Socket. Ако не са възникнали грешки, се връща 0, в противен случай SOCKET_ERROR.

където: Sock - резултатът от изпълнението на функцията Socket. Backlog - максималният размер на опашката от чакащи връзки. Ако не са възникнали грешки, се връща 0, в противен случай - SOCKET_ERROR. Тази функция настройва сокета в режим на слушане на канала. 9.Accept(Sock, SA, SASize): Цяло число;

където: Sock е резултатът от изпълнението на функцията Socket. SA е структурата TSockAddrIn, която попълнихме. SASize е размерът на SA. Ако SOCKET_ERROR се върне в резултат на Accept'a, тогава функцията е изпълнена неправилно. ( вижте Пример ) В противен случай се връща 0. След като връзката е установена, можете да използвате функциите за получаване и препращане на данни, като recv, send. Функцията приключва при установяване на връзката.

След свързване След свързване можете да започнете да обменяте информация, като използвате горните функции за получаване и изпращане. Можете също така да добавите, че гнездата се класифицират като блокиращи и неблокиращи. Първите изчакват края на операцията, вторите не го правят. За да настроите сокетите на сокетите в неблокиращо състояние, използвайте функцията: ioctlsocket( Sock, CMD, Value) : Integer;

където: Sock - резултатът от изпълнението на функцията Socket. CMD - командата за управление на сокета на сокета (в нашия случай константата на FIONBIO). Стойност - нейната стойност 0 - включено, 1 - изключено. Ако не възникнат грешки, се връща 0, в противен случай - SOCKET_ERROR. Когато работите директно със сокет конектори, не винаги ще получавате точния брой байтове, които сте изпратили на приемника, и трябва да "четете" байтовете от сокет конектора след известно време. Това се обяснява с принципа на организиране на стрийминг сокети, които в този случай се възприемат като файлове. Можете обаче да деактивирате алгоритъма NAGLE, който контролира разделянето на съобщенията в дейтаграми със следната функция: setsockopt( Sock, Level, Parameter, PChar( Value), ValueSize) : Integer;