Jaki jest maksymalny rozmiar pakietu dla połączenia TCP lub jak mogę uzyskać maksymalny rozmiar pakietu?
Jaki jest maksymalny rozmiar pakietu dla połączenia TCP lub jak mogę uzyskać maksymalny rozmiar pakietu?
Odpowiedzi:
Bezwzględne ograniczenie rozmiaru pakietu TCP wynosi 64 KB (65535 bajtów), ale w praktyce jest to znacznie więcej niż rozmiar dowolnego pakietu, który zobaczysz, ponieważ niższe warstwy (np. Ethernet) mają mniejsze rozmiary pakietów.
Na przykład MTU (Maximum Transmission Unit) dla Ethernetu wynosi 1500 bajtów. Niektóre typy sieci (jak Token Ring) mają większe MTU, a niektóre typy mają mniejsze MTU, ale wartości są ustalone dla każdej technologii fizycznej.
To doskonałe pytanie i tak naprawdę wpadam na to w pracy. Istnieje wiele „poprawnych technicznie” odpowiedzi, takich jak 65k i 1500. Zrobiłem dużo pracy, pisząc interfejsy sieciowe, a używanie 65k jest głupie, a 1500 może również sprawić ci duże kłopoty. Moja praca dotyczy wielu różnych urządzeń / platform / routerów i, szczerze mówiąc, miejsce, w którym zaczynam, to 1400 bajtów. Jeśli POTRZEBUJESZ więcej niż 1400, możesz zacząć podnosić się w górę, prawdopodobnie możesz przejść do 1450, a czasem do 1480? Jeśli potrzebujesz więcej, to oczywiście musisz podzielić na 2 pakiety, z których istnieje kilka oczywistych sposobów zrobienia ..
Problem polega na tym, że mówisz o tworzeniu pakietu danych i zapisywaniu go za pomocą protokołu TCP, ale oczywiście istnieją dane nagłówkowe itd., Więc masz „bagaż”, który zabiera Cię do 1500 lub więcej… a także dużo sprzętu ma niższe limity.
Jeśli go „popchniesz”, możesz mieć naprawdę dziwne rzeczy. Obcięte dane lub oczywiście upuszczone dane, które rzadko widuję. Uszkodzone dane również rzadko, ale na pewno się zdarzają.
send()
jeśli jest to wygodne.
1480'ish
powinien być 1460
. Nagłówek IP i nagłówek TCP zajmują co najmniej 20 bajtów (chyba że używane są opcjonalne pola nagłówka), a zatem maksymalna wartość dla (innej niż Jumbo) sieci Ethernet wynosi 1500 - 20 -20 = 1460
.
Na poziomie aplikacji aplikacja używa protokołu TCP jako protokołu zorientowanego na strumień. Z kolei TCP dzieli segmenty i streszcza szczegóły pracy z niewiarygodnymi pakietami IP.
TCP zajmuje się segmentami zamiast pakietów. Każdy segment TCP ma numer kolejny zawarty w nagłówku TCP. Rzeczywiste dane wysyłane w segmencie TCP są zmienne.
Istnieje wartość parametru getsockopt obsługiwana w niektórych systemach operacyjnych o nazwie TCP_MAXSEG, która pobiera maksymalny rozmiar segmentu TCP (MSS). Nie jest jednak obsługiwane we wszystkich systemach operacyjnych.
Nie jestem pewien, co dokładnie próbujesz zrobić, ale jeśli chcesz zmniejszyć rozmiar używanego bufora, możesz również zajrzeć do: SO_SNDBUF i SO_RCVBUF.
Według http://en.wikipedia.org/wiki/Maximum_segment_size domyślny największy rozmiar pakietu IPV4 w sieci to 536 oktetów (bajty o rozmiarze 8 bitów). Zobacz RFC 879
W interfejsie API TCP nie ma pakietów.
Protokoły bazowe często zawierają pakiety, na przykład gdy TCP jest wykonywany przez IP, co nie jest tym zainteresowane, ponieważ nie mają one nic wspólnego z użytkownikiem, z wyjątkiem bardzo delikatnych optymalizacji wydajności, którymi prawdopodobnie nie jesteś zainteresowany (zgodnie z sformułowanie pytania).
Jeśli zapytasz, jaka jest maksymalna liczba bajtów send()
w jednym wywołaniu API, zależy to od implementacji i ustawień. Zwykle wywołujesz send () dla fragmentów o wielkości do kilku kilobajtów i zawsze jesteś gotowy, aby system odmówił przyjęcia go całkowicie lub częściowo, w takim przypadku będziesz musiał ręcznie zarządzać dzieleniem na mniejsze fragmenty, aby wprowadzić dane do API send () TCP.
Zasadniczo będzie to zależeć od interfejsu używanego przez połączenie. Prawdopodobnie możesz użyć metody ioctl (), aby uzyskać MTU, a jeśli jest to sieć Ethernet, zwykle możesz uzyskać maksymalny rozmiar pakietu, odejmując od niego rozmiar nagłówka sprzętowego, który wynosi 14 dla sieci Ethernet bez VLAN.
Dzieje się tak tylko wtedy, gdy MTU jest co najmniej tak duża w sieci. TCP może użyć funkcji wykrywania MTU ścieżki, aby zmniejszyć efektywną MTU.
Pytanie brzmi: dlaczego cię to obchodzi?
Wydaje się, że większość stron internetowych używa 1460 bajtów dla wartości MTU. Czasami jest 1452, a jeśli korzystasz z VPN, spadnie jeszcze bardziej dla nagłówków IPSec.
Domyślny rozmiar okna zmienia się całkiem do maksymalnie 65535 bajtów. Korzystam z http://tcpcheck.com, aby przeglądać własne wartości źródłowe IP i sprawdzać, jakich używają inni dostawcy Internetu.
Jednym z rozwiązań może być ustawienie opcji gniazda TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) na wartość „bezpieczną” w sieci bazowej (np. Ustawioną na 1400, aby była bezpieczna w sieci Ethernet), a następnie użyj dużego bufora do wysyłania wywołania systemowego. W ten sposób może być mniej kosztownych wywołań systemowych. Jądro podzieli dane, aby dopasować MSS.
W ten sposób można uniknąć obciętych danych, a aplikacja nie musi martwić się o małe bufory.
Rozmiar pakietu dla ustawienia TCP w protokole IP (Ip4). Dla tego pola (TL) przydzielonych jest 16 bitów, odpowiednio maksymalny rozmiar pakietu to 65535 bajtów: szczegóły protokołu IP