ЖУРНАЛ ХАКЕР

Операция по удалению грыжи у TCP/IP

Xakep, номер #031, стр. 031-020-2


Возможные значения для MaxMTU - 552, 576, 1002, 1500. Это не значит, что нельзя использовать другие числа, просто эти используются чаще всего и работают лучше (тут я не буду вдаваться в технические подробности).

Размер данных в пакете

Понизив размер максимального пакета, нужно не забывать, что пакет содержит не только данные, но и заголовок, и служебную инфу, которые занимают аж 40 байт. Это значит, что при значении MaxMTU=1500 реально будет передаваться 1460 байт данных. При значении 576 размер данных равен 536. Так что во втором случае у тебя будет в три раза большие потери на служебную инфу, т.к. для передачи 1500 байт данных нужно отправить три пакета по 576, а значит - 120 байт служебной инфы. Так что за счет снижения затрат при потерях пакетов ты в три раза увеличиваешь напряг на сеть служебной инфой.

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

Количество данных без учета служебной инфы называется MSS (Maximum Segment Size), и равен он MaxMTU-40. Иди в реестр по адресу HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTC и создай там строковый параметр DefaultMSS, равным значению MaxMTU-40 (для особо умных сообщаю, что нужно вписать туда не формулу "MaxMTU-40", а результат вычислений по этой формуле).

Закройте форточку

Все следующие параметры будут располагаться по адресу HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTC, поэтому я буду говорить только их название, тип и что они означают.

Следующим будет строковый параметр DefaultRcvWindow (RWIN - Receive Window) - окно посылки. Когда ты посылаешь запрос на сервер, то он имеет право отправить тебе RWIN количество байт, не дожидаясь подтверждения об удачном приеме. Если записать в DefaultRcvWindow значение, которое ты указал в DefaultMSS, то сервер после каждого отправленного пакета будет ждать подтверждения. В этом случае ты нарвешься на большие задержки. Если ты сделаешь это значение размером в 20 * DefaultMSS, то сервер будет отправлять сразу 20 пакетов. Этим ты увеличишь вероятность потерь пакетов, а значит увеличишь количество запросов и ожиданий потерянных данных.

Параметр DefaultRcvWindow нужно рассчитывать по формуле DefaultMSS * N. В качестве N желательно использовать числа 4, 6, 8 или 10. Самым оптимальным, на мой взгляд, является число 8, но в твоем случае оно может быть и другим.

Время умирать

Следующий строковый параметр - DefaultTTL (TTL-Time To Live), это время жизни пакета. Для того чтобы маршрутизаторы не зацикливались в поисках места назначения пакета, был придуман параметр TTL. Как только значение этого параметра превышает допустимое, пакет считается попавшим в цикл и уничтожается.

По умолчанию DefaultTTL выставлено в 32. Его уменьшение может привести только к ухудшению связи, а увеличение может уменьшить вероятность потерь пакетов. Это связано с тем, что некоторые пакеты могут быть уничтожены только потому, что какому-то маршрутизатору вздумалось отправить пакет дальней дорогой. Такое бывает редко, но все же я рекомендую увеличить это значение до 64-х, тебе от этого хуже не станет. Хотя скорость увеличится незаметно, по крайней мере, тестами это не определишь. Если ты сможешь таким способом спасти пару заблудившихся пакетов в неделю, то можно считать, что у тебя золотые руки, так что беги сдавать их в ломбард.

Назад на стр. 031-020-1  Содержание  Вперед на стр. 031-020-3