먼저 약간의 배경에서 TCP에는 최대 세그먼트 크기(MSS)라는 개념이 있습니다. 이는 TCP 스택이 허용하는 가장 큰 세그먼트(데이터)입니다. 연결이 설정되면 SYN 세그먼트의 원격 피어에 광고됩니다. 다음 패킷 디코드에는 TCP MSS 옵션이 강조 표시된 SYN 세그먼트가 표시됩니다. 모든 TCP 옵션은 옵션 번호에 대해 동일한 형식, 옵션 번호 1 바이트, 이 경우 2 바이트, 옵션의 총 길이(4) 및 옵션값에 대해 1바이트가 이 경우 5b4 헥스 또는 1460 소수점입니다.
packet_monitor -interface #sdlmux.m16.11-3 -hex_dump -numeric -time_stamp -verbo +se -pkt_hdr -filter -host 10.64.77.50 dir icmp type + tcp hh:mm:ss.ttt dir len proto source destination src port ds +t port type 10:11:56.751 Xmit Ether Dst 00:23:54:52:18:6e Src 00:00:a8:43:52:22 Type 0800 +(IP) IP Ver/HL 45, ToS 0, Len 2c, ID be0b, Flg/Frg 0, TTL 3c, Prtl 6 Cksum dcdd, Src a404d80, Dst a404d32 TCP from 10.64.77.128.55911 to 10.64.77.50.telnet seq 1305537174, ack n.a., window 8192, 4 data bytes, flags Syn. X/Off 06, Flags 02, Cksum 815d, Urg-> 0000 offset 0 . . . 4 . . . 8 . . . C . . . 0...4...8...C... 0 2 4 5 b4 <<<4
STCP는 로컬 네트워크의 호스트에 연결하기 위해 1460의 값을 사용합니다. 모든 프로토콜 오버헤드를 추가하면 최대 이더넷 프레임 크기인 1518바이트의 이더넷 프레임으로 끝납니다. 로컬이 아닌 세그먼트의 호스트에 연결하기 위해 STCP는 min_mss 매개 변수에서 파생된 값을 사용합니다. 기본 min_mss 값을 사용하면 MSS 값이 536입니다. 이 값은 모든 IP 기반 네트워크 장비, 즉 라우터가 IP 조각화없이 전달하고자하는 최소 크기이며, 최소 536을 RFC 879에서 1983 년에 작성된 사양 - "TCP 최대 세그먼트 크기 및 관련 주제".
오늘날 모든 라우터가 더 큰 크기를 처리할 수 있습니다. 따라서 STCP 최소값은 536에서 더 큰 것으로 올릴 수 있습니다. 얼마나 큰 핵심 질문입니다. 너무 커서 만드는 위험은 조각화입니다. 최악의 시나리오이지만 진단하기 가장 쉬운 시나리오는 라우터가 조각화하는 대신 TCP 세그먼트를 삭제하도록 선택한다는 것입니다. 이 경우 연결을 설정할 수 있지만 데이터를 전송할 때 연결이 실패합니다. 전송 호스트의 추적에는 연결 시간이 꺼질 때까지 대형 TCP 세그먼트의 여러 재전송이 표시됩니다. 추적에는 세그먼트를 삭제하는 라우터에서 ICMP 대상에 연결할 수 없는 메시지가 표시될 수도 있습니다. 라우터가 세그먼트를 조각화하도록 선택하면 조각화 프로세스가 우선 순위가 낮아지므로 실제로 처리량이 감소할 수 있습니다. 또한 부패 또는 혼잡으로 인해 세그먼트를 잃을 확률은 조각 수와 함께 증가합니다. 이 경우 를 알 수 있는 가장 쉬운 방법은 모듈에서 packet_monitor 추적을 실행하는 것입니다. TCP 세그먼트가 조각으로 들어오면 조각화가 발생했다는 것을 알 수 있습니다.
다음 세 개의 이더넷 프레임은 세 부분으로 조각화된 하나의 TCP 세그먼트를 나타냅니다. Flg/Frg 값이 2000이기 때문에 첫 번째 프레임이 조각임을 알 수 있습니다. 2는 더 많은 조각 비트가 설정되고 000이 조각 오프셋임을 나타내며,이 경우 0은 첫 번째 조각임을 나타냅니다. 패킷 모니터는 실제로 다음 2 프레임을 조각으로 플래그를 표시합니다. 프레임 2의 Flg/Frg 값은 2048이며, 다시 2는 더 많은 조각 비트가 설정되고 48은 원래 IP 데이터그램에서 데이터의 오프셋(배수 8바이트)임을 나타냅니다. 세 번째 프레임에는 90의 Flg/Frag가 있거나 0090보다 더 정확하게 있습니다. 더 많은 조각 비트가 0이기 때문에 이것이 마지막 조각이라는 것을 알고 있습니다. 우리는 이 모든 프레임이 모두 동일한 IP ID 값인 2e87을 가지고 있기 때문에 함께 속한다는 것을 알고 있습니다. 첫 번째 프레임의 데이터 길이는 이 경우 556을 설정해야 하는 MSS 값을 나타냅니다.
15:52:27.081 Rcvd Ether Dst 00:00:a8:43:52:22 Src 00:12:3f:82:57:10 Type 0800 +(IP) IP Ver/HL 45, ToS 8, Len 254, ID 2e87, Flg/Frg 2000, TTL 3f, Prtl 6 Cksum 1422, Src c0a86432, Dst a404d80 TCP from 192.168.100.50.32781 to 10.64.77.128.ftp-data seq 568258166, ack 840605671, window 5440, 556 data bytes, flags Ack. X/Off 05, Flags 10, Cksum d149, Urg-> 0000 offset 0 . . . 4 . . . 8 . . . C . . . 0…4… 8…C… 0 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 * 5678901234567890 10 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 * 1234567890123456 20 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 * 7890123456789012 30 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 * 3456789012345678 40 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 * 9012345678901234 50 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 * 5678901234567890 60 d a 31 32 33 34 35 36 37 38 39 30 31 32 33 34 * <<12345678901234 70 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 * 5678901234567890
15:52:33.793 Rcvd Ether Dst 00:00:a8:43:52:22 Src 00:12:3f:82:57:10 Type 0800 +(IP) IP Ver/HL 45, ToS 8, Len 254, ID 2e87, Flg/Frg 2048, TTL 3f, Prtl 6 Cksum 13da, Src c0a86432, Dst a404d80 TCP from 192.168.100.50. to 10.64.77.128. *fragments*, 576 bytes data offset 0 . . . 4 . . . 8 . . . C . . . 0…4… 8…C… 0 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 * 1234567890123456 10 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 * 7890123456789012 20 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 * 3456789012345678 30 39 30 d a 31 32 33 34 35 36 37 38 39 30 31 32 * 90<<123456789012 40 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 * 3456789012345678 50 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 * 9012345678901234 60 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 * 5678901234567890 70 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 * 1234567890123456
15:52:33.793 Rcvd Ether Dst 00:00:a8:43:52:22 Src 00:12:3f:82:57:10 Type 0800 +(IP) IP Ver/HL 45, ToS 8, Len f8, ID 2e87, Flg/Frg 90, TTL 3f, Prtl 6 Cksum 34ee, Src c0a86432, Dst a404d80 TCP from 192.168.100.50. to 10.64.77.128. *fragments., 228 bytes data offset 0 . . . 4 . . . 8 . . . C . . . 0…4… 8…C… 0 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 * 5678901234567890 10 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 * 1234567890123456 20 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32 * 7890123456789012 30 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 * 3456789012345678 40 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 * 9012345678901234 50 35 36 37 38 39 30 d a 31 32 33 34 35 36 37 38 * 567890<<12345678 60 39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 * 9012345678901234 70 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 * 5678901234567890
MSS 값을 늘리는 문제는 모든 TCP 연결에 대해 증가한다는 것입니다. 하나 또는 몇 개의 목적지만 을 늘릴 수는 없습니다. 따라서 모든 연결에 미치는 영향을 측정하려면 이 변경 사항을 신중하게 테스트해야 합니다.
현재 MSS 값을 보고 다음 두 명령으로 변경할 수 있습니다.
analyze_system -request_line 'list_stcp_params min_mss' -quit
OpenVOS Release 17.0.1as, analyze_system Release 17.0.1as
Current process is 357, ptep 8FA86000, Noah_Davids.SysAdmin
maximum tcp segment size [500-1480] (min_mss) 556
ready 10:52:07
analyze_system -request_line 'set_stcp_param min_mss 1480' -quit
OpenVOS Release 17.0.1as, analyze_system Release 17.0.1as
Current process is 357, ptep 8FA86000, Noah_Davids.SysAdmin
Changing maximum tcp segment size (min_mss)
from 556 to 1480
ready 10:52:24
매개 변수 이름 인 min_mss MSS 값이지만 실제로 MSS 값과 20 바이트의 TCP 헤더 길이임을 의미합니다. 위의 예제에서는 min_mss 값을 556+20 또는 576으로 설정합니다.
그렇다면 MSS 값을 늘려 얼마나 많은 부스트를 얻을 수 있을까요? 오버헤드 바이트를 추가하는 VPN 연결이 보급되어 최대 값인 1480(실제 TCP MSS 1460)을 설정하는 것은 권장하지 않습니다. 나는 조금 작은 무언가를 제안, 말 1220 (실제 MSS 1200) 바이트. 536바이트 세그먼트를 사용하여 10메가바이트의 데이터를 전송한다고 가정하면 18657 프레임이 필요합니다. 총 바이트 수 – 오버헤드(8바이트 이더넷 프리앰블 + 14바이트 이더넷 헤더 + 20바이트 IP 헤더 + 20 바이트 TCP 헤더 + 4 바이트 TCP 트레일러 + 이더넷 간 간격을 위한 유효 12바이트)를 포함하였습니다. 1200바이트 세그먼트를 사용하는 경우 총 바이트 수가 10,650,052 또는 9% 조금 이상 작은 8334 프레임이 필요합니다. 그러나 MSS 값은 허용되는 가장 큰 세그먼트의 광고이며 전송 호스트가 실제로 큰 세그먼트를 보낼 필요는 없습니다. 그러나, 그것은 할 그리고 다른 병 목이 없는 가정 당신은 단지 있어 9% 처리량에 부팅.
우리는 UDP 측에서 아무것도 할 수 있습니까?
UDP는 최대 세그먼트 크기의 개념이 없으므로 조정할 매개 변수가 없습니다.