<|||>
Как работает интернет. Часть 8 | Как устроен протокол TCP, структура - Контроль целостности соединения в TCP. SEQ и ACK
Глобальные компьютерные сети и интернет
Оглавление
Как работает интернет. Часть 8 | Как устроен протокол TCP, структура
Подтверждение пакетов
Контроль целостности соединения в TCP. SEQ и ACK
Опции протокола TCP
Все страницы

 

В прошлой статье мы описали, как протокол TCP контролирует целостность соединения, переотправляя пакеты, если это необходимо. Для этого используются два поля в заголовке протокола – Sequence Number и Acknowledgment Number.

Мы также писали, что в этих полях отправляется номер переданного и принятого байта, и могло сложиться впечатление, что для первого пакета отправляется «1» (первый байт), а потом все идет по нарастающей. На самом деле, это не так.

Во-первых, нам абсолютно все равно, что отправлять в первом пакете. Даже если мы отправим «миллион», удаленный компьютер получит наш пакет, увидит, что он первый, и решит, «ага, этот умник решил начать с миллиона», и запишет это как «начало». Скажем, «миллион и полторы тысячи» будет началом второго пакета (если, конечно, в пакете 1500 байт данных), а «миллион и три тысячи» - третьего. Удаленный компьютер тоже может задумать число, например, «12345», и отправить нам в первом пакете в обратную сторону. Мы получим его и поймем, что «12345» - это первый пакет, а «12345 + длина данных в первом пакете» - это начало второго.

Во-вторых, лучше всего вообще отсылать случайные числа для первых пакетов (собственно, так оно и делается). Компьютер генерирует случайное 32-битное число, и отсылает его как Sequence Number для первого пакета. А затем его увеличивает на размер отосланных данных. Чем случайное число лучше, чем просто 1? Это безопаснее.

Представьте себе, что злобный хакер увидел, что вы установили TCP-соединение с банком. Тогда он просто шлет от своего имени TCP-пакет с Sequence Number = 1 (естественно, с подделанным адресом, и всем, чем необходимо), где указывает «переслать миллион долларов с вашего счета на его счет». Компьютер банка получает этот пакет и переводит деньги. Потом приходит «легальный» пакет, но компьютер банка говорит «извините, я уже получал такой пакет», и отправляет вам ошибку.

В случае же, если Sequence Number был бы случайным (о его значении договариваются стороны еще до отправки друг другу пакетов с данными, мы это рассмотрим позднее), то пакет хакера с Sequence Number = 1 просто был бы отброшен как «неверный», так как очень маловероятно, что следующий пакет должен был бы иметь такой Sequence Number (одна миллиардная).

Еще одно соображение - как видно на рисунке из статьи 11, размер каждого из этих Number’ов – 32 бита. Следовательно, максимум они могут вмещать числа от 0 до 4 миллиардов, а это 4 Гигабайта. После получения 4 Гигабайт данных (в одном соединении) значения начнут повторяться.

Чем это нам грозит? Допустим, мы послали байт номер 1, потом посылаем-посылаем пакеты, отослали уже 4 миллиарда байт, и вот, Sequence Number у нас переполнился, и мы сообщаем удаленному компьютеру, что мы снова посылаем ему байт номер 1. Удаленный компьютер перестанет работать?

Конечно, нет. Ведь помните, что мы не можем отсылать данных больше чем указано в поле Window, а оно 16-битное. То есть, одновременно передаваться могут не более чем 65536 байт данных в каждую из сторон. И когда вы передаете «4-миллиардный» байт, пакета с первым байтом в принципе быть не может, так как он давно уже вышел за пределы окна в 65536 байт.

Но тогда возникает другой вопрос. Хорошо, но ведь «на первый взгляд» 65536 байт – совсем немного (а не факт что окно будет столько, вполне может быть, что и 32768, и 16384, и вообще, любое значение, которое отправит удаленный компьютер). Нужно отправить кучку пакетов на 65536 байт, ждать ответа. Пока мы ждем этого ответа (а сигналы по проводам идут не мгновенно), мы бы успели еще мегабайт подготовить, но вынуждены простаивать, пока не ответит удаленный компьютер.

Возникает мысль – а что если увеличить размер окна? Такое чувство, что в 60-х/70-х годах прошлого века просто сети были медленные, и авторам показалось, что 65536 байт нормально. А сейчас явно хочется большего. Но просто так, увеличить размер поля Window нельзя. Вас просто никто не поймет, так как ваш протокол будет несовместим с TCP протоколом, а именно TCP в Интернете стандарт.

Можно, конечно, изобрести новый TCPv6, как и IPv6, и «пропихивать новый стандарт», заставлять всем на него переходить, но вы же понимаете, как будет. Будет как с IPv6, который придумали лет 20 назад, и до сих пор не внедрили. Нет, тут надо действовать по-другому. А как именно – мы опишем в следующей статье.



Комментарии
Добавить новый RSS
rema  - вопрос   |2013-10-11 04:03:44
А где все-таки 4-я и 7-я части?
Юрий  - А где все-таки 4-я и 7-я части?   |2013-10-11 12:20:00
4 часть находится здесь: http://mycompplus.ru/news/52-n etwork-/1865-port.html

А 7 часть здесь: http://mycompplus.ru/news/52-n etwork-/1878--7-ieee-rfc.html
Оставить комментарий
Имя:
Email:
 
Тема:
 
Пожалуйста, введите проверочный код, который Вы видите на картинке.

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 
Все права защищены. Copyright 2008-2017 © Мой компьютер плюс