이러한 TCP는 연결, 연결 종료 과정과 신뢰성 있는 서비스를 제공하기 위한 추가적인 헤더를 필요로 하므로 데이터 전송 속도가 다소 느리다는 단점이 있습니다.
신뢰성 있는 데이터 전달
TCP는 신뢰성 있는 데이터 전달을 위해 오류 제어, 흐름 제어, 혼잡 제어를 사용합니다.
오류 제어는훼손된 데이터, 누락된 데이터를 감지하고 재전송하고중복된 데이터를 폐기하며,순서에 맞지 않는 데이터를 정렬하는 역할을 합니다. 흐름 제어는데이터를 송신하는 속도와 수신하는 속도의 균형을 맞추는 역할을 합니다. 혼잡 제어는데이터를 전송하는 과정에서 혼잡을 예방하고, 발생시 이를 완화하는 역할을 합니다.
Sequence Number 와 Acknowledgement number
TCP 에서는 각 데이터들이 순차적으로 전달되고, 데이터의 손실이 있는지 확인하기 위해 헤더의 두 값을 사용합니다.
Sequence Number 는 현재 전송하는 데이터의 순서를, Acknoledgement Number 는 다음 수신시 받을 데이터의 순서를 나타내며, Acknoledgement Number 는 이전 수신시 받은 Sequnce Number + 받은 데이터의 크기(byte) 을 가지게 됩니다.
체크섬
데이터의 손실을 막기 위해, TCP 에서는 체크섬을 사용합니다. 클라이언트에서 패킷 전송 전, 데이터를 통해 체크섬을 계산하고, 서버에서는 받은 데이터를 기반으로 체크섬을 계산하여 클라이언트의 체크섬과 일치하는지 확인합니다.
연결지향적
TCP 는 연결지향적 서비스를 지원하기 위해 데이터 전송 전 3-way handshake 를 통해 송신자와 수신자를 논리적으로 연결하며, 안전한 데이터 교환 종료를 위해 4-way handshake 를 수행합니다.
3-way handshake 과정
1. 클라이언트 측 SYN 패킷 전달 - SYN 플래그를 1 로 설정한 후, 임의의 숫자로 Sequence Number(ISN) 을 지정하여 패킷을 전송한다.
2. 서버 측 SYN + ACK 패킷 전달 - SYN 플래그와 ACK 플래그를 1로 설정한 후, 임의의 숫자로 Sequence Number(ISN) 을 지정한다. - 또한, 다음으로 받을 패킷의 Sequence Number 를 알려주기 위해 Acknowledgement number 의 값을 받은 패킷의 Sequence Number + 1 로 설정하여 패킷을 전송한다.
3. 클라이언트 측 ACK 패킷 전달 - ACK 플래그를 1로 설정한 후, Sequence Number 를 이전 번호와 전달받은 Acknowledgement number 값을 확인하여 설정 후, Acknowledgement number 를 받은 Sequence number + 1 로 설정하여 패킷을 전송한다.
4. 연결 완료
4-way handshake 과정
1. 클라이언트 측 FIN 패킷 전달 - 연결 해제를 위해 헤더의 FIN 플래그를 1로 변경 후, 패킷을 전송합니다.
2. 서버 측 ACK 패킷 전달 - 요청을 받은 서버는 연결 종료 대기 상태에 진입하며, ACK 패킷을 클라이언트에 전송합니다. - 이후, 서버 측에서 아직 전송하지 못한 패킷(데이터)가 남아있다면 패킷을 전송합니다.
3. 서버 측 FIN 패킷 전달 - 전송하지 못한 패킷을 모두 전송했다면 클라이언트 측으로 FIN 패킷을 전달합니다.
4. 클라이언트 측 ACK 패킷 전달 - 요청을 받은 클라이언트는 연결 종료 대기 상태에 진입하며, ACK 패킷을 서버에 전달합니다. - 이 때, 패킷 전달 후 서버에서 전달받지 못한 패킷이 존재할 수 있으므로 특정 시간 후에 연결을 종료합니다.
5. 서버측 연결 종료
윈도우 사이즈 - 추가 예정
UDP
UDP 는 비연결 지향적이며, 빠른 데이터 전송을 중요시하는 프로토콜입니다.
TCP 와는 반대로 연결, 연결 종료 과정이 없고 신뢰성을 위한 헤더가 필요 없어 빠른 데이터 전송이 가능하지만, 데이터의 신뢰성 있는 전달은 어렵다는 단점이 있습니다.