본문 바로가기

네트워크

전송계층 TCP/UDP

목차

  1. 전송 계층
  2. TCP
  3. UDP

전송 계층  : 목적지에 신뢰할 수 있는 데이터를 전달

네트워크 - 전송 계층의 역할 포스팅을 한 적이 있었다. 전송 계층의 역할에 대해서만 알고 싶다면 이 글을 참고하는게 더 좋을 것 같다.

 

물리 계층, 데이터 링크 계층, 네트워크 계층의 3계층이 있으면 목적지에 데이터를 보낼 수 있다.

하지만 데이터가 손상, 유실되더라도 위 3계층에서는 아무런 조치를 취하지 않는다. 전송 계층이 필요한 이유는 이 때문이다. 전송 계층은 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 존재한다.

 

전송 계층의 기능

1. 오류 점검

2. 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 기능

 

오류 점검은 오류가 발생하면 데이터를 재전송한다. 이를 통해 데이터의 손상, 유실을 막는다.

 

어떤 애플리케이션인지 식별한다는 의미는 다음과 같다. 웹 브라우저와 메일 프로그램 애플리케이션이 있을 때, 현재 데이터를 어디로 전송할 지, 식별해준다는 의미이다. 예를 들면 웹 브라우저에 필요한 데이터인데 메일로 보내지 않도록 애플리케이션을 식별한다는 의미이다. 이 부분은 이번 포스팅에서 추가로 다루지 않기 때문에 이것이 가능한 이유를 가볍게만 언급하겠습니다.

 

TCP 헤더
전송 계층의 헤더(TCP, UDP 통신 둘다)에서는 발신지/목적지 포트 번호를 보낸다. 이 때문에 어떤 애플리케이션인지 식별이 가능한 것이다.

 

 

연결형 통신/비연결형 통신

전송 계층의 특징은 신뢰성/정확성 그리고 효율성으로 나눌 수 있다. 신뢰성/정확성있게 데이터를 보내는 것을 연결형(양방향) 통신, 효율적으로 데이터를 보내는 것을 비연결형 통신이라고 한다.

 

연결형 통신에서 개발에 관심이 있다면 한 번 쯤은 들어봤을 3-way-handshake가 나온다. 다르게 말하면 연결형 통신을 TCP /비연결형 통신을 UDP라 부른다.

 

두 통신의 차이를 가볍게 짚고만 넘어가면 핵심은 확인의 여부다. TCP는 서로 통신이 가능한지를 확인한다. 그래서 신뢰성이 있다고 할 수 있다. 그에 반해 UDP는 일방적으로 데이터를 보낸다. 확인 절차를 거치는 것도 리소스를 사용하는 것인데 그 과정이 생략됐기에 효율적이라고 말하는 것이다.

 


TCP : 신뢰할 수 있는 정확한 통신

송신하는 측에서 응용 계층부터 물리 계층까지 계층별로 데이터를 전달할 때 헤더를 붙인다. 참고로 이를 캡슐화라 부른다.

전송 계층에서 TCP로 전송하면 아래와 같이 데이터에 TCP 헤더가 붙는다.

 

 

위 표에서 빨간색 박스를 친 부분을 TCP flag(혹은 코드 비트)라고 부른다. 해당 영역의 역할은 연결의 제어 정보를 기록한다. 결론부터 말하면 TCP flag 덕분에 신뢰성/정확성을 확보할 수 있다.

 

URG ACK PSH RST SYN FIN
0 0 0 0 0 0

각각의 flag 는 0과 1의 값을 가진다. 0 비활성화 1 활성화의 의미이다. TCP flag 를 통해서 연결 확립/연결 종료를 할 수 있고 이를 통해 TCP 통신이 신뢰성/정확성을 확보하는 것이다.

 

여기서는 ACK, SYN, FIN의 의미만 살펴보겠다.

ACK(acknowledgement) - 응답

SYN(synchronization) - 연결 요청

FIN(finish) - 연결 요청 종료

 

연결 확립

TCP는 연결형 통신이라고 했다. 연결형 통신은 양방향이다. 양측이 모두 연결할 준비가 됐음을 보장해야 한다. 이를 위해 

3-way-handshake 를 수행한다. 다음은 3-way-handshake 과정이다.

 

컴퓨터 A , B가 통신한다고 가정

 

1. A는 B에게 SYN(연결 요청)을 보냄

2. B는 이에 ACK(응답)하고 A에게 SYN(연결 요청)을 보냄

왜냐하면 A가 SYN을 보내고 연결이 불가능한 상태일수도 있기 때문에 SYN을 보냄

3. A는 B의 SYN(연결 요청)에 ACK(응답)

 

이것이 바로 3-way-handshake 이다. 참고로 이 과정을 통해 데이터를 전송하는것이 아니라, A, B 연결을 확인하여 데이터를 전송하기 위한 준비를 마치는 과정이다.

 

연결 종료

연결 종료에서는 ACK, FIN을 사용한다. 여기서도 컴퓨터 A, B가 통신한다고 가정한다.

 

1. A는 B에게 FIN을 보내 연결 종료 요청을 보낸다.

2. B는 A의 FIN에 ACK한다.

3. 이후 B는 A에게 FIN을 보낸다.

4. A는 B의 FIN에 ACK한다.

 

2, 3번 과정이 왜 분리되었는지 궁금한데... 찾아봐도 잘 안나온다.ㅠ

 

다시 한 번 말하지만 연결 확립 및 종료는 TCP 통신의 신뢰성/정확성을 확보하기 위함이다. 연결 확립이야 당연한 말이고 연결 종료의 경우에도 예기치 않게 종료된다면 TCP의 신뢰성에 문제가 생길 수 있기 때문이다.


 UDP : 효율적인 통신

UDP 헤더의 구조는 TCP 헤더에 비해 아주 심플하다.

 

TCP는 신뢰성/정확성을 확보할 필요가 없어요. 그래서 연결 확립/연결 종료에 필요한 flag가 헤더에 없는 것을 볼 수 있습니다. 3(4)-way-handshake를 할 수도 없고 할 필요도 없습니다. 일방적으로 컴퓨터 A에서 컴퓨터 B로 데이터를 보내는 겁니다.참고로 UDP는 불특정 다수에게(브로드캐스트 통신) 데이터를 일괄 통신하는데도 적합해요.

 

일반적으로 UDP는 동영상, 전화 등에서 활용할 수 있죠. 제가 항해99에서 진행했던 프로젝트에서는 webRTC같은 기술을 사용하지는 않았지만 사용한 팀들은 UDP 통신을 했을 거에요!


마지막으로 글을 작성하며 참고했던 테코톡 영상에서는 우리가 TCP/UDP에 대해 공부해야하는 이유가 후반부에 간략히 나오기에 참고하면 좋을 것 같습니다.

 

reference

모두의 네트워크

[10분 테코톡] 👨‍🏫르윈의 TCP UDP