Skip to content
오늘을살자
Go back

Wireshark Reassembled TCP Segments 의미: 여러 TCP 조각이 하나의 메시지로 보일 때

Edit page

Wireshark에서 패킷을 보다가 이런 표시를 만날 때가 있다.

[3 Reassembled TCP Segments (32015 bytes): #134(14600), #137(14600), #139(2815)]

처음 보면 “TCP 패킷 3개를 Wireshark가 임의로 묶은 건가?” 싶다.

하지만 의미는 조금 더 정확하다.

Wireshark가 TCP stream 위에 실려 온 여러 TCP payload 조각을 이어 붙여, 하나의 상위 계층 PDU를 재구성했다는 뜻이다.

먼저 예시를 그대로 읽어보기

표시된 문구는 다음처럼 나눠서 보면 된다.

3 Reassembled TCP Segments (32015 bytes)
#134(14600)
#137(14600)
#139(2815)

의미는 이렇다.

숫자를 더하면 딱 맞는다.

14600 + 14600 + 2815 = 32015

즉 Wireshark는 frame #134, #137, #139의 TCP payload를 이어 붙여 32015 bytes짜리 상위 계층 메시지 하나로 해석한 것이다.

TCP에는 메시지 경계가 없다

이 현상을 이해하려면 TCP의 기본 성질을 먼저 봐야 한다.

TCP는 packet message protocol이 아니라 byte stream protocol이다.

애플리케이션이 이렇게 보냈다고 해서:

send(message_1)
send(message_2)

수신 쪽에서 반드시 이렇게 보인다는 보장은 없다.

recv(message_1)
recv(message_2)

실제로는 이렇게 쪼개지거나 합쳐질 수 있다.

send side application message
  32015 bytes

TCP stream
  segment #134: 14600 bytes
  segment #137: 14600 bytes
  segment #139:  2815 bytes

TCP 입장에서는 “메시지 하나”가 아니라 “순서가 있는 byte 흐름”만 보장하면 된다.

그래서 상위 계층 메시지 하나가 여러 TCP segment로 나뉘어 올 수 있다.

Wireshark는 무엇을 기준으로 재조립하나

Wireshark가 아무 TCP payload나 마음대로 묶는 것은 아니다.

대략 다음 조건들이 맞을 때 재조립해서 보여준다.

1. 같은 TCP 연결이어야 한다

기본적으로 같은 TCP connection 안의 payload여야 한다.

보통 같은 5-tuple로 판단한다.

source IP
destination IP
source port
destination port
protocol = TCP

연결이 다르면 sequence number가 이어져 보여도 같은 stream으로 보지 않는다.

2. TCP sequence number가 이어져야 한다

TCP payload는 sequence number를 기준으로 순서를 가진다.

Wireshark는 TCP sequence number를 보고 payload가 연속되는지 판단한다.

단순화하면 이런 흐름이다.

frame #134
  seq = 1000
  len = 14600

frame #137
  seq = 15600
  len = 14600

frame #139
  seq = 30200
  len = 2815

payload가 중간에 비거나 순서가 꼬이면 Wireshark는 재조립을 기다리거나, 누락/이상 상태를 표시할 수 있다.

3. 상위 계층 프로토콜이 길이를 알아야 한다

TCP 자체에는 메시지 길이 필드가 없다.

그래서 Wireshark가 “여기부터 여기까지가 상위 계층 메시지 하나”라고 알려면, 보통 상위 프로토콜 디섹터의 도움이 필요하다.

예를 들면 다음과 같다.

상위 계층 디섹터가 “이 메시지는 총 32015 bytes가 필요하다”고 알 수 있으면, Wireshark는 TCP stream에서 필요한 byte들이 모두 모일 때까지 이어 붙인다.

그리고 완성된 지점에서 하나의 상위 계층 PDU로 해석한다.

4. TCP reassembly 옵션이 켜져 있어야 한다

Wireshark 설정에서 TCP reassembly가 꺼져 있으면 이런 식의 재조립 표시가 안 보이거나, 상위 계층 해석이 제한될 수 있다.

대표적으로 확인할 옵션은 다음이다.

Edit
  Preferences
    Protocols
      TCP
        Allow subdissector to reassemble TCP streams

또한 HTTP, TLS, SOME/IP 같은 각 상위 프로토콜에도 별도 reassembly 옵션이 있을 수 있다.

문제가 이상하게 보이면 TCP 옵션과 해당 프로토콜 옵션을 같이 확인하는 것이 좋다.

이 표시가 뜻하지 않는 것

이 메시지를 볼 때 헷갈리기 쉬운 부분도 있다.

1. 송신 측 send() 단위와 같다는 뜻은 아니다

Wireshark가 보여주는 reassembled PDU는 상위 프로토콜 기준의 메시지 단위다.

송신 애플리케이션이 실제로 send()를 몇 번 호출했는지와 반드시 일치하지 않는다.

애플리케이션이 한 번에 보낸 데이터가 여러 TCP segment로 나뉠 수도 있고, 여러 번 보낸 데이터가 수신 측에서는 붙어서 보일 수도 있다.

2. TCP가 메시지 기반이라는 뜻도 아니다

TCP는 여전히 byte stream이다.

메시지 경계는 TCP가 아니라 HTTP, TLS, SOME/IP 같은 상위 프로토콜이 만든다.

Wireshark는 그 상위 프로토콜 규칙을 이용해 보기 좋게 재조립해서 보여주는 것이다.

3. 반드시 실제 wire packet 크기와 같다는 뜻은 아니다

예시에서 14600 bytes가 보인다.

일반 Ethernet MTU 기준으로는 TCP payload 14600 bytes가 한 wire packet에 그대로 실리기 어렵다.

이런 큰 TCP payload가 캡처에 보이면, 캡처 위치나 환경에 따라 TSO, LRO, GRO 같은 offload/coalescing 영향이 있을 수 있다.

즉 Wireshark에 보이는 “캡처된 TCP segment”와 물리적으로 선에 나간 Ethernet frame 크기를 항상 1:1로 보면 안 된다.

다만 reassembly 해석 자체는 여전히 TCP stream의 byte 순서를 기준으로 이해하면 된다.

실제 분석할 때 보는 순서

이 메시지가 보이면 나는 보통 이렇게 확인한다.

  1. frame 번호들을 클릭해서 실제 payload 조각이 어디에 있는지 본다.
  2. 같은 TCP stream인지 확인한다.
  3. sequence number와 payload length가 연속되는지 본다.
  4. 마지막 frame에서 상위 계층 PDU가 완성되는지 본다.
  5. 상위 계층의 length field가 32015 bytes와 맞는지 확인한다.
  6. reassembly 옵션이 켜져 있는지 확인한다.
  7. payload length가 비정상적으로 크면 offload 영향인지 본다.

이 과정을 거치면 “패킷이 왜 세 개로 묶였는지”와 “상위 계층 메시지가 어디서 완성됐는지”를 분리해서 볼 수 있다.

예시를 한 문장으로 다시 정리

다시 처음 예시를 보자.

[3 Reassembled TCP Segments (32015 bytes): #134(14600), #137(14600), #139(2815)]

이 말은 다음과 같다.

Wireshark가 같은 TCP stream 안에서
frame #134, #137, #139의 TCP payload를 sequence number 순서대로 이어 붙였고,
그 결과 32015 bytes짜리 상위 계층 PDU 하나를 완성했다.

중요한 점은 TCP segment 3개를 임의로 묶은 것이 아니라는 것이다.

상위 계층 메시지 하나를 해석하는 데 필요한 TCP payload 조각들이 세 frame에 나뉘어 있었고, Wireshark가 그것을 재조립해서 보여준 것이다.

한 줄 요약

Wireshark의 Reassembled TCP Segments 표시는 같은 TCP 연결에서 sequence number가 이어지는 여러 TCP payload를 모아, 길이를 알 수 있는 상위 계층 PDU 하나로 재구성했다는 뜻이다.


Edit page
Share this post on:

Next Post
lwIP에서 RX는 되는데 payload가 가끔 깨진다: DMA 버퍼와 D-Cache 순서를 같이 봐야 한다