신뢰적 데이터 전송의 원리
전송 후 대기 프로토콜
- 송신부에서 데이터를 보낸 후 수신부로부터 응답을 받을때까지 다음 데이터를 보내지 않고 기다리는 방식이다.
- 송신부는 패킷을 보낸 후 수신부의 ACK 또는 NAK 신호를 기다린다.
- 송신자는 ACK 메세지를 받으면 다음 패킷을 전송하고, 일정 시간동안 ACK 메시지를 받지 못하면 패킷을 재전송 한다.
- 구현이 간단하지만 이전 메시지에 대한 응답을 받아야 다음 메시지를 보낼 수 있어 시간 면에서 비효율적이다.
파이프라인 프로토콜
파이프라인 프로토콜은 메시지 패킷을 동시에 보내고 ACK 패킷도 동시에 받는 방법이다.
하나의 패킷을 전송하고 ACK가 돌아올 때까지 기다리는 방법 보다 훨씬 효율적이지만 신뢰성이 낮고, 신뢰성을 보장하기 위한 대표적인 두 가지 방법이 있다.
Go-Back-N
- 송신부에서 일련의 패킷을 연속적으로 보냈을 때 누락된 패킷이 있다면 재전송하는 방식
- 수신부는 순차적으로 패킷을 받다가 받지 못한 패킷이 있을 경우 직전 패킷에 대한 ACK를 보낸다.
- 송신부는 해당 ACK의 패킷부터 재전송한다.
- 중간에 있는 패킷이 손실되면, 정상 전송된 패킷이라도 잘못된 패킷부터 재전송해야하므로 효율성이 떨어질 수 있다.
Selective Repeat
- 패킷이 유실되어 재전송할 때 선별적으로 패킷을 재전송하는 방식이다.
- 수신부는 순차적으로 받고, 받은 패킷에 대한 ACK 메시지를 보낸다.
- 송신부는 ACK가 오지 않는 패킷을 재전송한다.
- 패킷이 순서대로 정렬되어야 하므로 유실된 패킷이 있을 때, 해당 패킷이 도착할 때까지 다음 순서의 패킷을 버퍼에 임시로 저장해준다.
- 특정 패킷만을 재전송한다는 점은 효율적이지만, 받은 패킷을 재정렬하는 로직이 추가로 필요하다.
TCP
TCP란?
TCP는 전송 계층에 해당하는 네트워크 프로토콜로 연결형 서비스를 지원하고 데이터의 신뢰성을 보장한다,
TCP 특징
- 송신부와 수신부의 연결을 확인하는 연결형 서비스
- 패킷 교환 방식은 패킷이 전달되는 회서이 정해져 있는 가상 회선 방식
- 패킷의 전송 순서가 보장되고, 수신 여부를 확인함
- 송신부와 수신부는 1:1 통신
- 데이터 손실이 없음을 보장하므로 신뢰성이 높음
- 데이터의 송수신 속도가 느림
TCP 핸드셰이킹
TCP에서는 연결형 서비스를 지원하기 위해 송신부와 수신부를 연결하는 과정을 거친다.
연결을 시작할 때는 3-way 핸드셰이킹 / 연결을 종료할 때는 4-way 핸드셰이킹 과정을 거친다.
Flag 값
- SYN : Synchronization(동기화) - 연결을 생성할 때 사용
- FIN : Finish(종료) - 연결을 끊을 때 사용
- ACK : Acknowledgment(승인) - 데이터를 전송하면 수신자가 받음을 알려줄 때 사용
3-way 핸드셰이킹
클라이언트와 서버가 3개의 패킷을 주고 받으며 TCP 사전 연결 설정을 하는 과정이다.
- 클라이언트가 서버에게 접속을 요청하면서 SYN 메시지를 보냄
- 서버는 클라이언트에게 연결 요청을 수락하는 의미인 SYN/ACK 메시지를 보냄
- 클라이언트가 서버에게 다시 ACK 메시지를 보내면 연결 설정
4-way 핸드셰이킹
클라이언트와 서버가 4개의 패킷을 주고 받으며, TCP 연결 종료를 하는 과정이다.
- 클라이언트가 서버에게 연결 종료를 요청하면서 FIN 메시지를 보냄
- 서버는 클라이언트에게 응답으로 ACK 메시지를 보내고
CLOSE_WAIT
상태가 됨 - 연결 해제 준비가 끝난 서버가 클라이언트에게 FIN 메시지를 보내고
LAST_WAIT
상태가 됨 - 서버로부터 FIN 메시지를 받은 클라이언트가 ACK 메시지를 보내면서
TIME_WAIT
상태로 바뀌고, ACK를 받은 서버는CLOSED
상태가 됨
참고
https://velog.io/@dltmdrl1244/소켓프로그래밍3-핸드셰이킹-
기술 면접 대비 CS전공 핵심요약집 | 이수진 https://product.kyobobook.co.kr/detail/S000208504237
'CS' 카테고리의 다른 글
[운영체제] 프로세스 동기화, 데드락 (0) | 2023.10.07 |
---|---|
[네트워크] 네트워크 레이어, IP 프로토콜 (0) | 2023.10.07 |
[운영체제] CPU 스케줄링 (0) | 2023.10.06 |
[운영체제] 프로세스와 스레드 (0) | 2023.09.22 |
[네트워크] HTTPS, DNS, UDP (0) | 2023.09.21 |