През по-ранните години на интернет Интернет протоколът (IP) беше единственият протокол, който хората използваха за свързване с интернет. Проблемът с IP беше, че можете да изпратите съобщение и да не сте сигурни дали получателят ще го получи или не. Поради тази причина беше създаден TCP/IP.
TCP/IP гарантира, че всички данни, които изпращате, достигат до техния получател. Той прави това, като осигурява на клиента и сървъра сигурна връзка, преди да изпрати данни. Тази сигурна връзка се установява чрез процес, известен като тристранно ръкостискане, известен също като TCP/IP ръкостискане.
Какво е тристранно ръкостискане?
Тристранното ръкостискане (TCP/IP ръкостискане) е първите три взаимодействия между клиент и сървър, които се опитват да установят TCP връзка. Тези първоначални взаимодействия са от съществено значение за създаването на сигурна връзка. На тази фаза и клиентът, и сървърът ще се споразумеят за параметрите, които ще използват за проверка и проверка на входящи и изходящи пакети данни. Тези параметри ще бъдат под формата на TCP сегменти.
Какво е TCP сегмент?
При TCP/IP връзка всички изпращани данни трябва да бъдат изрязани и структурирани на така наречените TCP сегменти. Тези сегменти съдържат информация като IP адреси, портове, битове на флага, последователни номера, номера на потвърждение и незадължителните данни или полезен товар.
Първите три взаимодействия (трипосочно ръкостискане) ще съдържат само заглавки на TCP сегмент без полезен товар или прикачени данни. Ето извадка от TCP сегмент
Имайте предвид, че илюстрацията по-горе е само за TCP. Пълният TCP/IP сегмент изисква и двете IP адреси от подателя и получателя отгоре на TCP сегмента по-горе.
Всеки път, когато изпращате пакет на лице, службата за доставка трябва да попълни формуляр за информация и след това да го прикачите към пратката преди изпращане. По подобен начин TCP изисква от подателя да прикачи сегментна глава (информационен формуляр) към данните (пакета), преди да започне да изпраща сегмента (колета) до получателя.
Всеки път, когато клиент комуникира със сървър, и двете страни ще трябва да форматират своите взаимодействия под формата на TCP сегмент. TCP сегментът включва глава на TCP сегмент, прикрепена към данните, които се опитвате да изпратите. Подателят ще трябва да попълни информацията, която се изисква от главата на сегмента.
За тристранно ръкостискане подателят ще трябва да попълни следното:
- Изходен порт: Идентифицира порта на подателя
- Пристанище на дестинацията: Идентифицира порта на приемника
- Пореден номер: Указва последователността на сегментите
- Номер на потвърждение: Означава, че сегментът е бил потвърден чрез добавяне на един към дадения пореден номер
Освен попълването на полетата на главата на сегмента, изпращачът трябва да избере и бит за флаг. Има общо шест флаг бита, но за тристранно ръкостискане ще ви трябват само следните два:
- SYN: Дава пореден номер. Този пореден номер ще се използва за преброяване на последователността на всички входящи сегменти за останалата част от взаимодействието.
- ACK: Показва, че получателят на SYN номера приема заявката за свързване, като добавя едно (1) към дадения SYN номер.
Сега, когато знаете какво е TCP сегмент, нека да видим как се използва при тристранно ръкостискане.
Как работи тристранното ръкостискане
Тристранното ръкостискане се установява, когато и клиентът, и хостът са обменили информация и са си потвърдили последователните номера. Както подсказва името, тристранното ръкостискане се извършва в три стъпки.
Първо, клиентът изпраща чист сегмент SYN, показващ, че иска връзка. Второ, сървърът отговаря със сегмент SYN-ACK, което означава, че е потвърдил заявката и изпраща свой собствен SYN номер, за да го потвърди клиентът. Трето, клиентът изпраща ACK сегмент до сървъра, за да го уведоми, че SYN номерът на сървъра е потвърден и ще се използва за по-нататъшно свързване.
Тристранното ръкостискане ще изглежда така:
Нека да го разбием и да разгледаме сегментите, за да знаете какво точно се случва, когато клиент и сървър обменят и потвърдят последователните номера.
Стъпка 1: Клиентът изпраща SYN сегмент
Клиентът изпраща заявка за връзка, като изпраща SYN сегмент към сървъра. Клиентът използва IP адреса на клиента, за да намери сървъра и да изпрати TCP сегмента.
За да намалим сложността на сегмента, нека игнорираме няколко сегментни полета и се концентрираме върху най-необходимото за трипосочна връзка за ръкостискане. Това включва порт източник, порт дестинация, пореден номер, номер на потвърждение и какъв тип флаг бит се използва.
И с това сегментът SYN/заявка трябва да изглежда така:
Клиентският порт е произволно число между 49152 и 65536. Този диапазон на портовете е договореният обхват, който обществените устройства могат да използват динамично за свързване към интернет. Диапазоните на портовете от 1024 до 49151 са частни. Те ще трябва да бъдат регистрирани от субект, за да използват порт в посочения диапазон. Номерата на портове под 1024 са портове, запазени за различни функции и интернет протоколи, като FTP (порт 20), SMTP (порт 25), DNS (порт 53) и HTTP (порт 80).
В реалния живот поредният номер е произволно число. За примера използвахме 0000000000, за да улесним визуализирането.
Обърнете внимание на поредния номер, докато преминаваме през стъпките. В момента е 000000000. В момента няма номер за потвърждение, тъй като няма какво да се потвърди.
Стъпка 2: Сървърът отговаря със сегмент SYN-ACK
След като сървърът получи SYN сегмент, той ще отговори, като изпрати ACK сегмент, съдържащ номера на потвърждение. Номерът на потвърждението ще бъде поредният номер на клиента плюс едно (1).
Вижте изходния порт. Показва, че сегментът е от порт 20, което показва, че е дошъл от сървъра като отговор.
Сега вижте номера на потвърждението. Това е 0000000001, което е поредният номер на клиента (0000000000) плюс едно (1). По този начин се проследява сегмент. Да приемем, че клиентът е получил отговор на ACK сегмент, където номерът на потвърждението е 0000000002. Това ще покаже на клиента, че сегмент 0000000001 липсва и че клиентът ще трябва да изчака, докато пристигне така че да не изпитате загуба на пакети.
Както можете да видите, два флаг бита са активирани — SYN и ACK.
Освен че потвърждава поредния номер на клиента, сървърът също така ще изпрати свой собствен пореден номер, за да може клиентът да потвърди поредния номер на сървъра плюс едно (1). В нашия пример използвахме 1111111111 като пореден номер на сървъра. Отново в реалния свят това число е произволно.
Имайте предвид, че поредните номера на клиента и сървъра не трябва да съвпадат. Докато и двете страни си признаят уникалния пореден номер, връзката ще бъде надеждна.
Стъпка 3: Клиентът отговаря със сегмент ACK
И накрая, клиентът потвърждава поредния номер на сървъра.
Последният сегмент е ACK сегмент от клиента.
Както можете, клиентът ще потвърди поредния номер на сървъра, като отговори с поредния номер на сървъра (1111111111) плюс едно (1), което е 1111111112.
Клиентът и сървърът вече няма да изпращат пореден номер, тъй като началото на поредицата вече е потвърдено. И двете страни обаче ще очакват сегменти за потвърждение, продължаващи последователните номера плюс един (1) и числовите байтове по време на взаимодействието. В този случай клиентът очаква следващия отговор на сървъра да има ACK от 0000000002 (ако няма прикачени данни).
След което се установява тристранното ръкостискане!
Разбиране как работят мрежовите връзки
Сега, след като научихте как работи тристранното ръкостискане, също така ще имате по-лесно разбиране как работи TCP след ръкостискането. Клиентът и сървърът ще започнат да изпращат данни, когато се установи ръкостискането. Този път ще се използва пълният формат на сегмента, плюс незадължителните данни или полезен товар.
Данните обикновено се сегментират/нарязват на по-малки парчета за по-лесно прехвърляне. Всеки сегмент от данни има своя собствена глава на сегмент, съдържаща пореден номер и номер на потвърждение. Причината за поредния номер е да се знае последователността на сегментите, когато в крайна сметка те ще бъдат сглобени отново. Номерата на потвърждението са там, за да потвърдят с подателя, че техният сегмент е получен и че съответства на последователността от входящи сегменти.
Отчитането на пореден номер и проверката им с потвърждение е как TCP може надеждно да транспортира огромни парчета данни без липсващи пакети данни.
И с това трябва да имате доста добра представа как работи TCP.