TCP 연결의 최대 패킷 크기


197

TCP 연결의 최대 패킷 크기는 얼마입니까? 또는 최대 패킷 크기를 얻으려면 어떻게해야합니까?


24
TCP는 스트림 기반입니다. 개별 패킷에 대해 걱정하는 특별한 이유가 있습니까?
Matti Virkkunen

27
아래의 계층은 패킷 기반이므로 ... 일반 구현-> 계층 1-이더넷 PHY, 계층 2-이더넷 MAC (MAC 패킷 정의, 계층 3-인터넷 프로토콜 (IP 패킷 정의), 계층 4-TCP (전송 제어 프로토콜) )-그 아래에 패킷 기반 서비스를 사용합니다

2
'TCP 패킷'과 같은 것은 없습니다. 길이가 32 비트 워드로 설명되는 TCP 세그먼트가 있으며, 길이는 16 비트로 설명되는 IP 패킷 내에 또는 IP 패킷에 포함됩니다 . 이 모든 것을 포함하는 이더넷 프레임도 있습니다. 이 중 어떤 것을 요구하고 있습니까? 어쨌든 TCP를 사용하는 경우 TCP와 IP가 어떤 식 으로든 걱정할 필요가 없습니다.
Lorne의 후작

답변:


178

TCP 패킷 크기에 대한 절대 제한은 64K (65535 바이트)이지만 실제로는 하위 계층 (예 : 이더넷)의 패킷 크기가 작기 때문에 실제로 볼 수있는 패킷 크기보다 훨씬 큽니다.

예를 들어 이더넷의 MTU (Maximum Transmission Unit)는 1500 바이트입니다. 일부 유형의 네트워크 (예 : 토큰 링)에는 더 큰 MTU가 있고 일부 유형에는 더 작은 MTU가 있지만 값은 각 물리적 기술에 대해 고정되어 있습니다.


15
"그러나 각 물리적 기술에 대한 가치는 고정되어 있습니다"-이것은 사실이 아닙니다. 이더넷은 최대 MTU가 1500 이었지만 더 낮은 MTU를 사용할 수있었습니다. 점보 프레임의 출현으로 실제 지정된 최대 값은 없으며 최대 값은 하드웨어 및 드라이버에 따라 다릅니다.
WhirlWind

4
@Whirl : 사실, 그것들은 구성 가능하지만 일반적으로는 그렇지 않습니다. "configurable"은 주관적으로 커널을 조사해야하기 때문에 주관적입니다. OP가있는 응용 프로그램 수준에서 생각할 수있는 것은 아닙니다.
Ether

3
@HiroProtagonist : 1500은 최대 값이므로 600을 갖는 것은 놀라운 일이 아닙니다.
니콜라스 라울

29
왜 64K (65535 바이트)의 한계입니까? TCP 헤더의 창 크기 속성은 16 비트에 불과하기 때문입니다. 난 그냥 언급하고 싶었 누군가 언젠가 도울 수 있습니다 ..... 위대한 대답 btw @Ether!
Cacho Santa

2
또한 창 스케일링을 사용하여 향상시킬 수 있습니다. 이 경우 최대 값은 1 GiB
Martin Melka

86

이것은 훌륭한 질문이며 실제로 직장에서 많이 나옵니다. 65k 및 1500과 같은 많은 "기술적으로 올바른"답변이 있습니다. 네트워크 인터페이스를 작성하고 65k를 사용하는 것은 많은 일을 해왔으며 1500은 또한 큰 문제를 일으킬 수 있습니다. 내 작업은 다양한 하드웨어 / 플랫폼 / 라우터에서 진행되며 솔직히 말하면 1400 바이트입니다. 당신이 1400 이상을 필요로하는 경우에 당신의 길을 인치 시작할 수 있습니다, 당신은 아마 1450에 갈 수 있고 때로는 1480'ish? 물론 그 이상이 필요한 경우 2 개의 패킷으로 분할해야하며, 그 중 몇 가지 명백한 방법이 있습니다.

문제는 데이터 패킷을 작성하고 TCP를 통해 데이터를 작성하는 것에 대해 이야기하고 있지만 헤더 데이터가 고정되어 있다는 것입니다. 따라서 "수하물"이있어 1500 이상으로 이동할 수 있습니다. 많은 하드웨어에는 하한이 있습니다.

"누르면"정말 이상한 일이 벌어 질 수 있습니다. 잘린 데이터, 분명히 또는 드랍 한 데이터는 드물다. 손상된 데이터도 거의 발생하지 않습니다.


GET 요청이 평균 약 600 바이트 인 이유는 무엇입니까?

10
65K가 아니라 64K를 의미합니다. '시작하는 장소는 1400 바이트입니다'라는 말의 의미를 모르겠습니다. TCP API의 패킷 크기에 대해 걱정할 필요가 없습니다. 경로 MTU를 결정하고 관찰합니다. send()편리한 경우 2G를 하나로 쓸 수없는 이유는 없습니다 .
Lorne의 후작

19
당신은 1480'ish해야한다 1460. IP 헤더와 TCP 헤더는 각각 20 바이트를 차지하며 (선택적 헤더 필드를 사용하지 않는 한) 비 점보 프레임 이더넷의 최대 값은 1500 - 20 -20 = 1460입니다.
Eugene Beresovsky

2
나는 wireshark를 통해 서버가 큰 패킷 (1400 바이트 이상)을 보내고 클라이언트가 최대 1400 바이트의 패킷 수만큼 분해 된 것을받습니다. 패킷의 분해에 대한 책임은 누구에게 있습니까? @Nektario ...?
inbaly

2
@EugeneBeresovsky 옵션 ​​헤더를 사용하면 최대 40 바이트 이상을 사용할 수 있지만 1420이 한계가되는 변수입니다. 1400의 제안으로 약간의 패딩이 생깁니다. 128로 나눌 수 있기 때문에 1408과 함께 갈 것입니다.
Garet Claborn

22

응용 프로그램 수준에서 응용 프로그램은 TCP를 스트림 지향 프로토콜로 사용합니다. TCP에는 차례로 세그먼트가 있으며 신뢰할 수없는 IP 패킷 작업에 대한 세부 정보를 추상화합니다.

TCP는 패킷 대신 세그먼트를 처리합니다. 각 TCP 세그먼트에는 TCP 헤더 내에 포함 된 시퀀스 번호가 있습니다. TCP 세그먼트로 전송 된 실제 데이터는 가변적입니다.

일부 OS에서 지원되는 getsockopt 값은 TCP_MAXSEG라는 최대 TCP 세그먼트 크기 (MSS)를 검색하는 데 사용할 수 있습니다. 모든 OS에서 지원되는 것은 아닙니다.

정확히 무엇을하려고하는지 확실하지 않지만 사용 된 버퍼 크기를 줄이려면 SO_SNDBUF 및 SO_RCVBUF를 살펴보십시오.


모든 메시지를 큰 TCP 패킷 안에 넣을 수 있다면 TCP를 메시지 대기열로 사용할 수 있는지 궁금합니다.
CMCDragonkai


4

TCP API에는 패킷이 없습니다.

TCP가 IP를 통해 수행 될 때와 같이 기본 프로토콜에는 종종 패킷이 있습니다. 관심이없는 매우 섬세한 성능 최적화를 제외하고는 사용자와 아무런 관련이 없기 때문에 관심이 없습니다. 질문의 공식).

send()한 번의 API 호출에서 최대 바이트 수를 묻는다면 구현 및 설정에 따라 다릅니다. 일반적으로 최대 몇 킬로바이트 청크에 대해서는 send ()를 호출하고 시스템이 항상 전체 또는 부분적으로 수락을 거부 할 준비가되어 있습니다.이 경우 데이터를 TCP send () API.


8
TCP에는 패킷과 패킷 헤더가 있으며 그 일부는 IP 헤더와 겹칩니다. 당신이 그것을 보지 말아야한다고해서 그것이 존재하지 않는다는 것을 의미하지는 않습니다. TCP는 항상 IP를 통해 수행됩니다. 헤더가 겹치기 때문에 IP 없이는 할 수 없습니다.
WhirlWind

23
@WhirlWind TCP에는 세그먼트있습니다. IP에는 패킷이 있습니다.
Lorne의 후작

1
TCP에는 세그먼트가 있습니다 (또는 패킷이라고 부릅니다). TCP API에는 패킷이 없습니다.
Pavel Radzivilovsky

13
@NathanLong 피해는 불필요한 혼란을 초래한다는 것입니다. TCP에는 세그먼트가 있고, UDP에는 데이터 그램이 있고, IP에는 패킷이 있으며, 이더넷에는 프레임이 있습니다.
Lorqui Marquis of

1
@Chexxor 그렇다면 이더넷 프레임 내의 IP 패킷 내부의 TCP 세그먼트를 설명하기 위해 어떤 언어를 사용 하시겠습니까? 이러한 용어의 저자가 다른 용어를 사용하는 데 많은 어려움을 겪었을 때 다른 용어에 대해 동일한 용어를 사용하여 문제를 혼동 할 필요가 없습니다.
Lorne의 후작

3

일반적으로 이는 연결이 사용중인 인터페이스에 따라 다릅니다. ioctl ()을 사용하여 MTU를 얻을 수 있으며 이더넷 인 경우 일반적으로 하드웨어 헤더의 크기를 빼서 최대 패킷 크기를 얻을 수 있습니다. VLAN이없는 이더넷의 경우 14입니다.

이것은 MTU가 네트워크 전체에서 그렇게 큰 경우에만 해당됩니다. TCP는 경로 MTU 검색을 사용하여 효과적인 MTU를 줄일 수 있습니다.

문제는 왜 신경 쓰는가입니다.


6
첫 번째 링크에서만 최대 패킷 크기를 얻을 수 있습니다. 내가 아는 한, 경로를 따르는 다른 노드는 큰 패킷을 좋아하지 않으며 경로의 어느 곳에서나 나눌 수 있습니다.
Matti Virkkunen

그렇습니다. 그렇습니다. 질문이 좋습니다. 왜 이것을 원할까요?
WhirlWind

LAN 연결을 통해 비디오 / 이미지를 전송하고 싶습니다
Alexa

1
TCP는 스트림 지향적이므로 왜 중요한가요?
WhirlWind

3

Linux 시스템을 사용하는 경우 "ifconfig eth0 mtu 9000 up"은 인터페이스에 대한 MTU를 설정하는 명령입니다. 그러나 큰 MTU는 네트워크 전송이 그렇게 안정적이지 않으면 몇 가지 단점이 있으며 더 많은 커널 공간 메모리를 사용할 수 있습니다.


3

인터넷에있는 대부분의 웹 사이트는 MTU의 값으로 1460 바이트를 사용하는 것으로 보입니다. 때로는 1452이며 VPN을 사용하는 경우 IPSec 헤더의 경우 더 많이 떨어집니다.

기본 창 크기는 최대 65535 바이트까지 다양합니다. http://tcpcheck.com 을 사용 하여 자체 소스 IP 값을보고 다른 인터넷 공급 업체가 사용중인 것을 확인합니다.


2

한 가지 해결책은 소켓 옵션 TCP_MAXSEG ( http://linux.die.net/man/7/tcp )를 기본 네트워크에서 "안전한"값으로 설정 한 다음 (예 : 이더넷에서 안전하도록 1400으로 설정) 송신 시스템 호출에서 큰 버퍼를 사용하십시오. 이 방법으로 비용이 많이 드는 시스템 호출이 줄어 듭니다. 커널은 MSS와 일치하도록 데이터를 분할합니다.

이렇게하면 잘린 데이터를 피할 수 있으며 응용 프로그램은 작은 버퍼에 대해 걱정할 필요가 없습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.