TCP

**TCP (Transmissiya İdarəetmə Protokolu) -** etibarsız bir şəbəkə üzərində, etibarlı end-to-end bayt axınını təmin etmək üçün nəzərdə tutulmuşdur. Bir internet şəbəkəsi başqa bir şəbəkədən fərqlənir, çünki müxtəlif hissələr müxtəlif növ topologiyalara, bant genişliklərinə, gecikmələrə, paket ölçülərinə və digər parametrlərə malik ola bilər. TCP, şəbəkənin xüsusiyyətlərinə dinamik şəkildə uyğundur və bir çox növ uğursuzluq qarşısında sağlam olmaq üçün nəzərdə tutulmuşdur.

UDP sadə bir protokoldur və müştərilərin qarşılıqlı təsirləri və multimediya kimi çox əhəmiyyətli istifadələrə malikdir, lakin əksər internet proqramları üçün etibarlı, ardıcıl çatdırılma tələb olunur. UDP bunu təmin edə bilməz, buna başqa bir protokol tələb olunur. Bu TCP adlanır və internetin əsas işçi protokollarndandır. İndi buna ətraflı nəzər yetirək.

## TCP ilə tanışlıq
TCP 1981-ci ilin sentyabrında -də rəsmən müəyyənləşdirilmişdir. Bu müddət ərzində bir çox səhvlər aşkarlanmış və düzəlişlər edilmişdir.

TCP'yi dəstəkləyən hər bir maşın bir TCP nəqliyyat obyektinə, ya kitabxana prosedurasına, istifadəçi prosesinə və ya ən çox qismən kernelin bir hissəsinə malikdir. Bütün hallarda, TCP axınlarını və IP qatının interfeysləri idarə edir. TCP bir istifadəçi kimi, yerli proseslərdən istifadəçilərin məlumat axını qəbul edir, onları 64 KB'yi (praktikada, IP və TCP başlıqları ilə bir Ethernet kadrına uyğun olmaq üçün tez-tez 1460 məlumat baytını) aşmayan parçaları ayırır və hər bir parçanı ayrı IP datagramı kimi göndərir. TCP məlumatlarını ehtiva edən datagramlar bir maşına çatdıqda, orijinal bayt axınlarını yenidən quran TCP obyektinə verilir. Sadəlik üçün, bəzən TCP nəqliyyat vahidini (proqram parçası) və ya TCP protokolunu (bir sıra qaydalar) nəzərdə tutmaq üçün yalnız 'TCP'dən istifadə edirik.

IP qatı, nə datagramların düzgün təslim ediləcəyinə və nə də ki, bunların nə qədər sürətli göndəriləcəyinə heç bir zəmanət vermir. TCP, imkanlardan tam olaraq istifadə etmək üçün kifayət qədər sürətli datagramları göndərə bilir, lakin yığılmalara səbəb olmur və çatdırılmayan hər hansı bir datagramı vaxtında həyata keçirmək və yenidən ötürmək üçündür. Qısacası, TCP ən çox tətbiqin istədiyi və İP təmin etmədiyi etibarlılığı ilə yaxşı performans göstərməli olan protokoldur.

## TCP servis modeli
TCP xidməti həm göndəriciyə, həm də alıcıya xidmətini müəyyən edən servisi soket adlanır. Hər bir yuvada ev sahibinin IP ünvanından ibarət olan bir yuva sayı (ünvanı) və bu portun adına verilən 16 bitlik bir nömrə vardır. Bir liman TSAP üçün TCP adıdır. TCP xidmətinin alınması üçün, bir maşın bir yuva və başqa bir maşın üzərində bir yuva arasında bir əlaqə müəyyən edilməlidir. Soket adlandırmaları sağdakı şəkildə verilmişdir.

Bir soket birdən çox əlaqəyə eyni zamanda istifadə edilə bilər. Başqa sözlə, iki və ya daha çox əlaqənin eyni soketdə fasilə verə bilər. Bağlantılar hər iki ucunda socket identifikatorları tərəfindən müəyyən edilir, yəni (socket1, socket2). Virtual qurğu nömrələri və ya digər identifikatorlar istifadə edilmir.

1024-dən aşağı olan port nömrələri, adətən yalnız imtiyazlı istifadəçilər (məsələn, UNIX sistemlərində root) tərəfindən başlana bilən standart xidmətlər üçün qorunur. Bunlara tanınmış portlar deyilir. Misal üçün, bir hostdan uzaqdan poçt ala bilən hər hansı bir əməliyyat, IMAP daemonuna müraciət etmək üçün təyinatçının 143 nöqtəsinə bağlana bilər. Tanınmış portlarım siyahısı www.iana.org saytında verilmişdir. 700-dən çox adam təyin edilib. Daha yaxşı bilinənlərdən bir neçəsi cədvəldə verilmişdir.

1024-dən 49151-dək olan digər portlar IANA-nın qeydiyyatdan keçməmiş istifadəçilər tərəfindən istifadəsi oluna bilər, lakin proqramlar öz portlarını seçə və istifadə edə bilərlər. Məsələn, BitTorrent peer-to-peer fayl paylaşma proqramı (qeyri-rəsmi) 6881–6887 nöqtələrini istifadə edir, lakin digər portlarda da işləyə bilər.

Əlbəttə, FTP daemonunu 21 nöqtəsinə boot yerinin özünə yerləşdirmək mümkün olardı, SSH daemonu özünü yükləmə zamanında 22 nöqtəsinə yerləşdirdi və s. Bununla belə, bu, yaddaşın əksəriyyətində boş olan daemonlarla yadda qaldı. Bunun əvəzində, UNIX-də inetd (Internet daemon) adlanan tək bir daemonun olması, özünü birdən çox porta yerləşdirmək və ilk gələn əlaqəni gözləməkdir. Bu meydana gəldikdə, inetd yeni bir prosesdən götürülür və daemonun istəklərini həll etməyə imkan verən müvafiq işləmə yerinə yetirir. Bu yolla, inetd xaricindəki daemonlar yalnız işləmək üçün iş olduqda aktiv olurlar. Inetd bir konfiqurasiya faylından istifadə etmək üçün olan portları öyrənir. Nəticədə, sistem administratoru işləməyən portlarda (məs., port 80) daimi daemonlara malik olmaq üçün sistemin qurulmasını və qalan hissəsini inetd edə bilər.

Bütün TCP əlaqələri tam dubleks və ya nöqtədən-nöqtəyə formasıdadır. Tam dubleks, trafikin eyni zamanda hər iki istiqamətdə gedə biləcəyini bildirir. Point-to-point deməkdir ki, hər bir əlaqənin dəqiq iki sonu var. TCP, multicasting və ya genişyayımı dəstəkləmir.

TCP bağlantısı bir mesaj axını deyil, bayt axınıdır. Mesaj sərhədləri əvvəldən sona qorunmayacaqdır. Məsələn, göndərmə prosesi dörd 512 bayt TCP axına yazırsa, bu məlumatların alınması prosesini dörd 512 baytlıq fraqment, iki 1024 baytlık bir parça, bir 2048 bayt yığın kimi və ya başqa bir şəkildə edə bilər. Qəbul edənin məlumatların necə yazıldığını aşkar etməsi üçün heç bir yol yoxdur.

UNIX-də fayllar da bu imkana malikdir. Faylın oxucusu faylının bir anda bir blok, bir anda bir bayt və ya bir zərbədə göndərilmiş olub-olmadığını bilmir. Bir UNIX faylında olduğu kimi, TCP proqramı, baytların nə demək olduğunu bilməyəcəkdir və heç bunu bilməyə marağı da yoxdur. Bir bayt yalnız bir baytdır.

İnternet arxeoloqları üçün TCP xidmətinin nadir hallarda istifadə edildiyi bir maraqlı xüsusiyyəti də qeyd edəcəyik: təcili məlumatlar. Bir tətbiq dərhal emal edilməli olan yüksək prioritet məlumatlara malik olduqda, məsələn, interaktiv istifadəçi artıq başlayan bir uzaq hesablamanı qırmaq üçün CTRL-C düyməsinə çarpdıqda, göndərmə tətbiqi məlumat axınındakı bəzi nəzarət məlumatlarını və TCP-yə URGENT bayrağı ilə birlikdə verilir. Bu hadisə TCP-yə məlumatların yığılmasını dayandırmağa və dərhal bu bayrağa malik olan hər şeyi ötürməyə səbəb olur.

## TCP Protokolu
Bu bölmədə TCP protokoluna ümumi bir baxış verəcəyik.

TCP'nin əsas xüsusiyyətlərindən biri hansıkı protokol dizaynına hakimdir, bir TCP bağlantısının hər baytının öz 32-bitlik sıra nömrəsi olmasıdır. İnternet ilk başladıqda, marşrutlaşdırıcılar arasında xətlər əsasən 56 kbit/s həcmində icarəyə verilmiş xətt idi, beləliklə, tam sürətldə host partlayırdı, bir ev sahibi ardıcıl nömrələrə keçmək üçün 1 həftə vaxt lazım idi. Müasir şəbəkə sürətində, ardıcıl nömrələr daha sonra görəcəksiniz ki, həyəcan verici dərəcədə istehlak edilə bilər. Ayrı 32 bitlik sıra nömrələri sürüşmə pəncərəsi mövqeyi üçün bir istiqamətdə və aşağıda müzakirə edilən tərs istiqamətdə bildirişlər üçün paketlərdə aparılır.

Göndərən və qəbul edən TCP şəxsləri məlumatları seqmentlər şəklində mübadilə edir. TCP seqmenti sabit 20 byte başlıqlı (plus optional hissəsi) və əlavə olaraq sıfır və ya daha çox məlumat baytından ibarətdir. TCP proqramı, böyük seqmentlərin necə olacağına qərar verir. Bir neçə yazıdan məlumatları bir seqmentə toplaya bilər və ya birdən çox seqment üzərində bir yazıdan məlumatları bölüşə bilər. İki limit seqment ölçüsünü məhdudlaşdırır. Birincisi, TCP başlığı daxil olmaqla, hər seqment 65,515 baytlıq IP yüklənməsinə uyğun olmalıdır. İkincisi, hər bir linkdə bir MTU (Maksimum Transfer Vahidi) var. Hər bir seqment göndərici və qəbuledən MTU-yə uyğun olmalıdır, belə ki, vahid, asudə bir paketdə göndərilə və qəbul edilə bilər. Praktikada, MTU ümumiyyətlə 1500 bayt (Ethernet Payload ölçüsü) olur və beləliklə, seqment ölçüsü üzərində üst sərhəd müəyyən edir.

TCP şəxsləri tərəfindən istifadə edilən əsas protokolu dinamik pəncərə ölçüsü olan sürüşməli pəncərə protokudur. Bir göndərən bir seqmenti ötürdükdə, bu taymeri başladır. Segment təyinat yerinə gəldikdə, qəbul edən TCP şəxsiyyəti qəbul edilən növbəti sıra nömrəsinə və qalan pəncərənin ölçüsünə bərabər bir təsdiqi nömrəsini daşıyaraq bir seqmenti (mövcud olduqda və ya olmadan) geri göndərir. Təqdimat qəbul edilməzdən əvvəl göndərilən şəxsin timeri sönürsə, göndərən seqmenti yenidən ötürür.

Bu protokol bir az sadə səslənir, baxmayaraq ki, bəzən incə girişlər və çıxışlar var, hansı ki, biz aşağıda göstərəcəyik. Segments sıradan çıxa bilər, buna görə baytlar 3072–4095 gəlib çatacaq, lakin 2048–3071 baytları hələ açılmamışdır. Seqmentlər də tranzitdə göndəricinin vaxtını uzatdıqları üçün, reallaşdırdığı müddətdə gecikdirilə bilər. Yenidən ötürülmələr müxtəlif bayt aralıqlarını orijinal ötürülmələrdən əlavə ola bilər, hansı baytların bu günə qədər düzgün qəbul edildiyini izləmək üçün ehtiyatlı bir idarəetməni tələb edir. Lakin, axındakı hər bir baytın özünəməxsus offset olması səbəbindən, bunları etmək mümkündür.

TCP bu problemlərlə məşğul olmaq və onları effektiv həll etmək üçün hazır olmalıdır. Hətta şəbəkə problemləri qarşısında olsa da, TCP öz axınlarının performansını optimallaşdırmaq üçün böyük miqdarda səy göstərmişdir.

## TCP Seqment başlığı
Şəkildə bir TCP seqmentinin sxemi göstərilir. Hər seqment sabit formatda, 20 baytlıq başlıqla başlayır. Sabit başlıq üstbilgi seçimləri ilə izlənilə bilər. Seçimlərdən sonra, əgər varsa, 65.535–20 — 20 = 65.495 məlumat baytı, ilk 20 IP başlığına və ikincisi isə TCP başlığına müraciət edə bilər. Hər hansı bir məlumatsız seqmentlər qanuni və ümumi olaraq etiraf və nəzarət mesajları üçün istifadə olunur. Gəlin TCP başlığı alanını sahələrə ayıraq. Mənbə portu və Hədəf port sahələri əlaqənin yerli və son nöqtələrini müəyyən edir. Bir TCP portu və hostun IP ünvanı 48 bitlik unikal bitmə nöqtəsini təşkil edir. Mənbə və təyinat nöqtəsi birlikdə göndərən və qəbul edən arasında əlaqəni müəyyənləşdirir. Bu əlaqə identifikatoruna beş ədəd məlumat daxildir: protokol (TCP), mənbə IP, mənbə portu və təyinatlı IP, təyinat portu.

Sequence sayı və Təsdiq sayı sahələri öz adi funksiyalarını yerinə yetirir. Qeyd edək ki, sonuncu byte düzgün qəbul olunmayan deyil, gözlənilən növbəti sıraya aiddir. Alınan məlumatları bir nömrə ilə yekunlaşdırdığından, bu bir məcmu etirafdır. Bu itirilmiş məlumatlardan kənara çıxmır. Hər bir 32 bit bir TCP axınında saylıdır, çünki hər ikisi 32 bitdir.

TCP başlıq uzunluğu, TCP başlığında neçə 32 bit sözlərin olduğunu bildirir. Seçimlər sahəsi dəyişən uzunluq olduğundan bu məlumat tələb olunur, buna görə bu başlıq da var. Texniki cəhətdən, bu sahə həqiqətən 32 bit sözlərlə ölçülən seqment daxilində məlumatların başlanmasını göstərir, lakin bu rəqəm yalnız sözlərin başlıq uzunluğudur, buna görə də təsir eynidır.

Bundan sonra istifadə edilməyən 4-bitlik bir sahə gəlir. Bu bitlərin 30 il ərzində istifadəyə verilməməsi (yalnız orijinal qorunan 6 bitin yalnız 2-si) TCP-nin necə yaxşı düşünülmüş olduğuna dair şəhadətdir. Kiçik protokollar bu bitləri orijinal dizayndakı xətaları düzəltmək üçün lazım ola bilərdi.

İndi səkkiz ədəd 1-bit bayraqları gəlin aydınlaşdıraq. CWR və ECE, -də göstərildiyi kimi ECN (Aşkar Tıxanma Bildirimi) istifadə edildikdə sıxışdırmaq üçün istifadə edilir. ECE, TCP qəbuledicisi bir tıxanıqlığ aldıqda yavaşlamaq üçün bir TCP göndərənə, şəbəkə göstəricisi bir ECN-Echo'yu siqnalı təyin edir. CWR, TCP göndərəndən TCP alıcısına qədər azaldıqda, göndəricinin yavaşladığını bilir və ECN-Echo göndərilməsini dayandıra bilər.

Təcili göstərici istifadə edildikdə URG bayrağı 1-ə bərabərdir. Təcili göstərici, təcili məlumatların tapılacağı cari sıra nömrəsindən bir baytın ofsetini göstərmək üçün istifadə olunur. Bu tezis kəsilmə mesajlarının əvəzinədir. Yuxarıda qeyd etdiyimiz kimi, bu qurğu TCP-nin özünü kəsilməyə səbəb olmadan, qəbul etmədən qəbulediciyə siqnal verməsinə imkan verən açıq üsuludur, lakin nadir hallarda istifadə olunur.

ACK biti Təsdiq(Acknowledgement) nömrəsi düzgün olduğunu göstərmək üçün 1 olaraq təyin edilir. Bu demək olar ki, bütün paketlər üçündür. ACK 0 olduqda, seqmentdə bir etiraf yoxdur, belə ki, Acknowledgement sayı sahəsi nəzərə alınmır.

PSH biti PUSHed məlumatları göstərir. Alıcı, məlumatı girişə çatdıqdan sonra təqdim etməyi xahiş edir və tam bir tampon qəbul edildikdən sonra (bu səmərəliliyi təmin etmək üçün başqa bir şey edə bilməyincə) tamponlaşdırmır.

RST biti, ev sahibi qəzası və ya başqa bir səbəbdən qarışdıran bir əlaqəni ani şəkildə sıfırlamaq üçün istifadə olunur. Bu, yanlış seqmenti rədd etmək və ya əlaqə yaratmaq cəhdindən imtina etmək üçün istifadə olunur. Ümumiyyətlə, RST bit ilə seqmenti əldə etsəniz, demək ki, əlinizdə problem var.

SYN biti əlaqələri yaratmaq üçün istifadə olunur. Bağlantı sorğusu SYN = 1 və ACK = 0, piggyback bildiriş sahəsinin istifadə edilmədiyini göstərmək üçün var. Bağlantıya cavab verilir, lakin bununla da SYN = 1 və ACK = 1 olur. Əslində, SYN biti həm də bu iki imkanı arasında ayırmaq üçün istifadə edilən ACK biti ilə qəbul edilən ƏLAQƏ MÜRACİƏTİ və ƏLAQƏ BAĞLANMAĞI-nı göstərmək üçün istifadə olunur.

FIN biti əlaqəni azad etmək üçün istifadə olunur. Göndərənin ötürmənin daha çox məlumatı olmadığını bildirir. Lakin, əlaqəni bağladıqdan sonra bağlanma prosesi müddətsiz məlumatları davam etdirə bilər. Həm SYN, həm də FIN seqmentləri ardıcıl nömrələrə malikdir və beləliklə düzgün qaydada emal edilməsinə zəmanət verilir.

## TCP əlaqəsinin qurulması
Əlaqələr TCP-də üç tərəfdən müzakirə edilir. Bir əlaqə yaratmaq üçün, bir tərəfdən, server, LISTEN və ACCEPT primitivləri bu qaydada icra etməklə, ya xüsusi bir qayda və ya xüsusilə heç kimin göstərilməməsi ilə daxil olan bir əlaqə üçün passiv olaraq gözləyir.

Digər tərəfdən, müştəri, bağlamaq istədiyi IP ünvanını və portunu, qəbul etmək istəyən maksimum TCP seqmentinin ölçüsünü və istəyə bağlı olaraq bəzi istifadəçi məlumatlarını (məsələn, bir parol) müəyyənləşdirən CONNECT primitivini icra edir. CONNECT primitivi SYN bit və ACK biti ilə bir TCP seqmenti göndərir və bir cavab gözləyir.

Bu seqment hədəfinə çatdıqda, orada olan TCP varlığı, Hədəf port sahəsindəki portda LİSTEN yapan bir prosesin olmadığını yoxlayır. Əgər yoxsa, bu əlaqəni rədd etmək üçün RST bit ilə cavab göndərir.

Proseslər porta qulaq asırsa, bu proses gələn TCP seqmentinə verilir. Bu əlaqəni qəbul edə və ya rədd edə bilər. Qəbul edərsə, bir təsdiq seqmenti geri göndərilir. Normal vəziyyətdə göndərilən TCP seqmentlərinin ardıcıllığı sağda şəkildə göstərilir. Bir SYN seqmentinin 1 baytlıq ardıcıllıq sahəsini istehlak etməsi üçün birmənalı olaraq qəbul edilə bilər.

Eyni iki soket arasında eyni zamanda iki hostun eyni vaxtda əlaqəsi qurulmağa çalışması halında hadisələrin ardıcıllığı şəkil (b) -də göstərilmişdir. Bu hadisələrin nəticəsi ondan ibarətdir ki, əlaqələr son nöqtələrlə müəyyən edilir. Birinci qurma (x, y) və ikincisi ilə müəyyənləşdirilmiş əlaqələ nəticələnirsə, yalnız (x, y) üçün yalnız bir cədvəl girişi edilir.

Bununla birlikdə, üç yol ilə bağlanmanın zəifliyi, dinləmə prosesinin öz SYN seqmenti ilə tezliklə cavab verəcəyi sırada sıralanma nömrəsini yadda saxlamaqdır. Yəni, zərərli bir göndərən, bir SYN seqmentinin bir axını göndərərək və birləşməni tamamlamamaqla heç bir zaman keçmədən bir ana tərəfdə resursları bağlaya bilər. Bu hücum SYN daşqını adlanır və 1990-cı illərdə bir çox web serverinə zərər vermişdir.