-
[네트워크] TCP vs UDP네트워크 2021. 11. 28. 00:47
들어가기 전에...
- TCP은 Transmission Control Protocol의 약자이고 UDP는 User Datagram Protocol의 약자입니다.
- 두개의 공통점은 Protocol이라는 단어가 들어간다는 것이 있습니다.
- 프로토콜(Protocol)이란, 컴퓨터 사이의 데이터 교환 방식을 정의하는 규칙 체계입니다. 수 많은 컴퓨터 사이에서 막대한 양의 데이터가 오고 갈텐데, 이 때 맞춰진 형식이 아닌, 자기 맘대로 형식으로 데이터통신을 한다면 처리하기 굉장히 까다로워질 것입니다.
- 예를 들어, ㅇㅇ도 ㅁㅁ시 ㅂㅂ로에 사는 철수에게 편지를 보낸다고 했을 때, 우리는 수신자에 도로명 주소와 받는 사람의 이름, 우편번호를 기재합니다. 이 것은 편지를 전달할 때 명확하고 빠르게 전달하기 위함입니다. 누군가 이것을 무시하고 수신자(철수) 만 쓰거나 주소는 적지않고 우편번호만 적는다면, 전달되는데 어려움이 있을 것입니다. 이렇게 원활한 전송을 위해서 규칙을 정해논 것을 프로토콜이라고 합니다.
- 프로토콜의 종류는 수없이 많으며, HTTP, TCP, UDP, SMTP, FTP등 다양합니다.
- TCP와 UDP는 모두 OSI 7계층 중 4번째 계층인 Transport Layer에 속합니다.
TCP란?
- TCP는 정확한 데이터 전송을 위한 전송 프로토콜입니다.
- TCP는 IP와 함께 사용되며 TCP/IP로 묶어서 말하기도 합니다. TCP는 데이터가 정확히 전달되었는지 검사하는 역할을 수행함과 동시에 IP주소를 이용해서 보내고자하는 수신자와 잘 연결되었는지 확인하는 역할도 수행합니다.
- 부가적으로 흐름 제어 및 혼잡 제어를 통해서 데이터가 순서에 맞게 전송되었는지, 속도는 적당한지 등의 검사도 수행합니다.
- 이러한 정확한 전송을 위해서 TCP는 양쪽의 연결을 위해서 3-way handshaking을, 연결 종료를 위해서 4-way handshaking을 거칩니다.
3-way handshaking과 4-way handshaking 3-way handshaking
- 클라이언트에서 서버와 연결하고 싶다는 신호로 연결 요청 플래그(SYN)을 보내며, 이 SYN에는 임의의 번호인 시퀸스 넘버를 포함하고 있습니다.
"서버야 나랑 연결하자!(SYN). 이번 통신 번호는 456번이야(SEQ=456)" - 서버는 클라이언트의 SYN을 받고 확인했다는 뜻의 ACK(Acknowledge) 플래그를 보내는데, 이 때 해당 SYN에 대한 답변이라는 증거로 SYN의 시퀸스 넘버에 1을 더한 값을 ACK에 함께 보냅니다. 그와 동시에 데이터 전송을 위한 포트를 열어달라는 SYN을 보냅니다. 이 SYN에도 마찬가지로 시퀸스 넘버가 존재합니다.
"통신번호 456번에 대해 잘받았어(ACK, SEQ=457)! 포트좀 열어줄래? 이번 통신번호는 2141이야(SYN, SEQ=2141)" - 클라이언트는 서버의 ACK와 시퀸스 넘버를 통해 내 SYN이 잘 전달되었음을 확인하고, 서버의 SYN과 시퀸스 넘버를 받고 포트를 열어 ESTABLISHED(연결 수립됨) 상태로 변경후 서버에 열었다는 표시로 ACK를 전송합니다. 이때도 서버가 준 시퀸스넘버에 1을 더해서 보내줍니다.
"통신번호 2141번 확인을 잘 받았어.(ACK, SEQ=2142) 이제 연결할게"
- 그리고 서버는 ACK를 수신하고 마찬가지로 ESTABLISHED상태가 되며 연결이 수립되어 데이터 전송을 시작합니다.
4-way handshaking
- 클라이언트에서 서버와 연결을 종료하고 싶다는 신호로 연결 종료 플래그(FIN)를 보내며, 이 FIN에도 임의의 번호인 시퀸스 넘버를 포함하고 있습니다.
"서버야 나랑 연결 끊자!(FIN). 이번 통신 번호는 1234번이야(SEQ=1234)" - 서버는 클라이언트의 FIN을 받고 확인했다는 뜻의 ACK 플래그를 보내는데, 이 때 해당 FIN에 대한 답변이라는 증거로 SYN의 시퀸스 넘버에 1을 더한 값을 ACK에 함께 보냅니다. 하지만 현재 전송중인 데이터가 있을 수도 있으므로 연결이 바로 종료되는 것은 아니고 추후 종료할 것임을 알리기만 합니다. 이 때 시퀸스넘버를 또하나 같이 보냅니다.
"알겠어(ACK + 1235)! 지금 보내고 있는거만 보내고 끊을게. 이번 통신번호는 4321이야(SEQ=4321)" - 서버는 서로 보내던 데이터 전송이 종료되었다고 판단하기 위해 얼마간의 시간을 기다린 뒤 FIN을 시퀸스 넘버와 함께 전송하는데, 전에 서버가 2번에서 보냈던 ACK다음의 FIN이란 뜻으로 2번의 SEQ에 1을 더해서 시퀸스넘버로 보내고, 1번 FIN을 통한 FIN이란 뜻으로 1번 FIN의 SEQ에 1을 더한 값도 같이 보낸다.
"아까 우리가 종료하기로 했지?(FIN + 1235) 이제 종료해도 될 것 같아(SEQ=4322)" - 클라이언트는 서버의 FIN을 받고 FIN을 잘 받았다는 답변으로 ACK를 전송합니다. 이때 1번에서 보냈던 FIN의 SEQ에 1을 더해서 SEQ넘버를 보내고, FIN을 잘 받았다는 의미로 3번 FIN의 SEQ넘버에 1을 더해서 함께 전송합니다.
"통신번호 4322번 확인을 잘 받았어.(ACK + 4323). 이제 종료하자(SEQ=1235)"
- 서버는 4번에서 클라이언트가 보낸 ACK를 받자마자 통신을 종료하고, 클라이언트는 서버에서 추가적으로 더 보내는 데이터가 있을수도 있으므로 잠시 대기한 뒤 통신을 종료합니다.
이렇게 3-way, 4-way handshaking을 거치기 때문에 TCP는 통신을 할 때, 보내고자 하는 상대에게 정확하게 전송할 수 있습니다.
UDP란?
- UDP는 비연결 지향적인 프로토콜로 신뢰성이 보장되지 않아도 되는 큰 데이터를 빠르게 보내기 위한 프로토콜 입니다.
- UDP는 TCP와 다르게 3-way handshaking이나 4-way handshaking을 거치지 않고, 혼잡제어나 흐름제어를 하지 않아서 중간에 데이터 패킷이 유실되거나 순서가 바뀌더라도 어떠한 조치도 하지 않습니다. 따라서 데이터 전송에 대한 신뢰성이 떨어지지만 속도가 빠릅니다.
- 대표적으로 실시간 음악 및 동영상 스트리밍 등의 빠르고 막대한 양의 데이터 전송이 필요할 때 사용합니다.
마치며
- 조금 느리더라도 정확한 데이터 전송을 위해서는 TCP
- 데이터에 신뢰성이 조금 줄어들더라도 빠르게 전송하기 위해서는 UDP