Computer Science

[TIL][CS] TCP/UDP와 동작 과정, TCP 3way handshake

쉬지마 이굥진 2024. 4. 4. 21:00

오늘은 매일 잘 모르니까 해야지 해야지 하면서 다른 공부에 밀렸던 TCP, UDP와 3way handshake에 대해서 공부했다!! 

 

먼저 본론으로 들어가기 전에, TCP/UDP는 왜 알아야 할까.

잠시 생각해 보고 스크롤을 밑으로 내려보자.

 

왜 알아야 하나요 🤔

TCP/UDP는 웹 애플리케이션의 신뢰성, 성능 개선을 하는 중요한 역할을 하기 때문이다. 

 

  • 데이터의 소실 방지, 순서 보장
    ex) 데이터베이스 서버와 통신을 할 때 저장하려고 하는 데이터가 소실되거나, 혹은 순서가 뒤바뀌어버린다면? 낭패 !
  • HTTP3.0에서 도입된 *QUIC(Quick UDP Internet Connections)의 도입 배경 이해
    => 이러한 상황을 이해하기 위해서 TCP/UDP를 알고 있어야 한다. 

 

*QUIC = = TCP 대신 UDP를 사용하여 안정적이고 빠른 웹 페이지 로딩 및 통신을 지원하는 프로토콜

 

📌 TCP/IP 모델

TCP/UDP에 대해 알기 위해선 우선 TCP/IP 모델에 대한 이해가 필요하다. 

 

TCP/IP 모델을 공부할 때 OSI 7계층과 함께 표시된 것을 많이 볼 수 있을 것이다. 

 

OSI 참조모델은 컴퓨터와 컴퓨터 사이의 데이터 전송을 분류한 모델이다. 조금 어렵게 표현해서, 각 계층은 다른 계층에 대해 알 필요 없이 자신의 계층에서 캡슐화와 은닉이 가능하다.

 

그렇다면 TCP/IP 모델은 뭘까? 우리가 범용적으로 사용하는 TCP 프로토콜IP 프로토콜OSI 7계층에 맞춰서 더 추상화(혹은 간략화) 시킨 모델이다.  TCP/IP 모델은 응용 계층, 전송 계층, 인터넷 계층, 네트워크 계층으로 나뉜다.

 

응용 계층은 HTTP, 브라우저라고 생각 하면 된다.전송 계층은 오늘 설명할 TCP/UDP라고 생각 하면 된다.인터넷 레이어는 IP, 네트워크 레이어는 이더넷이라고 생각하면 된다. 

 

그럼 TCP/IP 모델을 통해 실제 네트워크가 이루어지는 과정을 도식화하며 더 깊게 이해해보자. 

 

도식화 이미지에는 너무 복잡하여 담지 못한 부분이 '네트워크 계층'이다. 네트워크 계층의 경우, 클라우드를 사용했을 땐 개발자들이 신경 쓰지 않아도 될 부분이며 점점 시대가 갈 수록 중요성이 떨어지는 부분이라고 한다.

일반적인 기업에서의 전산팀이 이 계층을 담당하게 된다. 

 

📌 TCP 동작 과정

TCP는 위 이미지 순 대로 동작된다.

  1. 먼저 소켓을 생성한다.
  2. 연결을 위한 3 Way Handshake를 진행한다.
  3. 데이터를 송신, 수신한다.
  4. 다 마친 뒤에는 연결을 끊기 위한 4 Way Handshake를 진행한다.

각 단계별로 자세한 과정을 살펴볼 건데, 그 전에 주로 사용되는 TCP 헤더 용어에 대해 짚고 넘어가자. TCP 동작 과정을 이해하는 데에 도움이 될 것이다 : ) 

 

📌TCP 헤더

이제 주로 사용되는 TCP 헤더에 대해 알아보자. 

컨트롤 비트  
SYN
ACK
FIN
송신측과 수신측에서 시퀀스 번호를 공유함을 나타냄
수신 데이터의 시퀀스 번호가 유효함
연결 끊기를 나타냄
시퀀스 번호 현재 데이터의 첫 번째 위치가 전체 송신 데이터의 몇 번째 인지를 나타내는 일련번호
ACK 번호 수신 측에 몇 바이트까지 받았는지 송신측으로 보내는 일련번호 

 

[1] 소켓 생성

브라우저에서 호출한 소켓을 생성한다.

이 때, 도메인과 사용할 타입인 TCP를 설정해서 호출하게 되는데, OS의 네트워크 제어용 소프트웨어라고 할 수 있는 프로토콜 스택이 이를 받아서 소켓을 작성하게 되고 *디스크립터를 반환하게 된다. 

 

*디스크립터 = = 소켓의 번호표

 

[2]  3 Way Handshake

 

소켓을 생성한 후에는 3 Way handshake를 진행한다.

브라우저에서 전 단계에서 받았던 디스크립터와, 요청을 보낸 서버 IP 주소, 그리고 포트 번호를 넣어서 호출한다. 

 

그럼 프로토콜 스택이 요청을 받아서 웹 서버로 요청을 보낸다.

 

조금 더 자세하게!

 

(3 way handshake는 중요하니까 ..ㅎㅎ) 

첫 번째로 클라이언트에서 시퀀스 번호를 초기화한다. 초기화한 번호를 공유하기 위해서, 상단의 표에서 말했던 컨트롤 비트 *(SYN)을 설정해서 서버로 보내준다. 

 

* SYN == 시퀀스 번호를 공유함을 나타내는 컨트롤 비트

 

마찬가지로 서버에서 시퀀스 번호를 초기화 후, 서버에서 생성한 시퀀스 번호를 공유하게 된다.

전 단계에서 클라이언트로부터 받은 시퀀스 번호(0)가 잘 도착했다는 것을 알리기 위해 ACK 번호를 설정해 클라이언트로 데이터를 보낸다. 

 

다음으로, 서버로부터 시퀀스 번호를 잘 받았다는 걸 서버에 알려주기 위해 ACK 번호를 설정하고 이 데이터를 보낸다.

 

이러한 일련의 과정을 거치게 되면 서버와 클라이언트는 연결을 맺게 되는 것이다! (두둥 ..)

 

 

[3] 데이터 송신, 수신

3 Way handshake를 통해 클라이언트와 서버가 연결을 맺으면, 데이터 송/수신을 할 수 있게 된다. 

(1)

 

(1) 먼저, 클라이언트에서 write()를 호출한다. 그럼 브라우저에서 받은 Http request 메시지를 받아서 패킷으로 만들어 서버에 전달한다. 

 

(2)

 

(2) 이것을 받은 서버는 응답을 하기 위해 데이터를 만들고, 패킷을 만들어서 클라이언트에 보내면, 클라이언트는 read()를 호출해서 데이터를 읽는다. 

 

(3)

(3) 만약 중간에 패킷이 소실되게 되면, 클라이언트는 서버로부터 일정 시간 동안 응답이 오지 않았을 경우에 이전 패킷을 다시 재전송해서 요청을 하게 된다. 이럼에도 요청에 응답이 오지 않는다면 ?! 클라이언트에서는 데이터 송신 작업을 강제로 종료하고 애플리케이션에 오류를 반환한다. 

 

 

[4]  4 Way Handshake 

다음으로 연결 끊기 동작을 위한 4 way handshake 다.

 

클라이언트에서 close() 를 호출하게 되면, TCP 헤더에 연결 끊기를 나타내는 컨트롤 비트 (FIN)을 설정해서 서버로 보내주게 된다.

서버는 이 FIN에 대한 응답으로 ACK를 설정해서 응답한다. 

이 때, 클라이언트는 서버로부터 FIN 응답이 올 때 까지 기다리는 상태가 된다. (FIN_WAIT)

 

다음으로, 서버에서 보낼 데이터가 없다면! 

바로 close() 를 호출해서 전 단계들과 마찬가지로 컨트롤 비트 (FIN)을 호출해서 클라이언트로 보낸다. 

 

 

마지막으로, 클라이언트에서는 '잘 받았다'는 의미로 ACK 번호를  설정해서, 서버로 전송한다. 

그렇게 되면 클라이언트의 소켓이 말소되고 연결이 끊기게 된다. 

 

소켓이 말소될 땐 바로 말소되는 것이 아니라 일정 시간 뒤에 말소가 되는데, 그 이유는 서버가 ACK 패킷을 받지 못 했을 경우에 다시 재요청을 할 수 있기 때문에 일정 시간 후에 소켓을 말소시키는 것이다. 

 


📌 UDP 동작 과정

TCP의 동작 과정에 대해 봤으니, UDP의 동작 과정에 대해서도 살펴보자. UDP 동작 과정은 TCP에 비해 비교적 간단하다.

 

TCP와 동일하게 소켓을 호출하게 되는데, 이 때 도메인과 사용할 타입인 UDP 설정을 해서 호출한다.

그 후 프로토콜 스택에 소켓을 작성하고, 디스크립터를 반환한다. 

 

 

 

이후 클라이언트에서 sendto() 를 호출하고 브라우저로부터 받은 Http 메세지를 넣어서 패킷으로 만들어 서버로 전송한다.

 

 

서버에서는 응답을 하기 위해 sendto() 를 호출한다.

이 때 TCP와 다른 점 !! 패킷이 소실되게 되더라도 이전 데이터를 재전송 하는 것이 아닌 다음 데이터를 바로 전송한다. 

클라이언트는 이를 신경쓰지 않고 recvfrom() 을 호출해서 데이터를 5 bytes 받게 된다. 

 

TCP와 비교 🤔

TCP와 비교했을 때, handshake 과정이 없고 UDP 헤더 부분이 TCP에 비해 굉장히 단순하다.

 


📌 정리

  TCP UDP
성질 연결 지향성 프로토콜 비연결 지향성 프로토콜
신뢰성 높음 낮음
전송 속도 느림 빠름
사용되는 곳 HTTP 2.0 이하의 버전 대부분에서 사용 DNS, 동영상, 음성 데이터

 

[ 신뢰성 ]

TCPACK 번호 시퀀스 번호를 사용해 패킷의 손실을 방지하고 패킷의 순서를 보장할 수 있으므로 신뢰성이 높다. 따라서 신뢰성이 중요한 응용 프로그램에 주로 사용된다.

ex) 파일 전송, 이메일 전송, 웹 브라우징, etc 

 

상대적으로 UDP는 이런 것들을 사용하지 않아서 신뢰성이 낮다고 볼 수 있다. 

 

[ 전송 속도 ]

TCP는 handshake를 하기 때문에 상대적으로 느리다.

반면 UDP는 사용하지 않기 때문에 상대적으로 빠르다. 따라서 신속한 데이터 전송이 중요한 응용 프로그램에 주로 사용된다. 

ex) DNS 서버와 통신, 실시간 스트리밍, 온라인 게임, etc (실시간 데이터들은 신뢰성 보다는 속도가 중요, 일정 시간이 지난 데이터들은 의미가 없어진다) 


참고 자료

https://medium.com/harrythegreat/osi%EA%B3%84%EC%B8%B5-tcp-ip-%EB%AA%A8%EB%8D%B8-%EC%89%BD%EA%B2%8C-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-f308b1115359

https://www.youtube.com/watch?v=ad4AO1shXsY&t=160s