TCP 연결의 최대 패킷 크기는 얼마입니까? 또는 최대 패킷 크기를 얻으려면 어떻게해야합니까?
TCP 연결의 최대 패킷 크기는 얼마입니까? 또는 최대 패킷 크기를 얻으려면 어떻게해야합니까?
답변:
TCP 패킷 크기에 대한 절대 제한은 64K (65535 바이트)이지만 실제로는 하위 계층 (예 : 이더넷)의 패킷 크기가 작기 때문에 실제로 볼 수있는 패킷 크기보다 훨씬 큽니다.
예를 들어 이더넷의 MTU (Maximum Transmission Unit)는 1500 바이트입니다. 일부 유형의 네트워크 (예 : 토큰 링)에는 더 큰 MTU가 있고 일부 유형에는 더 작은 MTU가 있지만 값은 각 물리적 기술에 대해 고정되어 있습니다.
이것은 훌륭한 질문이며 실제로 직장에서 많이 나옵니다. 65k 및 1500과 같은 많은 "기술적으로 올바른"답변이 있습니다. 네트워크 인터페이스를 작성하고 65k를 사용하는 것은 많은 일을 해왔으며 1500은 또한 큰 문제를 일으킬 수 있습니다. 내 작업은 다양한 하드웨어 / 플랫폼 / 라우터에서 진행되며 솔직히 말하면 1400 바이트입니다. 당신이 1400 이상을 필요로하는 경우에 당신의 길을 인치 시작할 수 있습니다, 당신은 아마 1450에 갈 수 있고 때로는 1480'ish? 물론 그 이상이 필요한 경우 2 개의 패킷으로 분할해야하며, 그 중 몇 가지 명백한 방법이 있습니다.
문제는 데이터 패킷을 작성하고 TCP를 통해 데이터를 작성하는 것에 대해 이야기하고 있지만 헤더 데이터가 고정되어 있다는 것입니다. 따라서 "수하물"이있어 1500 이상으로 이동할 수 있습니다. 많은 하드웨어에는 하한이 있습니다.
"누르면"정말 이상한 일이 벌어 질 수 있습니다. 잘린 데이터, 분명히 또는 드랍 한 데이터는 드물다. 손상된 데이터도 거의 발생하지 않습니다.
send()
편리한 경우 2G를 하나로 쓸 수없는 이유는 없습니다 .
1480'ish
해야한다 1460
. IP 헤더와 TCP 헤더는 각각 20 바이트를 차지하며 (선택적 헤더 필드를 사용하지 않는 한) 비 점보 프레임 이더넷의 최대 값은 1500 - 20 -20 = 1460
입니다.
응용 프로그램 수준에서 응용 프로그램은 TCP를 스트림 지향 프로토콜로 사용합니다. TCP에는 차례로 세그먼트가 있으며 신뢰할 수없는 IP 패킷 작업에 대한 세부 정보를 추상화합니다.
TCP는 패킷 대신 세그먼트를 처리합니다. 각 TCP 세그먼트에는 TCP 헤더 내에 포함 된 시퀀스 번호가 있습니다. TCP 세그먼트로 전송 된 실제 데이터는 가변적입니다.
일부 OS에서 지원되는 getsockopt 값은 TCP_MAXSEG라는 최대 TCP 세그먼트 크기 (MSS)를 검색하는 데 사용할 수 있습니다. 모든 OS에서 지원되는 것은 아닙니다.
정확히 무엇을하려고하는지 확실하지 않지만 사용 된 버퍼 크기를 줄이려면 SO_SNDBUF 및 SO_RCVBUF를 살펴보십시오.
http://en.wikipedia.org/wiki/Maximum_segment_size 에 따르면 네트워크에서 IPV4 패킷의 기본 최대 크기는 536 옥텟 (바이트 8 비트)입니다. RFC 879 참조
TCP API에는 패킷이 없습니다.
TCP가 IP를 통해 수행 될 때와 같이 기본 프로토콜에는 종종 패킷이 있습니다. 관심이없는 매우 섬세한 성능 최적화를 제외하고는 사용자와 아무런 관련이 없기 때문에 관심이 없습니다. 질문의 공식).
send()
한 번의 API 호출에서 최대 바이트 수를 묻는다면 구현 및 설정에 따라 다릅니다. 일반적으로 최대 몇 킬로바이트 청크에 대해서는 send ()를 호출하고 시스템이 항상 전체 또는 부분적으로 수락을 거부 할 준비가되어 있습니다.이 경우 데이터를 TCP send () API.
일반적으로 이는 연결이 사용중인 인터페이스에 따라 다릅니다. ioctl ()을 사용하여 MTU를 얻을 수 있으며 이더넷 인 경우 일반적으로 하드웨어 헤더의 크기를 빼서 최대 패킷 크기를 얻을 수 있습니다. VLAN이없는 이더넷의 경우 14입니다.
이것은 MTU가 네트워크 전체에서 그렇게 큰 경우에만 해당됩니다. TCP는 경로 MTU 검색을 사용하여 효과적인 MTU를 줄일 수 있습니다.
문제는 왜 신경 쓰는가입니다.
인터넷에있는 대부분의 웹 사이트는 MTU의 값으로 1460 바이트를 사용하는 것으로 보입니다. 때로는 1452이며 VPN을 사용하는 경우 IPSec 헤더의 경우 더 많이 떨어집니다.
기본 창 크기는 최대 65535 바이트까지 다양합니다. http://tcpcheck.com 을 사용 하여 자체 소스 IP 값을보고 다른 인터넷 공급 업체가 사용중인 것을 확인합니다.
한 가지 해결책은 소켓 옵션 TCP_MAXSEG ( http://linux.die.net/man/7/tcp )를 기본 네트워크에서 "안전한"값으로 설정 한 다음 (예 : 이더넷에서 안전하도록 1400으로 설정) 송신 시스템 호출에서 큰 버퍼를 사용하십시오. 이 방법으로 비용이 많이 드는 시스템 호출이 줄어 듭니다. 커널은 MSS와 일치하도록 데이터를 분할합니다.
이렇게하면 잘린 데이터를 피할 수 있으며 응용 프로그램은 작은 버퍼에 대해 걱정할 필요가 없습니다.
IP 프로토콜 (Ip4)의 TCP 설정에 대한 패킷 크기입니다. 이 필드 (TL)의 경우 16 비트가 할당되므로 패킷의 최대 크기는 65535 바이트입니다. IP 프로토콜 세부 사항