IP 프로토콜은 서버간 데이터 통신을 할 때 패킷과 IP 주소를 이용한다.
IP 프로토콜은 몇 가지 한계를 갖고 있다.
출발지 IP에서 보낸 패킷을 받을 대상이 없거나 목적지 IP 서버가 현재 패킷을 받을 수없는 상태이더라도 출발지 IP 서버는 패킷을 보내버린다.
또한, 하나의 데이터는 여러 개의 패킷으로 쪼개질 수 있고, 이 패킷들은 인터넷 내의 많은 노드들을 거쳐 목적지 IP에 도달하는데 거쳐가는 노드가 패킷을 보낼 수 있는 상태가 아니거나, 설령 목적지 IP에 도착하더라도 여러개로 쪼개진 패킷이 순서대로 들어온다는 보장이 없다.
마지막으로, 동일 IP에서 여러가지 애플리케이션을 사용한다면 전송되는 패킷이 어떤 애플리케이션 것인지 구분하는 것이 어렵다.
전송 계층은 이러한 IP 프로토콜의 비연결성, 비신뢰성 한계를 극복해주는 계층이고 TCP와 UDP는 전송 계층에 속해있는 프로토콜이다.
TCP (Transmission Control Protocol)
TCP( Transmission Control Protocol)는 IP 프로토콜이 지닌 비연결성, 비신뢰성 한계를 극복해주는 프로토콜이다.
TCP의 대표적인 특징
- Connection 연결 : 클라이언트와 서버 사이의 3-Way-handshake를 이용해 서로 연결되었는지 확인한다.
- 데이터의 안정적인 전달을 보증 : 데이터가 전달될 때마다 송신자에게 ACK응답을 보냄으로 써 데이터가 안정적으로 전달됨을 보증한다.
- Flow Control(흐름 제어) : 송신자가 데이터를 보냈을 때 수신자가 처리할 수 있는 데이터 양을 초과한 경우 ACK 응답과 함께 남은 버퍼 크기(Sliding Window)를 보내줌으로 써 해결한다.
- Congestion Control(혼잡 제어) : 네트워크의 데이터 처리량이 많아 혼잡한 경우 송신자가 전송 속도를 조절한다.
- 데이터의 순서 보장 : TCP 헤더의 Sequence Number를 이용해 해당 패킷의 순서를 보장한다.
- 오류 탐지
TCP 헤더
TCP 헤더를 간단하게 확인해보자.
- Source Port / Destination Port : Port는 동일 IP에서 다른 애플리케이션을 사용하는 경우를 식별하기 위해 사용된다. Source Port / Destination Port는 출발지 IP와 목적지 IP를 식별하기 위해 사용된다.
- Sequence Number : 데이터의 순서를 보장하기 위해 사용한다.
- Acknowledgment Number : 다음에 받고자 하는 데이터 번호를 나타내는 필드이다.
- TCP Flag :패킷의 내용이 어떤 의미를 갖는지를 나타내는 부분이며, 3-way-handshake와 같이 연결하는 부분에서 SYN, ACK에 해당하는 필드가 해당 플래그 필드이다.
- Check Sum : 데이터의 변조나 훼손을 막기 위한 오류 탐지 필드이다.
3-Way-Handshake
클라이언트와 서버 사이의 연결을 확인할 때 사용하는 연결 방식이다.
- 데이터를 통신 하기 이전에 클라이언트는 데이터를 보낼 서버에 연결 요청(SYN)을 보낸다.
- 서버는 클라이언트에게 연결 요청이 제대로 왔음을 응답(ACK)하고, 서버도 클라이언트와 연결하겠다는 연결 요청(SYN)을 보낸다. 즉 SYN + ACK를 함께 보낸다.
- 클라이언트는 서버가 연결 요청한 것에 대한 응답(ACK)을 한다.
이렇게 3번의 연결 요청 및 응답을 통해 서버와 클라이언트가 연결되는데 이를 3-Way-Handshake라고 한다.
데이터의 안정적인 전달 보증
TCP의 데이터 전송 방식은 간단하다.
클라이언트가 서버에 데이터를 전송한다. 서버가 클라이언트가 전송한 데이터를 모두 처리를 완료하면 응답(ACK)을 보내준다.
클라이언트는 서버로부터 제대로 데이터가 전송되었다는 응답을 받았으므로, 다음 순서의 패킷들을 전송한다.
만약 클라이언트가 데이터를 전송하고, 서버가 이에 대한 응답을 하지 않으면 클라이언트는 자신이 보낸 데이터가 중간에 유실되었다고 판단하고 데이터를 재전송한다.
데이터의 순서 보장
수신자는 TCP 헤더의 Sequence Number를 보고 순서를 판단한다.
데이터를 제대로 수신한 경우 수신자는 송신자에게 ACK 응답과 함께 Sequence Number를 수신한 Sequence Number + 1한 값을 Acknowledgment Number에 넣어 해당 데이터를 전송하라고 알려준다.
UDP (User Datagram Protocol)
TCP가 데이터 전송에 있어서 신뢰성을 보장하지만 데이터 전송 전 연결 단계(3-Way-Handshake)와 데이터가 손실되었다고 판단되는 경우 해당 데이터를 재전송하는데 있어서 시간 손실이 발생한다.
이러한 손실에 민감하지 않은 데이터에 한해서는 속도가 빠른 프로토콜을 이용해 전송하는 것이 효율적인데 이 프로토콜이 UDP이다.
UDP(User Datagram Protocol)은 비연결성, 비신뢰성이라는 부분에 있어서는 IP 프로토콜과 비슷한 성격을 가진다.
3-Way-Handshake와 같은 전송 전 연결 단계도 없고, 데이터의 전달 및 순서를 보장하지 않는다.
다만, 이러한 신뢰성을 보장하는 단계를 줄였기 때문에 속도 면에서는 TCP에 비해 빠른 속도를 가진다는 장점이 있다.
UDP는 애플리케이션 계층에서 준 데이터에 앞에 UDP 헤더를 붙여 수신자에게 단순하게 송신한다.
📄 References
[10분 테코톡] 👨🏫르윈의 TCP UDP : https://www.youtube.com/watch?v=ikDVGYp5dhg&t=843s
김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 : https://www.inflearn.com/course/http-웹-네트워크/dashboard
[패킷 분석 이용한 프로토콜 분석] 04_1 - TCP 설명 : https://blog.daum.net/tlos6733/47
'Computer Science > Network' 카테고리의 다른 글
HTTP, HTTPS (0) | 2022.07.10 |
---|---|
3-Way-Handshake, 4-Way-Handshake (0) | 2022.06.20 |
CORS (Cross Origin Resource Sharing) (0) | 2022.05.08 |