미션! 패킷을 안전하게 전송하라

정다빈·2025년 3월 5일
0
post-thumbnail

제가 신입 개발자로 취업 준비를 할 때, 면접에서 TCP/IP에 대한 질문을 받은 적이 있었어요.
저는 당황한 목소리로 "잘 모르겠습니다."라고 대답을 했었던 것 같아요. 🫣
이후에 책으로 네트워크에 대해 공부해 보긴 했지만, 혼자 개념을 이해하기 어려워서 금방 포기하게 되더라구요.
최근에 인프런 강의를 통해 다시 공부하게 되었고, 어느 정도 개념을 이해할 수 있게 되었어요.

이번 글에서는 제가 이해한 TCP/IP에 대해 이야기해 볼게요.

💁🏻‍♀️ 비전공자가 넓고 얕게 개념을 익히는 것이 목표이기 때문에, 전공자분들에게는 다소 가벼운 내용일 수 있어요.

📑 OSI 7계층

네트워크에 관심이 있다면 OSI 7계층에 대해 들어본 적이 있을 거예요. OSI 7계층은 네트워크 통신에 필요한 기능들을 7개로 나누어 레이어 형태로 쌓은 것을 말해요. 마치 크레이프 케이크처럼요.🤤

이 7계층들은 컴퓨터 내부의 하드웨어와 소프트웨어로 구현되어 있어요.

IP는 3계층에 해당하는 프로토콜로, 서로 다른 네트워크 간의 통신을 가능하게 해요. 예를 들어, 성남에 있는 저와 서울에 있는 동생이 메신저를 주고받으려면 IP가 필요해요.

TCP는 4계층에 해당하는 프로토콜로, 신뢰성 있는 데이터 송수신을 가능하게 해요. 예를 들어, 제가 동생에게 사진을 전송한다고 가정해 볼게요. 사진 데이터는 너무 커서 한 번에 보낼 수 없기 때문에, TCP는 사진을 작은 조각으로 나누고 순번을 붙여서 보내요.

수신 측(동생)에서는 받은 패킷을 모은 후, 순번대로 붙여서 원래의 사진 데이터로 복구해요.

만약 패킷을 전송하는 과정에서 일부가 누락되면, 수신 측은 송신 측에게 "이 조각이 빠졌으니까 다시 보내줘!"라고 요청해서 완성된 사진을 만들어요.

TCP는 데이터를 조각내서 안전하게 배달하고, 빠진 조각을 요청해서 원래의 데이터를 완성하는 역할을 해요.

TCP/IP는 흔히 묶어서 이야기하지만 TCP는 4계층, IP는 3계층에 해당하는 서로 다른 계층이에요. 그러나 TCP는 IP를 기반으로 신뢰성 있는 데이터 송수신을 하기 때문에 두 프로토콜을 함께 TCP/IP라고 불러요.

3️⃣🤝🏻 통신 전 3번의 악수

TCP/IP는 신뢰성 있는 데이터 송수신을 위해, 통신 전 3단계를 거쳐 서로 데이터 송수신이 가능한 상태인지 확인해요. 이를 3-Way Handshake라고 불러요.

  1. 클라이언트가 서버에 연결을 시도해요. 이때, 클라이언트는 랜덤 시퀀스 번호 1000을 생성해서 서버에 요청(SYN)을 보내요. "내 시퀀스 번호는 1000이고, 너랑 연결하고 싶어!"
  2. 서버는 연결 요청을 받으면 이에 대한 응답(ACK)과 요청(SYN)을 보내요. 마찬가지로, 서버도 랜덤 시퀀스 번호 4000을 생성해서 함께 보내요.
    • 응답(ACK) : "좋아! 연결할 준비가 되어있다는 의미로, 네 시퀀스 번호에 +1을 더해서 1001을 보낼게."
    • 요청(SYN) : "나도 너랑 연결을 해야 하는데, 내 시퀀스 번호 4000을 같이 보낼게!"
  3. 클라이언트는 서버로부터 응답(ACK)과 요청(SYN)을 받으면 응답(ACK)과 함께 시퀀스 번호를 보내요. "알았어, 이제 데이터를 주고받자는 의미로 네 시퀀스 번호에 +1을 더해서 4001을 보낼게"
  4. 클라이언트와 서버가 서로 데이터 통신을 시작해요.

클라이언트는 2단계에서 응답(ACK)을 받았으므로 서버와 연결이 되었다고 판단하지만, 서버는 3단계에서 응답(ACK)을 받기 때문에 이때 클라이언트와 연결이 되었다고 판단해요.

RTT(Round Trip Time)이란?
네트워크 요청을 시작한 후 응답을 받는 데 걸리는 시간을 의미해요. 이 시간이 50ms라고 가정했을 때, 클라이언트는 1 ~ 2단계가 50ms 이내에 완료되어야 하고, 서버는 2 ~ 3단계가 50ms 이내에 완료되어야 합니다.

4️⃣🤝🏻 통신 후 4번의 악수

TCP/IP는 통신을 안전하게 종료하기 위해 4단계를 거쳐 서로 데이터 통신을 끝내도 되는지 확인해요. 이를 4-Way Handshake라고 불러요.

  1. 클라이언트가 서버에게 연결 종료 요청(FIN)을 보내요. 이때, 클라이언트는 랜덤 시퀀스 번호 1000을 생성해서 함께 보내요. "이제 통신을 종료하자! 내 시퀀스 번호는 1000이야."
  2. 서버는 클라이언트에게 응답(ACK)을 보내요. 마찬가지로, 서버도 랜덤 시퀀스 번호 2000을 생성해서 함께 보내요. "네 종료 요청을 확인했다는 의미로, 네 시퀀스 번호에 +1을 더해서 1001과 내 시퀀스 번호 2000을 보낼게."
    하지만 서버는 데이터 처리 등 아직 할 일이 남아있을 수 있기 때문에, 연결을 끊지 않고 필요한 작업을 계속 진행해요.
  3. 서버는 남은 작업을 마치고 클라이언트에게 종료 요청(FIN)을 보내요. "나도 이제 종료할게! 내 시퀀스 번호에 +1을 더해서 2001을 함께 보낼게."
  4. 클라이언트는 서버에게 응답(ACK)을 보내요. "네 종료 요청을 확인했다는 의미로, 각 시퀀스 번호에 +1씩 더해서 10022002를 보낼게. 이제 완전히 종료할게~"
    이때 클라이언트는 바로 종료하지 않고, 일정 시간 동안 연결을 유지했다가 종료해요.
  5. 서버는 최종 응답(ACK)을 받으면 종료 상태가 돼요.

🤠 마무리

이렇게 TCP/IP 통신이 어떻게 이루어지는지 짧게 알아보았습니다. 예전에는 SYN, ACK가 뭔지, 시작할 때는 3번인데 왜 종료할 때는 4번인지 이해가 잘 안 갔는데요, 인강 선생님 덕분에 수월하게 이해할 수 있었던 것 같아요!

OSI 7계층 중에서 3계층과 4계층은 가장 중요하게 다뤄지는 것 같은데요, (강의 분량도 가장 많았던...🥲) 기회가 된다면 더 자세한 내용을 블로그에서 이야기해 볼게요.

profile
Frontend Developer

0개의 댓글