Network

TCP 통신 이해하기

rygus 2025. 6. 28. 23:35
728x90

안녕하세요. 

오늘은 TCP/IP 통신에 대해 포스팅하겠습니다. 

 

예전 대학교 시절부터 TCP에 대한 이야기는 많이 들어봤지만 정확하게 이해해 본 적은 없는 것 같습니다. 

그저 간단히 TCP는 수신측과 연결 수립 후 통신하고 UDP는 수신 측의 상황과는 상관없이 막 보낸다고만 외웠었습니다. 

하지만 클라우드 엔지니어로 취업하고 이런 기본적인 것들을 모르니 서버 세팅 후 통신 되지 않을 때 트러블 슈팅 단계에서 정확이 어디서 문제가 발생되는지 파악하기 어려운 문제가 발생하더군요.

그래서 이번 기회에 TCP에 대해 공부하고자해서 이렇게 블로그를 올리게 되었습니다. 

 

# TCP란 무엇인가? 

저희가 게임 사이트에서 게임 파일을 다운받는다고 가정해 보겠습니다. 

게임 파일은 보통 용량이 크기 때문에 서버는 패킷이라는 작은 단위로 잘게 쪼개서 클라이언트에 보내게 됩니다.

이때 네트워크 상황이나 여러 변수에 의해 패킷이 누락될 수도 있고 데이터를 순서대로 보내지 않을 수도 있습니다. 

여기서 TCP는 받은 패킷을 순서대로 재조립하고 누락된 패킷이 있다면 재전송을 요청하는 역할을 합니다.

 

또한 TCP 통신은 서버와 클라이언트의 상황을 고려하여 통신을 하게되는데요. 

TCP handshake 과정에서 서버와 클라이언트는 MSS (최대 세그먼트 크기)를 교환하게 됩니다. 

(*MSS란 최대 세그먼트 크기로 하나의 패킷에 실을 수 있는 TCP헤더와 IP 헤더를 뺀 값입니다.)

각 서버나 장비 별로 MSS는 다르기 때문에 서버측에서 아무리 많은 데이터를 패킷에 실어 보내도 상대방 MSS가 작아 받을 수 없다면 이는 말짱 도루묵이 될 것입니다. 

TCP는 이러한 상황을 고려하여 상대방의 MSS에 맞추어 데이터를 보내게 됩니다. 

 

# TCP 3-way handshake란? 

TCP handshake란 본격적인 통신을 연결하기 전에 이루어지는 3단계의 과정으로 서로의 sequence number를 교환하여 서로의 통신 가능 상태를 확인하는 과정입니다.

 

 

위 사진은 TCP 헤더입니다. 

가운데에 sequence number와 acknowledgement number가 보입니다. 

이 두 데이터를 통해 연결 가능 상태를 확인하게됩니다. 

  1. 클라이언트는 서버에게 자신의 시퀀스 넘버를 보내게 됩니다. 
    이때 클라이언트는 SYN_SENT 단계가 되며 SYN에 대한 응답인 ACK를 기다리는 상태가 됩니다.

  2. 서버는 리슨 상태에서 시퀀스 넘버를 받고 자신의 시퀀스 넘버 (400)와 
    클라이언트 측의 SYN을 확인했다는 의미로 SYN + 1 을 하여 ACK를 합쳐 SYN(400)ACK(101)를 보내게 됩니다.
    이때 서버는 SYN_RECEIVED 상태가 됩니다.

  3. 클라이언트는 서버의 시퀀스 넘버를 확인하고 SYN + 1 (400 + 1)을 보냅니다.
    그리고 연결 가능 상태인 ESTABLISHED 상태가 되고 이 ACK를 받은 서버도 ESTABLISHED 상태가 되며 서로의 연결을 수립하게 됩니다.

 

# tcpdump 명령어를 통해 확인하기

이제 간단한 테스트 환경을 통해 실제 서버 간 3-way handshake로그를 확인해 보겠습니다. 

클라이언트 10.0.0.148에서 41398 포트를 통해 서버 10.0.0.149 80번 포트로 들어온 것을 확인 가능합니다.

시퀀스 넘버는 3676236707입니다. 
Flags에는 [S]로 나와있는데 이는 SYN을 의미합니다. 

 

서버는 시퀀스 넘버에 대한 응답으로 SYN + 1을 한 3676236708 값을 ACK으로 보냄과 동시에 자신의 시퀀스 넘버 1278550809를 전송합니다. 

Flags는 [S.]으로 확인되는데 여기서 . 은 ACK를 의미하여 SYNACK를 의미합니다.

 

다시 클라이언트는 서버에 전달받은 SYN에 대한 응답으로 SYN + 1을 한 1278550810을 보내게 됩니다.

Flags는 [.]으로 ACK르 의미합니다.

 

감사합니다.