Який максимальний розмір пакета для з'єднання TCP або як я можу отримати максимальний розмір пакета?
Який максимальний розмір пакета для з'єднання TCP або як я можу отримати максимальний розмір пакета?
Відповіді:
Абсолютне обмеження на розмір пакета TCP становить 64 К (65535 байт), але на практиці це набагато більше, ніж розмір будь-якого пакета, який ви побачите, оскільки нижчі шари (наприклад, Ethernet) мають менші розміри пакетів.
Наприклад, MTU (блок максимальної передачі) для Ethernet становить 1500 байт. Деякі типи мереж (наприклад, Token Ring) мають більші MTU, а деякі типи мають менші MTU, але значення фіксуються для кожної фізичної технології.
Це відмінне запитання, і я дуже часто на цьому стикаюся на роботі. Є багато "технічно правильних" відповідей, таких як 65k і 1500. Я багато працював над написанням мережевих інтерфейсів, і використання 65k нерозумно, і 1500 також може привести вас до великих проблем. Моя робота триває безліч різних апаратних / платформ / маршрутизаторів, і якщо чесно, я починаю 1400 байт. Якщо вам потрібно більше 1400, ви можете почати збільшувати свій шлях вгору, ймовірно, ви можете піти на 1450, а іноді і на 1480'іш? Якщо вам потрібно більше, ніж тоді, звичайно, вам потрібно розділити на 2 пакети, з яких є кілька очевидних способів зробити ..
Проблема полягає в тому, що ви говорите про створення пакету даних і записування його через TCP, але, звичайно, є дані заголовка, які вписані і так далі, тому у вас є "багаж", який ставить вас до 1500 або більше .. а також Багато обладнання має нижчі межі.
Якщо "натиснути", ви можете зробити деякі справді дивні речі. Обрізані дані, очевидно, або скинуті дані я бачив рідко. Пошкоджені дані також рідко, але, безумовно, трапляються.
send()
якщо це зручно.
1480'ish
має бути 1460
. IP-заголовок та заголовок TCP займають щонайменше по 20 байт (якщо не використовуються необов'язкові поля заголовка), і, таким чином, максимум для (не кадрів Jumbo) Ethernet є 1500 - 20 -20 = 1460
.
На рівні програми програма використовує TCP як протокольний орієнтований протокол. TCP, у свою чергу, містить сегменти та абстрагує деталі роботи з ненадійними пакетами IP.
TCP займається сегментами, а не пакетами. Кожен сегмент TCP має порядковий номер, який міститься всередині заголовка TCP. Фактичні дані, що надсилаються в сегменті TCP, є змінними.
Існує значення для getsockopt, яке підтримується в деяких ОС, які ви можете використовувати під назвою TCP_MAXSEG, яке отримує максимальний розмір сегмента TCP (MSS). Він підтримується не у всіх ОС.
Я не впевнений, що саме ви намагаєтесь зробити, але якщо ви хочете зменшити розмір буфера, який використовується, ви також можете вивчити: SO_SNDBUF та SO_RCVBUF.
За даними http://en.wikipedia.org/wiki/Maximum_segment_size , найбільший за замовчуванням розмір пакету IPV4 в мережі становить 536 октетів (байти розміром 8 біт). Див. RFC 879
У API TCP немає пакетів.
Часто в базових протоколах є пакети, як, наприклад, коли TCP робиться через IP, до якого ви не зацікавлені, оскільки вони не мають нічого спільного з користувачем, за винятком дуже делікатних оптимізацій продуктивності, які вас, мабуть, не цікавлять (відповідно до формулювання питання).
Якщо ви запитаєте, яка максимальна кількість байтів ви можете send()
в одному дзвінку API, то це залежить від реалізації та налаштувань. Зазвичай ви закликаєте send () для шматок до кількох кілобайт, і завжди будете готові до того, що система відмовиться прийняти її повністю або частково, і в цьому випадку вам доведеться вручну керувати розділенням на менші шматки, щоб подати свої дані в TCP send () API.
Як правило, це залежатиме від інтерфейсу, який використовується з'єднання. Можливо, ви можете використовувати ioctl (), щоб отримати MTU, а якщо це ethernet, зазвичай ви можете отримати максимальний розмір пакету, віднявши від нього розмір апаратного заголовка, який становить 14 для Ethernet без VLAN.
Це лише в тому випадку, якщо MTU принаймні така велика по всій мережі. TCP може використовувати відкриття MTU для зменшення ефективної MTU.
Питання в тому, навіщо вам байдуже?
Здається, більшість веб-сайтів в Інтернеті використовують 1460 байт для вартості MTU. Іноді це 1452, і якщо ви перебуваєте на VPN, він зменшиться ще більше для заголовків IPSec.
Розмір вікна за замовчуванням досить варіюється до максимуму 65535 байт. Я використовую http://tcpcheck.com для перегляду значень IP власного джерела та для перевірки того, чим користуються інші Інтернет-постачальники.
Одним з рішень може бути встановлення параметра socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) на значення, яке є "безпечним" для базової мережі (наприклад, встановити 1400 для безпечного використання в Ethernet), а потім використовувати великий буфер для відправки системного виклику. Таким чином може бути менше системних дзвінків, які є дорогими. Ядро розділить дані на відповідність MSS.
Таким чином ви можете уникнути усічених даних, і вашій програмі не потрібно турбуватися про невеликі буфери.
Розмір пакета для налаштування TCP в протоколі IP (Ip4). Для цього поля (TL) виділяється 16 біт, відповідно максимальний розмір пакета - 65535 байт: подробиці протоколу IP