IP에 최소 기능만 추가
최선형(best effort) 서비스의 UDP 세그먼트
비연결형
사용
UDP 상에서 신뢰적인 전송
UDP segment header
UDP 사용하는 이유
UDP 체크섬 (checkSum)
송신 측
수신 측
→ 정수 값 덧셈 시 1의 보수 덧셈은 최상위 비스에서 캐리가 발생하면 결과값에 더해줌
파이프라인 프로토콜
a. 송신자가 ACK 응답을 기다리지 않고 여러 패킷을 전송
b. 순서 번호의 범위는 증가하여 전송 중인 패킷은 유일한 순서번호를 가짐
c. 송신 측과 수신 측이 패킷을 버퍼링해야함
파이프라이닝 프로토콜 개요
a. GBN(Go-Back-N)프로토콜 → 단순, 불필요한 전송
- 송신자는 파이프라인에서 최대 N개의 ACK 없이 패킷 전송 허용
- 수신자는 누적된 ACK (cumulative ACK, 누적 확인 응답)만을 전송, 수신된 패킷들의 순서번호에 갭이 있으면 ACK 응답x
- 송신자는 가장 오래된, 전송되었지만 ACK 응답 없는 패킷에 대한 타이머를 가짐. 타이머가 완료되면 ACK응답 없는 모든 패킷들을 재전송
b. SR(Selective Repeat, 선택적 반복)
: 동일한 상황에서 sender과 receiver의 입장이 다를 수 있음
송신자는 파이프라인에서 최대 N개의 ACK없이 패킷 전송 허용
수신자는 개별 패킷들에 대해 ACK응답
송신자는 전송되었지만 ACK응답이 없는 패킷들 각각에 대해 개별 타이머를 관리함. 타이머 만료 시 ACK 응답없는 패킷만 재전송
sender: data from above → timeout(n) → ACK(n)
만약 window의 최저 seq #이 도착했다면 윈도우 이동
receiver: packet n in [rcvbqase, rcvbase + N - 1] 윈도우 안에 패킷이 들어온 경우
n번 패킷에 대한 ACK전송, 정상적인 순서로 데이터가 오면 윈도우를 이동
out-of-order 패킷을 버퍼링해두고 윈도우 안에 들어오면 그때 함께 application으로 올려줌
→ packet n in [rcvbase-N, rcvbase - 1] //ACK(n)
→ otherwise: ignore
✅ window size ≤ 1/2 seq #
window size: seg # 비트수 결정
size가 너무 크면 packet drop or 충돌 문제 발생
→ rdt 2.1: sender, handling corrupted ACK/NAKs
→ rdt 2.1: receiver, handling corrupted ACK/NAKs
왼쪽 state에서 0번이 왔는지 확인/ 오른쪽 state에서 1번이 왔는지 확인
패킷에 문제가 없고 seq # 0번이 잘 도착했으면 패킷에서 데이터를 추출하고 ACK와 체크섬을 함께 전달해줌
3-1. 패킷에 문제가 발생하거나 NAK을 받으면 패킷 재전송
3-2. 패킷에 문제 없고 seq # 0도착하면 패킷 전송
2번과 동일 (seq # 1번 도착)
5-1. 패킷에 문제가 발생하거나 NAK을 받으면 패킷 재전송
5-2. 패킷에 문제 없고 seq #1 도착하면 패킷 전송
→ rdt 3.0 : channels with errors and loss
전이중 데이터 (full duplex data)
a. 같은 연결 상에서 양방향 데이터 흐름
b. 최대 세그먼트 크기 (MSS: Maximum Segment Size)
연결 지향형
흐름 제어 (Flow control)
TCP segment 구조
a. 순서번호 (Sequence Number): 세그먼트에서 첫 번째 바이트의 바이트 스트림 번호. 시작 순서 번호는 임의로 선택
b. ACK: 상대방으로부터 기대하는 다음 바이트 순서번호 (누적 ACK)
TCP 신뢰적 데이터 전달
a. 비신뢰적인 인터넷 네트워크 계층 (IP 서비스) 상위 계층에서 신뢰적인 데이터 전달 서비스를 제공함
- 파이프 라인 되는 segment
- 누적 ACKs
- 단일 재전송 타이머
b. 재전송 점
- 타임 아웃 이벤트
- 중복 ACKs
c. 간소화 TCP 송신자
- 중복 ACKs 무시
- 흐름제어 , 혼잡제어 무시
TCP 송신자 이벤트
a. 전송/재전송과 관련된 TCP 송신자의 이벤트
- 상위 애플리케이션으로부터 수신된 데이터
- 타이머 타임아웃
- ACK 수신
b. 상위 애플리케이션으로부터 수신된 데이터 이벤트
- 순서번호를 포함한 세그먼트 생성
- 순서번호는 세그먼트에서 첫번째 바이트의 바이트 스트림 번호
- 타이머가 이미 동작 중에 있지 않으면 타이머 시작
- 타이머의 만료 주기: TimeoutInterval
c. ACK수신 이벤트
- 이전에 응답 받지 못한 세그먼트의 확인 응답(ACK)이면, 해당 세그먼트를 ACK 응답된 세그먼트로 표시. 아직 ACK 응답을 받지 못한 세그먼트들이 존재하면 타이머를 시작
d. 타이머 타임아웃 이벤트
- 타임아웃을 유발한 세그먼트 재전송
- 타이머를 다시 시작
e. 빠른 재전송
- 타임아웃 주기가 상대적으로 길어질 수 있음 (손실된 패킷을 다시 보내기 전까지 오래 기다림)
- 중복 ACK를 사용하여 손실된 패킷들을 감지. 송신자는 종종 많은 개수의 세그먼트들을 연속적으로 보내기 때문에 세그먼트가 손실되면 많은 중복 ACK 발생
- 송신자가 같은 데이터에 대해 3개의 중복 ACK를 수신하게 되면 ACK 응답된 세그먼트의 다음 세그먼트가 손실되었다고 가정. 타이머가 만료되기 전에 재전송
: 송신자가 너무 많은 데이터를 너무 빠르게 전송하여 수신자의 버퍼를 오버플로우 시키는 것을 방지하는 서비스
TCP 연결 관리
TCP 3-way handshake
a. 클라이언트는 서버에 SYN 세그먼트 송신
- 세그먼트 헤더의 SYN 비트 플래그 세트
- 최초의 순서번호를 기술
- 데이터 없음
b. 서버는 SYN을 받고, SYNACK 세그먼트를 응답
- 서버는 TCP 버퍼와 변수를 할당
- 서버의 최초 순서번호를 기술
c. 클라이언트는 SYNACK를 받고, ACK 응답
- 클라이언트는 TCP 버퍼와 변수를 할당
- ACK 응답에 데이터 (segment payload)가 포함될 수 있음
TCP 연결 종료
a. 클라이언트는 서버에 FIN 세그먼트를 송신
- 세그먼트 헤더의 FIN 비트 플래그 세트
b. 서버는 FIN을 받고, ACK 세그먼트를 응답, FIN 세그먼트를 송신
c. 클라이언트는 FIN을 받고, ACK 세그먼트를 응답
- 대기 시간 (timed wait)동안 기다린 후 연결 종료됨
d. 서버는 ACK를 받고, 연결을 종료함
혼잡 제어의 원리
a. 혼잡 (Congestion)
- “네트워크가 감당할 수 없을 정도로 너무 많은 출발지(source)에서 너무 많은 데이터를 너무 빨리 송신”하는 것이 원인
- 혼잡 원인을 처리하기 위해선 혼잡을 일으키는 송신자들을 억제하는 매터니즘이 필요함
- 혼잡 제어 ≠ 흐름제어
b. 네트워크 혼잡의 결과
- 패킷 손실(라우터의 버퍼 오버플로우)
- 긴 패킷 지연 (라우터 버퍼에서 큐잉)
c. 혼잡제어는 네트워킹의 기본적인 중요한 문제의 상위 10개 목록 (top 10)에 포함
혼잡의 원인과 비용
a. 시나리오 1
- 두 송신자, 두 수신자, 송수신 속도 (전송률) λin, λout, 링크 처리량 R(또는 라우터 용량 C)
- 무한 크기의 버퍼를 갖는 한 개의 라우터
- 재전송 없음
- 혼잡 시 큰 지연
- 최대 처리량: R/2
b. 시나리오 2
- 유한 버퍼를 가진 하나의 라우터
- 송신자는 손실된 (타임아웃)) 패킷을 재전송
- 애플리케이션 계층 입력 = 애플리케이션 계충 출력 λin = λout
- 트랜스포트 계층 입력은 재전송된 데이터 포함 λ in ≥ λout
c. 시나리오 2.1
- 송신자는 패킷이 손실된 경우에만 재전송을 하는 경우 가정 (손실 없음)
d. 시나리오 2.2
- 송신자는 패킷이 손실된 경우에만 재전송하는 경우 가정 (R/2에서 일부 패킷들은 재전송되지만 점진적로 R/2에 도달)
e. 시나리오 2.3
f. 시나리오3