이 파트에서는 전송 계층의 프로토콜들에 대해 알아볼 것이다.
프로토콜들의 동작을 잘 이해할 수 있도록 간단한 것에서부터 복잡한 프로토콜로, 최종적으로는 TCP/IP 프로토콜 그룹의 대표적인 프로토콜을 다루고자 한다.
RDT란, 전송된 데이터가 소실되거나 손상되지 않도록 reliable하게 신뢰성을 보장하는 데이터 전송이다.
채널이 완벽히 신뢰성있는 환경이라는 가정에서의 단순 비연결형 프로토콜이다.
(flow control x, error control x) 이미지에서 알 수 있듯이 송신자가 패킷에 담아 보내면 곧이곧대로 수신자가 처리하는 구조이다.
flow control과 error control을 모두 사용하는 연결 지향형 정지-대기 프로토콜이다.
sliding window 만큼의 패킷을 전송하여 ack가 돌아오기 전까지는 대기한다.
checksum: 패킷 훼손 여부를 위해 패킷에 추가한다. 만약 checksum이 틀리면, 패킷 훼손으로 간주하여 알림없이 버린다(silently discarded).
sequence number: 패킷에 대한 중복 수신을 막기 위해 sequnece number
와 acknowledge number
를 사용한다.
ex. 흐름 시나리오:
패킷 오류 없이 도착 > 수신측 ack 전송 > 송신측 ack 정상확인 > 다음 넘버의 패킷 전송
패킷 훼손 오류 > 수신측 ack 보내지못하며 timeout > 송신측 재전송
패킷 오류 없이 도착 > 수신측 ack 전송 > 송신측이 ack 훼손 확인 > 송신측 재전송 >
(수신측은 다음번 패킷 받는 것을 기대했으나 seq num을 통해 재전송된 중복 패킷임을 확인)
이러한 Stop-and-Wait 의 경우,
ack 확인 전까지의 대기한다
라는 구조적인 이유로 전송 효율에 한계가 존재한다. 따라서 전송 효율을 높이기 위해 pipelining을 위해 다음 두 가지로 구현 >> Go-Back-N 과 Selective Repeat
송신측은 ack에 대한 대기 없이 window 크기만큼 연속적으로 전송을 한다.
Why GO-BACK N?
ex. 윈도우 사이즈 4 => 패킷 0, 1, 2, 3을 전송하여 이후엔 4 패킷을 받기를 기대
=> 패킷 1의 로스 발생 => 패킷 2, 3은 정상적으로 수신되었으나 패킷1의 수신을 기대할 때에 어긋난 순서로 들어와 모두 폐기 => 송신은 패킷 1, 2, 3을 재전송
말 그대로, N위치만큼 후퇴하여 재전송
앞선 Go-Back N의 경우, 수신측 프로세스를 간단히 구현하여, 오류 발생한 패킷 이후의 모든 패킷을 폐기하여 재전송하는 방식이기 때문에 bandwidth 낭비가 심한 비효율성을 보인다.
SR에서는 수신 측이 올바르게 수신된 패킷에 대해 개별적으로 ACK를 전송하는 것을 통해, 오류가 발생한 패킷에 대해서만 선택적인 재전송하게 된다.
앞선 프로토콜들은 송수신 측을 나눈 단방향 프로토콜인 반면, piggybacking은 양방향 통신의 효율을 향상시키기 위해 사용된다. 패킷에 데이터를 담아 전송할 때에 ack와 같은 확인 응답 피드백을 같이 전달한다.
현재의 인터넷에서 사용하는 프로토콜 그룹으로 각 모듈 계층은 하위 계층의 기능을 이용하고 상위 계층에 기능을 제공한다.
기존 TCP/IP 프로토콜은 하드웨어에 설치된 4가지 소프트웨어 계층으로 정의되지만 현재는 5계층으로 분류하는 것이 일반적이다.
cf. 이전 4계층의 TCP/IP model
1. Application Layer
응용 프로그램 간 데이터의 송수신
ex. FTP, SMTP, TELNET, etc.2. Transport Layer
호스트들 간의 신뢰성있는 통신의 제공
ex. UDP, TCP3. Internet Layer
데이터 전송을 위한 주소와 경로 설정
ex. IP, ICMP, ARP, etc.4. Link Layer
frame으로서 실제 데이터의 송수신
ex. Ethernet, IEEE 802
connectionless, unreliable
application level단에서의 error control을 제공받아,
최소화된 오버헤드를 통해 빠른 전송 속도를 우선하는 프로토콜이다.
source port #, destination port #, user datagram length, checksum
전송단위: datagram
고정된 크기의 datagram
단위로 분할하여 전송. 자신의 헤더에 데이터를 첨가하여 ip에게 전달하여 전송.
메시지 지향적
datagram의 독립적인 처리로 순서를 보장하지 않고 손실/순서 뒤바뀜이 있더라도 재전송 이뤄지지 않음.
process-to-process communication
ip address와 port number의 결합인 socket address 이용하여 제공.
즉, error control, flow control없이 경량화된 형식이기에,
대용량 데이터를 전송해야하거나 신뢰성이 중요한 전송이 아니라,
TFTP (Trivial File Transfer Protocol)
과 같이 내부적으로 flow control, error control을 포함한 프로세스에 적합하다.
적은 오버헤드로 bandwidth 절약과 빠른 전송이 가능하므로 multicast
에 적합하다.
cf. RUDP (Reliable User Datagram Protocol)
UDP 기반으로 신뢰성을 높인 프로토콜
- 연결 설정: 비연결형, TCP처럼 연결을 설정하지 않음.
- 신뢰성 추가 기능:
데이터 전송 확인 (ACK)
오류 검출 및 재전송
순서 보장
- 오버헤드: 낮음, UDP의 단순성 유지.
- 사용 사례: 실시간 응용 프로그램, 멀티미디어 스트리밍 등.
connection-oriented, reliable
reliability 제공을 위해, GBN과 SR 프로토콜의 결합으로 사용.
=> checksum, 재전송, ack, timeout
전송단위: segment
segment
단위로 데이터 분할하여 연속된 byte stream 으로 전송, 수신측은 sequence number를 통해 순서 확인
reliability를 위해 error control과 retransmission
TCP는 장치 간 논리적 접속을 만들기 위해 handshake를 사용한다.
클라이언트 to 서버: 연결 요청(SYN)
서버 to 클라이언트: 확인하고 응답(SYN-ACK)
클라이언트 to 서버: 응답에 대한 확인(SYN)
cf. Half-close (절반 폐쇄)
데이터를 받고 있는 중에도 한쪽 끝은 전송을 중단할 수 있다. 한 쪽을 미리 종료함으로 자원 관리 최적화에 도움이 된다.
클라이언트 to 서버: 연결 종료 요청(FIN)
서버 to 클라이언트: 확인(ACK)하고 app 에 대해선 close-wait
서버 to 클라이언트: app이 종료 준비될 시 연결 종료 플래그(FIN)
클라이언트 to 서버: 응답에 대한 확인(ACK)
신뢰성 있는 데이터 전송이 중요한 파일 전송, 웹 브라우징, 이메일 전송 등에 사용된다.
cf. SCTP
SCTP(Stream Control Transmission Protocol)는 TCP와 UDP의 장점을 결합한 프로토콜.
신뢰성, 순서 보장, 다중 스트림 등의 기능 제공
주요 용도: 실시간 음성/비디오 통신, 금융 거래