네트워크의 계층들 중 전송 계층(Transport Layer)에서 사용하는 프로토콜에 대해서 알아보자.
TCP(Transmission Control Protocol)
TCP는 연결 지향적 프로토콜이다. 이는 클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜을 의미한다.
클라이언트가 연결 요청을 하고, 서버가 연결을 수락하면 통신 선로가 고정되고, 모든 데이터는 고정된 통신 선로를 통해 순차적으로 전달된다.
그렇기 때문에 TCP는 데이터를 정확하고 안정적으로 전달할 수 있다.
TCP는 호스트간 신뢰성 있는 데이터 전달과 흐름제어를 한다. TCP 프로토콜은 신뢰성 있는 데이터의 전송을 위해 확인 작업을 거치는데, 패킷을 성공적으로 전송하면 ACK라는 신호를 날리고 만약에 ACK 신호가 제 시간에 도착하지 않으면 Timeout이 발생해 패킷 손실이 발생한 패킷을 다시 전송해준다.
TCP는 이렇게 데이터를 송신할 때마다 확인 응답을 주고 받는 절차가 있으므로 통신의 신뢰성이 올라간다.
주로 Client와 Server 또는 P2P Socket 통신 등 네트워크를 사용한 통신을 할 때 TCP 통신을 많이 사용한다.
TCP의 단점
- 데이터로 보내기 전, 반드시 연결이 형성되어야 함.
- 일대일 통신만 가능.
- 고정된 통신 선로가 최단선이 아닐 경우 상대적으로 UDP보다 데이터 전송속도가 느림.
TCP의 특징
- 연결형 서비스로, 연결이 성공해야 통신이 가능함.
- 데이터의 전송 순서를 보장함.
- 신뢰성있는 데이터를 전송.
- 데이터 흐름 제어(수신자 버퍼 오버플로우 방지) 및 혼잡 제어(패킷 수가 과도하게 증가하는 현상 방지).
- UDP보다 전송 속도 느림
3way handshaking
TCP 통신을 위한 네트워크 연결은 3way handshake라는 방식으로 연결된다. 이는 서로의 통신을 위한 관문(port)을 확인하고 연결하기 위해 3번의 요청/응답 후에 연결이 되는 것을 의미한다.
(이 과정에서 가장 많은 시간이 소요되어 UDP보다 속도가 느려지는 주요 원인으로 지목된다.)
연결 과정
- 클라이언트에서 서버에 연결 요청을 하기위해 SYN 데이터를 보냄
- 서버에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고, SYN_RCV로 상태가 변경됨.
- 요청을 정상적으로 받았다는 대답(ACK)과 클라이언트도 포트를 열어달라는 SYN을 같이 보냄.
- 클라이언트에서는 SYN+ACK를 받고 ESTABLISHED로 상태를 변경하고 서버에 ACK를 전송.
- ACK를 받은 서버는 상태가 ESTABLISHED로 변경됨.
위와 같이 3번의 통신이 정상적으로 이뤄지면 서로의 포트가 ESTABLISHED되면서 연결됨.
UDP(User Datagram Protocol)
UDP는 전송계층의 비연결 지향적 프로토콜이다. 비연결 지향적이란 데이터를 주고 받을 때 연결 절차를 거치지 않고 발신자가 일방적으로 데이터를 발신하는 방식을 의미한다.
연결 과정이 없기 때문에 TCP보다는 빠른 전송을 할 수 있지만 데이터 전달의 신뢰성은 떨어진다.
UDP는 발신자가 데이터 패킷을 순차적으로 보내더라도 이 패킷들은 서로 다른 통신 선로를 통해 전달될 수 있다.
먼저 보낸 패킷이 느린 선로를 통해 전송될 경우 나중에 보낸 패킷보다 늦게 도착할 수 있고, 최악의 경우 잘못된 선로로 전송되어 유실될 수도 있다.
이럴 경우 TCP와는 달리 중간에 패킷 유실이나 변조가 일어나도 재전송을 하지 않는다.
UDP의 단점
- 데이터의 신뢰성이 없음.
- 의미있는 서버를 구축하기 위해서는 일일히 패킷을 관리해줘야 함.
UDP의 특징
- 비연결형 서비스로 연결없이 통신이 가능함.
- 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않음.
- 신뢰성 없는 데이터를 전송. (데이터 재전송과 데이터 순서 유지를 위한 작업을 하지 않음).
- 패킷 관리 필요.
- 패킷 오버헤드가 적어 네트워크 부하가 감소되는 장점이 있음.
- 상대적으로 TCP보다 전송 속도 빠름.
References
https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://coding-factory.tistory.com/614