해갈 2023. 12. 18. 19:22

들어가며

이전에 IP 프로토콜에서 발생했던 수 많은 문제들이 있었습니다.

중간에 패키지 소실이 되고, 순서가 꼬이는 것들을 TCP 프로토콜이 해결해줍니다.

UDP 는 그런 걸 해결해주지 않는데 그래도 도움이 되는 것이 있습니다.

그래서 UDP 도 뒤에서 설명 덧붙이겠습니다.

 

인터넷 프로토콜 스택의 4계층

먼저 인터넷 프로토콜 스택의 4계층에 대해 간단하게 알아보면, 제일 위에 HTTP 나 FTP 나 애플리케이션에서 쓰는 계층이 있고, 그 밑에 TCP, UDP 전송 계층이 있고, 그 밑에 이전 게시글에서 봤던 인터넷 계층이라고 IP 가 있습니다.

그 밑에 랜카드 등등을 포함해서 실제 네트워크 랜 드라이버 등등을 포함해서 네트워크 인터페이스 계층이 있습니다.

그래서 이 IP 를 위에 TCP 를 올려 보완해주는 역할을 한다고 이해하면 됩니다.

 

프로토콜 계층

근데, 이렇게만 보면, 이해가 잘 안되고, 컴퓨터를 생각할 때는 사실 3가지만 머리에 들어옵니다.

우리가 사용하는 애플리케이션들 웹브라우저, 네트워크 게임이나 채팅 프로그램 등이 있고, 그 밑에 윈도우나 리눅스 등등 운영체제가 있죠. 그리고, 맥OS 그리고, 그 밑에 실제 네트워크와 관련된 랜 드라이버, 랜카드 같은 랜 장비들이 있습니다.

이 그림을 참고해 hello world 라는 메시지를 미국에 있는 친구에게 전송하려고 합니다.

그럼 먼저 소켓 라이브러리라는 걸 보통 사용하죠. 그래서 소켓 라이브러리를 통해서 os 계층에다가 hello 라는 메시지를 넘깁니다. 그러면, os 계층에서 tcp 가 어떻게 하냐면, hello 라는 메시지에다가 tcp 정보를 씌웁니다.

tcp 밑에 ip 계층이 다 있죠? 그래서 여기서 tcp 정보에다가 또 밖에다 또 ip 와 관련된 데이터들을 씌웁니다. 이렇게 ip 패키지 생성이 되죠.

이 IP 패킷은 결국 IP 와 관련된 정보가 있고, 그 안에 또 TCP 와 관련된 정보가 있고, 그 안에 실제 제가 만들었던 hello world 라는 메시지가 있습니다. 그리고, 이게 진짜 네트워크 인터페이스를 통해서 랜카드를 통해서 나갈 때 이 이더넷 프레임이 포함돼서 나갑니다.

참고로 이더넷 프레임은 랜카드에 등록된 MAC 주소와 같은 물리적인 어떤 정보들이 포함이 되어 있습니다.

 

 

IP 패킷 정보

그래서 IP 패킷 같은 경우에는 출발지 IP 랑 목적지 IP 가 있습니다. 제가 "여기서 출발하고, 목적지는 저기야" 라고 전송 데이터를 넣으면 되는 거죠.

패킷 : 패킷은 수화물을 뜻하는 패키지라는 것과 덩어리를 뜻하는 버킷이라는 것의 합성어입니다.

그래서 뭔가 실제 우리가 택배 박스에 데이터 넣듯이 해서 보내는 거랑 비슷하죠.

 

 

TCP/IP 패킷 정보

이 IP 패킷 안에다 TCP 와 관련된 정보가 들어갑니다. 이게 무엇이냐면, 출발지에 대한 포트라는 것이 들어갑니다.

포트는 뒤에서 설명드리겠습니다.

그리고, 전송 제어와 관련된 정보 순서와 관련된 정보, 검증과 관련된 정보가 들어갑니다. 그래서 IP 만으로 해결이 안됐던 순서 제어 문제나 이런 것들이 해결이 됩니다.

그리고, 그 안에 실제 제가 만들었던 전송 데이터를 넣게 됩니다. 이렇게 해서 보내기 때문에 tcp 는 저 정보들을 가지고 이런 것들을 해결하는데요.

 

TCP 의 특징

TCP 는 전송 제어 프로토콜(Transmission Control Protocol)입니다. 뭔가 전송을 어떻게 할지를 제어를 한다는 거죠. 

 

1. TCP 3 way handshake(연결지향)

연결이 되었는지, 안되었는지 확인 후, 우선 연결을 하고, 메시지를 보냅니다. 그러면 상대방의 컴퓨터가 꺼져 있어 연결이 잘 안되어 있더라도 연결 설정을 이루고 난 뒤, 메시지를 보냅니다.

TCP IP 프로코롤로 뭔가 연결을 하면 어떻게 진행되는지에 대한 설명을 하겠습니다.

연결을 설정하기 위해 클라이언트와 서버 간에는 세 단계 핸드셰이크가 이루어집니다.

1. 먼저 클라이언트에서 서버로 SYN(Synchronize) 패킷을 보냅니다.

2. 그러면 서버에서 요청을 확인하고, ACK(Acknowledge) 와 SYN 을 포함한 응답 패킷을 클라이언트한테 보내면서 나도 연결해줘 라고 보냅니다.

3. SYN + ACK 메시지를 받은 클라이언트는 알았다는 반응을 보내기 위해 ACK 를 다시 보내면서 연결을 확립합니다.

결국, 클라이언트도 SYN 을 보내고, 서버도 SYN 을 보내고, 또 양쪽 모두 ACK 메시지를 보내면서 통신을 하게 되죠. 그래서 이렇게 3-way handshaking 을 하면, 클라이언트도 서버를 믿을 수 있고, 서버도 클라이언트를 믿을 수 있는거죠.

이런 과정을 통해

4. 데이터를 전송하게 됩니다.

만약 서버가 중간에 꺼져버렸다면, SYN 을 보낸 클라이언트는 꺼진 서버로부터 아무런 응답을 받지 못했기에 문제가 있다고 판단해 연결이 되지 않습니다. 그럼 hello world 라는 메시지를 안 보내겠죠. 그리고 참고로 요즘엔 최적화가 돼서 마지막 3번 ACK 를 보낼 때 같이 데이터도 전송합니다. 그래서 이제 3way handshaking 으로 연결합니다.

 

그렇지만, 지금까지는 개념적으로만 연결이 된 겁니다.

그게 무슨 말이냐면, 물리적으로 연결이 된다는 표현은 랜선을 꼽는다는 말이 맞습니다.

그렇지만, TCP IP 연결은 그런 개념은 아니에요. 단지 클라이언트랑 서버랑 SYN 보내고, SYN + ACK 보내고, ACK 을 보냈으니까 서로 연겨이 됐구나 라고 논리적으로 연결이 된 것이고, 중간에 수많은 서버들이 있겠죠. 클라이언트에서 서버까지 가는데 수많은 서버(노드)를 거칩니다. 그 서버들을 모릅니다. 

그래서 개념적으로만 연결이 된 거라고 이해하시면 됩니다.

 

 

2. 데이터 전달 보증

연결 지향적인 부분과 두 번째는 데이터를 전달한 것을 보증을 해줍니다.

제가 메시지를 보냅니다. 근데 이 패킷이 만약 중간에 누락이 됐습니다. 그러면 제가 알 수 있습니다. 데이터 전송 중에 발생한 손실, 에러, 순서 변경 등의 문제에 대비해 TCP 는 각각의 세그먼트에 일련번호와 확인응답 번호를 할당합니다.

수신자는 정확한 데이터 전송을 확인하기 위해 ACK 를 보내고, 손실된 세그먼트에 대해서는 재전송을 요청합니다.

이렇게 함으로써 데이터 전송 중 발생한 문제를 감지하고, 복구해 신뢰성 있는 통신을 제공합니다.

이런 특성때문에 현재는 대부분 애플리케이션에서 TCP 를 사용합니다.

 

3. 순서 보장

예를 들어, 제가 packet 을 1번, 2번, 3번 순서로 보냅니다. 되게 큰 메시지가 있어서 제가 잘라서 보낸 거죠. 그러면 서버가 도착했는데 만약에 1번, 3번, 2번 순서로 도착합니다. 

그럼 내부적으로 최적화하는 로직에 따라 다르겠지만, 기본적으로는 틀린 부분을 감지하고, 틀린 패킷 2번부터 다시 보내라고 서버는 클라이언트에게 요청합니다. 요청을 받은 클라이언트는 요청에 맞게 2번부터 다시 서버로 보냅니다. 이렇게 해서 순서가 보증이 돼죠.

어떻게 가능하냐면 전송 제어 정보 TCP 데이터 안에는 전송 제어 정보, 순서 정보, 검증 정보들이 추가되어 있습니다. 그렇기 때문에 가능한 거죠. 그래서 이제 TCP 를 신뢰할 수 있는 프로토콜이라고 보통 이야기합니다.

 

 

UDP 프로토콜

UDP 는 TCP 랑 같은 계층에 있는 IP 계층 바로 위에 있는 프로토콜입니다. 그치만 UDP 는 기능이 없어요.

3way-handshaking 도 없고, 데이터 전달 보장도 하지 않고, 순서도 보장하지 않습니다. 

이전에 배웠던 IP 랑 똑같습니다. 그 위에 올라가는 게 거의 없는데, 뭐가 하나 추가가 되냐면 PORT 라는 것이 추가됩니다.  TCP 정보에도 포트가 있습니다. UDP 정보에도 포트가 있구요. 그런데 IP 프로토콜에는 포트가 존재하지 않습니다. 바로 이 포트가 하나의 IP 에서 여러 애플리케이션의 패키지가 오는데, 어떤 패키지인지 구분하게 해주는 것이 포트입니다.

추가로 체크섬이라고, 메시지에 대해서 제대로 맞는지 검증해주는 데이터, 그 정도로만 간단하게 UDP 프로토콜에 추가되어 있습니다. 이런 UDP 에게도 장점이 있습니다.

 

UDP 장점

 

1. 낮은 지연 시간

UDP 는 연결 설정과 연결 종료의 과정이 없기 때문에 TCP 보다 지연 시간이 낮습니다. 데이터를 전송하는 데에 딜레이가 적으므로, 실시간 응용 프로그램에서 유용합니다. 예를 들어, 음성 통화나 온라인 게임과 같은 응용 분야에서는 지연시간이 중요하므로 UDP 가 선택될 수 있습니다.

 

2. 단순한 구조

UDP 는 간단한 헤더 구조를 갖고 있습니다. TCP 에 비해 더 적은 오버헤드가 발생하며, 이로써 빠른 데이터 전송이 가능합니다. 복잡한 연결 설정 및 종료 과정이 없어서 자원 소모가 적습니다.

 

그래서 이 UDP 는 거의 하얀 백지와 같은데 최근 들어 각광을 받고 있습니다. 이유는 처음 배울때, TCP 프로토콜은 뭔가 신뢰할 수 있는 정보들을 보내야 되고, 영상이나 사진 등 깨져도 되는 건 UDP 로 보내도 된다고 배웠지만, 사실은 시간이 지나면서 TCP 프로토콜이 거의 90% 이상 점유를 했었습니다. 심지어 영상을 보낼 때에도 TCP 프로토콜을 사용했죠.

그런데 또 시대가 좀 바뀌면서 최근에는 UDP 가 뜨고 있는데, 웹 브라우저에서 HTTP 통신을 할 때, HTTP 최근에 3스펙이 나왔는데, 여기서 TCP IP 핸드쉐이킹 하려면 위처럼 3가지 단계를 거쳐야 합니다. 그런 것까지 다 줄여보자라고 해서 더 최적화를 하려면 이제 HTTP3 같은 경우에 UDP 프로토콜을 사용하면서 지금 굉장히 뜨고 있습니다.