1. 트랜스포트 계층 서비스 및 개요
트랜스포트 계층 프로토콜은 서로 다른 호스트에서 동작하는 애플리케이션 프로세스들 간의 논리적 통신을 제공한다.
트랜스포트 계층 프로토콜은 라우터가 아닌 종단 시스템에서 구현된다.
송신자 : 애플리케이션 메시지를 작은 조각으로 분할한 후, 트랜스포트 계층 헤더를 추가해 세그먼트로 만들어 네트워크 계층으로 전달한다.
수신자 : 세그먼트를 모아 메세지로 만들고, 어플리케이션 계층으로 전달한다.
네트워크 애플리케이션에서는 하나 이상의 트랜스포트 계층 프로토콜이 사용가능하다.(인터넷의 TCP / UDP)
1.1 트랜스 포트 계층과 네트워크 계층 사이의 관계
트랜스포트 계층 프로토콜 : 서로 다른 호스트에서 동작하는 프로세스들 사이의 논리적 통신을 제공
네트워크 계층 프로토콜 : 호스트들 사이의 논리적 통신을 제공
1.2 인터넷 트랜스포트 계층의 개요
IP : 인터넷의 네트워크 계층 프로토콜
-최선형 전달 서비스(Best Effort delivery service) : IP는 통신하는 호스트들 간에 세그먼트를 전달하기 위해서 최대한 노력하지만, 어떤 보장(순서 / 무결성 / 전달여부)도 하지 않는다는 것. 따라서 IP는 비신뢰적 서비스
UDP/TCP의 기능 : 종단 시스템 사이의 IP 전달 서비스를 종단 시스템에서 동작하는 두 프로세스 간의 전달 서비스로 확장하는 것
Transport multiplexing / Demultiplexing : 호스트 대 호스트 전달을 프로세스대 프로세스 전달로 확장하는 것
헤더에 오류 검출 필드를 포함함으로써 무결성 검사를 제공.
(1) UDP : 애플리케이션에게 비신뢰적이고 비연결형인 서비스를 제공
제공하는 트랜스포트 계층 서비스
- 프로세스 대 프로세스 데이터 전달
- 오류 검출
(2) TCP : 애플리케이션에게 신뢰적이고 연결지향형 서비스를 제공
UDP가 제공하는 것 외에 TCP가 제공하는 서비스
- 신뢰적인 데이터 전달 : 흐름제어, 순서번호, 확인응답, 타이머
- 혼잡제어 : 과도한 양의 트래픽으로 모든 통신하는 호스트들 사이의 스위치와 링크를 폭주되게 하는것을 방지하는 것.
2. Multiplexing and Demultiplexing (다중화와 역다중화)
다중화 : 출발지 호스트에서 소켓으로부터 데이터를 모으고, 이에 대한 세그먼트를 생성하기 위해서 각 데이터에 헤더정보로 캡슐화하고, 그 세그먼트들을 네트워크 계층으로 전달하는 작업
역다중화 : 트랜스포트 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업
각 세그먼트는 세그먼트가 전달될 적절한 소켓을 가리키는 특별한 필드 (출발지/목적지 포트번호 필드)를 가진다.
Connectionless Demultiplexing
데이터그램을 UDP 소캣으로 보낼때, 목적지 IP주소와 목적지 포트번호가 필요하다
호스트가 UDP 세그먼트를 받을때, 목적지 포트번호를 확인하고, UDP 세그먼트를 해당 포트번호를 가진 소캣으로 보낸다
같은 목적지 포트번호를 가졌지만, 다른 전송지 IP 주소를 가지는 데이터그램들은 같은 소캣으로 보내진다.
Connection-oriented demux
TCP 소켓은 4가지 요소로 인식된다.
(1) 수신지 IP 주소
(2) 수신지 포트번호
(3) 목적지 IP 주소
(4) 목적지 포트번호
수신자는 4가지 값 모두를 이용하여 세그먼트를 올바른 소켓으로 보낸다. (Demux)
서버 호스트는 많은 TCP 소켓들을 동시에 지원한다.
웹서버들은 각각의 연결중인 클라이언트들마다 다른 소켓을 가진다.
비지속적인 HTTP는 각각의 리퀘스트마다 다른 소켓을 가진다.
3. connectionless transport : UDP (User Datagram Protocol)
가장 기초적인 인터넷 트랜스포트 프로토콜이다.
가장 효율적인 서비스를 제공하기때문에 UDP 세그먼트는 잃어버리거나, 유통기한이 지난 데이터를 보낼 수 있다.
혼잡제어가 없기 때문에 가장 빠른쪽으로 전달한다.
Connectionless
- UDP 전송자와 수신자간에 핸드셰이킹이 없어 단순하다.
- 연결이 없기때문에 지연이 발생할 수 있다.
- 헤더가 작다.
- 각각의 UDP 세그먼트는 각각 독립적으로 다뤄진다.
UDP는 데이터의 손실과 전송률에 예민하지 않은 스트리밍 멀티미디어앱, DNS, SNMP에 사용된다.
UDP를 통한 신뢰있는 전송
- 어플리케이션 계층에 신뢰도를 더한다.
- 어플리케이션 계층에 특화된 오류 복구기능
UDP 체크섬
- 전송된 세그먼트에서 오류가 있는지 검사하는 기능
전송자
- 세그먼트 내용+헤더를 16비트 정수의 나열로 만든다
- 체그섬 : 세그먼트 내용+헤더의 합
- 전송자는 체크섬값을 UDP 체크섬 필드에 넣는다
수신자
- 수신된 체크섬을 계산한다
- 계산된 체크섬이 체크섬 필드값과 같은지 확인한다.
4. Principles of reliable data transfer
- 어플리케이션/트랜스포트/링크 계층에서 가장 중요한 주제중 하나이다
- 비신뢰적인 체널의 특성이 RDT(Reliable Data Transfer protocol)의 복잡도를 결정한다
(1) rdt 1.0 : 신뢰할수 있는 체널을 통한 신뢰할수있는 전송
- 체널이 완벽하게 믿을 수 있음을 전제로 한다.(비트에러 / 패킷의 손실이 없음)
(2) rdt 2.0 : 비트 에러가있는 체널
- 체널이 패킷의 비트들을 뒤집을 수 있다는걸 가정한다. (체크섬이 비트 에러를 잡아낸 경우)
에러로부터 복구하는 방법
- acknowledgements (ACKs) : 수신자는 송신자에게 패킷이 올바르게 전송되었음을 알린다
- negative acknowledgements (NAKs) : 수신자는 송신자에게 패킷이 에러가 있음을 알린다
- 송신자는 NAK가 전송된 패킷을 재전송한다
RDT2.0의 치명적인 결점
- 만약 ACK/NAK가 오염된다면 송신자는 수신자에게 무슨일이 있었는지 모르기 때문에 중복이 될수 있어 무지성으로 재전송을 할 수 없다.
RDT2.1
- 중복을 방지하기 위해 전송자는 패킷을 재전송 하면서 Sequence number을 각각의 패킷에 넣는다. 수신자는 중복된 패킷을 버린다.
- Stop and Wait : 전송자는 하나의 패킷을 보내고 수신자의 대답을 기다린다.
송신자
- sequence number을 패킷에 더한다
- 두개의 sequence number(0,1)로 충분하다
- 수신된 ACK / NAK가 오염되었는지 확인해야한다.
- 2배 더 많은 상태를 가지고, state는 다음에 올것으로 예상되는 패킷이 어떤 sequence number을 가져야 하는지를 기억해야한다.
수신자
- 수신된 패킷이 중복되었는지 확인해야한다.(State가 0 or 1 이 예상한 패킷 sequence number인지 알려준다.)
- 수신자는 송신자에게 ACK/NAK가 잘 전달되었는지 확인할 수 없다.
RDT 2.2 : NAK-free 프로토콜
- 2.1과 같은 기능을 하지만 NAK 대신 마지막 패킷이 잘 전달되었을때, 수신자는 ACK를 보낸다.
- 수신자는 ACK된 패킷의 Seq #를 같이 보내야한다.
- 수신자에게 전달된 중복된 ACK는 NAK와 동일한 반응을 이끌어낸다.
(3) rdt 3.0 : 에러와 손실이 있는 체널들
- 채널이 패킷을 잃어버릴수 있음을 가정한다. (데이터 / ACK 등)
- 체크섬, Seq #, ACK, 재전송은 도움이 되겠지만 충분하지 않다.
- 카운트다운 타이머가 필요하다
- 송신자는 ACK가 올것으로 예상되는 '합리적인 시간'만큼 기다린다.
-- 이 시간동안 ACK가 전송되지 않으면 재전송한다.
-- 만약 패킷이 손실이 아닌 그냥 지연된거라면, seq# 가 이를 해결한다.
rdt3.0의 성능
rdt3.0은 기능적으로 정확한 프로토콜이지 성능에 만족하는 것은 아니다.
이를 해결하기 위해 파이프라이닝을 사용하면된다.
파이프라이닝 : 확인 응답을 기다리지 않고 여러 패킷을 전송하도록 허용하는 것
이를 위해 seq # 의 범위가 확대되어야 하며, 송신측과 수신측은 1개 이상의 패킷을 버퍼링해야한다.
파이프라이닝 방식을 사용하는 프로토콜 2가지
(1) go-Back-N(GBN) :
- 송신자는 최대 N개의 ACK되지않은 패킷을 전송할 수 있다.
- 수신자는 패킷에 대해 cumulative ack를 보낸다(1,2,3을 보냈을때 1,3만 왔다면 1까지만 ack를 보낸다)
- 송신자는 가장오래된 unACK 패킷에 대한 타이머를 가진다, 타이머가 종료되면 모든 unACK 패킷을 재전송한다.
(2) selective repeat :
- 수신자는 각 패킷에 대해 cumulative가 아닌 individual ack를 보낸다. (1,2,3을 보냈을때 1,3을 받았으면, 1,3만 보낸다.)
- 송신자측에서는 모든 ack를 받지못한 패킷에 대해 타이머를 하나씩 유지해야한다. 타이머가 종료되면 해당 패킷을 재전송한다.
- 상위층에 데이터를 올려줄 때는 패킷들의 순서를 맞춰서 올려야하기 때문에 buffer에 패킷들을 저장했다가 순서에 맞게 상위층으로 전달한다.
Selective repeat의 딜레마
위 템플릿에서 (b) 상황을 보자. sender가 보낸 0, 1, 2번 패킷을 receiver에서 수신하고 receiver는 ack 0, 1, 2를 송신함과 동시에 receiver의 윈도우를 증가시킨다. receiver에서 ack0, 1, 2를 sender 측으로 전송했는데 중간에 ack가 손실이 되면 어떻게 될까? 그러면 sender에서 ack 0, 1, 2번을 기다리는 타이머가 타임 아웃이 돼서 자동으로 패킷 0, 1, 2을 receiver 측으로 재전송할 것이다. receiver 측에서 받을 다음 패킷들은 3, 0, 1인데 sender 측에서 보낸 재전송 패킷들은 0, 1, 2 패킷이다. 3번 패킷은 안 왔지만 0, 1 패킷이 왔으므로 receiver는 0, 1 패킷들을 받아들인다. 하지만 이번에 받은 0,1 패킷은 duplicate 패킷이므로 받으면 안 되지만 패킷 번호의 일치로 인해서 duplicate packet이 새로운 packet인 것처럼 받아들여진다. 어떻게 하면 이 문제를 해결할 수 있을까? → Maximum Window Size를 지키자!!!!
5. connection-oriented transport: TCP
특징
1. 1대1 : 하나의 송신자와 하나의 수신자
2. 믿을 수 있고, 순서가 있는 바이트 스트림 :
3. 파이프라인 : TCP
4. 양방향 데이터
5. connection-oriented
6. 흐름제어
TCP seq numbers, ACKs
seqence numbers: 세그먼트의 첫번째 바이트의 byte stream numbers
acknowledgements : 다른쪽에서 예상하고있는 다음 바이트의 seq # / 누적되는 ACK
수신자는 순서에 맞지않은 segment를 A섹션을 통해 확인한다.
TCP RTT, timeout
TCP timeout 값을 어떻게 설정해야하는가?
- RTT 보다 길게 : 하지만 RTT는 다 다르다
- 너무 짧게 : 이른 타임아웃으로 불필요한 재전송이 일어난다
- 너무 길게 : 세그먼트 손실에 대한 느린 반응
어떻게 RTT를 예상해야하는가?
- SampleRTT: 세그먼트 전송에서부터 ACK 수신까지 측정한 시간 / 재전송을 무시한다
- SampleRTT는 각기 다를것이고, 예상된RTT는 더 비슷해야 한다.
- SampleRTT만이 아니라 몇몇 최근에 측정된 값들의 평균을 사용한다.
Timeout 간격 : EstimatedRTT + Safety margin (넓은 범위의 estimatedRTT => 넓은 범위의 safety margin)
EstimatedRTT에서 SampleRTT의 편차 예상 :
믿을수 있는 데이터 전송
TCP는 rdt서비스를 IP의 믿을수없는 서비스 위에 만든다
- 파이프라인된 세그먼트들
- 누적된 ACK들
- Single retransmission timer
재전송은 timeout event들과 중복된 ack들에의해 트리거된다
TCP 전송자의 Event들
1. 어플리케이션계층으로부터 데이터가 수신되었을때 :
- seq# 가 있는 세그먼트를 만든다
- 타이머가 이미 실행되고 있지 않다면 실행한다 (가장 오래 unacked 된 segment에 대한 타이머 / Timeoutinterval : 소멸되는 간격)
2. 타임아웃 :
- 타임아웃을 일으킨 세그먼트를 재전송한다
- 타이머를 재시작한다
3. ACK가 수신되었을때 :
- 만약 ACK가 이전에 unacked 된 segment를 ACK한다면, ACK된 것을 업데이트하고, 만약 아직도 unacked 한 세그먼트가 있다면 타이머를 시작한다.
TCP 수신자의 Event들
1. 예상 시퀀스 번호로 정렬된 세그먼트의 도착. 예상 시퀀스 번호까지의 모든 데이터는 이미 확인
- 지연된 확인 응답. 다음 세그먼트를 기다리는 시간은 최대 500ms이다. 다음 세그먼트가 없을 경우 확인 응답을 보낸다
2. 예상된 순서 번호로 정렬된 세그먼트의 도착. 하나의 다른 세그먼트는 확인 응답 대기 중입니다
- 즉시 단일 누적 확인 응답을 보내며, 두 개의 예상대로 순서대로 도착한 세그먼트를 확인
3. 예상치 못한 순서로 도착한 세그먼트. 예상 시퀀스 번호보다 높습니다. 갭이 감지되었습니다
- 즉시 중복 확인 응답을 보내어, 다음 예상 바이트의 시퀀스 번호를 나타냅니다
4. 갭을 부분적으로나 완전히 채우는 세그먼트의 도착
- 만약 세그먼트가 갭의 하한에서 시작한다면 즉시 확인 응답을 보내라
재전송 시나리오들
빠른 재전송: 만약 송신자가 같은 데이터에 대해 3개의 ACK를 받는다면, ACK되지 않은 세그먼트들 중 가장 작은 SEQ#를 가지는 세그먼트를 재전송한다. (그 unacked 세그먼트는 잃어버렸을 가능성이 크므로 타임아웃까지 기다리지 않는다.)
1. 타임아웃 기간은 때때로 상대적으로 길다.
- 잃어버린 패킷을 재전송하는데까지 긴 딜레이가 있다.
2. 잃어버린 세그먼트를 중복된 ACK로 감지한다.
- 송신자는 때때로 많은 세그먼트를 연속적으로 보낸다
- 만약 세그먼트가 손실된다면, 많은 중복된 확인응답이 있을것
TCP의 흐름제어 : 수신자는 송신자가 너무 많고 빠른 재전송으로 인해 수신자의 버퍼를 오버플로우하지 않도록 송신자를 제어한다.
- 수신자는 수신자에서 송신자로의 세그먼트의 TCP헤더에 rwnd값을 포함함으로써 빈 버퍼 공간을 "광고"한다.
-- rcvbuffer 크기는 소켓 옵션을 통해 설정된다 (일반적인 기본값 : 4096byte)
-- 많은 운영체제는 자동으로 RcvBuffer을 조정
- 송신자는 수신자의 rwnd 값을 기준으로 확인되지 않은 전송중인 데이터 양을 제한한다.
- 수신 버퍼가 넘치지 않도록 보장
연결 관리
데이터를 교환하기 전에, 송신자와 수신자는 핸드셰이크를 한다:
- 연결을 설정하기로 합의 (각각이 상대방이 연결을 설정하려는 의사를 알고있는 상태)
- 연결 매개변수에 대한 합의
1. 연결을 설정하기로 합의
- 연결을 끊을때, 클라이언트와 서버는 각자의 연결을 끊는다 (FIN bit = 1 인 tcp세그먼트를보낸다)
- 수신된 FIN에 대해 ACK로 응답한다.(FIN을 수신하는 동안, ACK는 그 세그먼트의 FIN과 혼합될 수 있다.)
- 동시적인 FIN교환이 일어날 수 있다.
6. Principles of 혼잡제어
혼잡 :
- 비공식적으로는 "네트워크가 처리하기에 너무 많은 소스에서 너무 빠르게 데이터를 보내는 상태"를 의미
- 흐름제어와 다르다
- 나타나는 현상: 패킷 손실(라우터에서의 버퍼 오버플로우) / 긴 지연 (라우터 버퍼에서 대기)
혼잡의 발생 시나리오 1 :
시나리오 2 :
시나리오 3 :
7. TCP congestion control
가산 증가 / 곰셈 감소
- 접근 방법 : 송신자는 손실이 발생할 때 까지 전송속도(윈도우 크기)를 증가시켜 사용 가능한 대역폭을 탐색
-- additive increase : 손실이 감지될 때까지 RTT마다 cwnd를 1 MSS씩 증가시킨다
-- Multiplicative decrease : 손실 후에 cwnd를 절반으로 줄인다.
cwnd: TCP 송신자 혼잡 윈도우 크기
연결이 시작되면, 첫 손실 사건이 발생할 때까지 속도를 지수적으로 증가시킵니다:
• 초기에 cwnd = 1 MSS
• 매 라운드트립 시간(RTT)마다 cwnd를 두 배로 증가시킵니다.
• 각 ACK를 받을 때마다 cwnd를 증가시켜 진행합니다.
요약: 초기 속도는 느리지만 지수적으로 빠르게 증가합니다.
TCP의 Loss 감지 및 대응
1. 타임아웃으로 나타나는 손실:
• cwnd가 1 MSS(Maximum Segment Size)로 설정됩니다.
• 창은 그런 다음 지수적으로 성장합니다 (느린 시작과 같이) 경계에 도달하면 선형적으로 증가합니다.
2. 3번의 중복된 ACK로 나타나는 손실: TCP RENO
• 중복된 ACK는 네트워크가 일부 세그먼트를 전달할 수 있는 능력을 가리킵니다.
• cwnd는 절반으로 줄어들고 창은 그런 다음 선형적으로 성장합니다.
3. TCP Tahoe는 항상 cwnd를 1로 설정합니다 (타임아웃 또는 3번의 중복된 ACK)
'Study > 컴퓨터 네트워크' 카테고리의 다른 글
컴퓨터 네트워크 6. 링크 계층과 LANs (0) | 2023.10.29 |
---|---|
컴퓨터 네트워크 5. 제어 평면 (0) | 2023.10.29 |
컴퓨터 네트워크 4. 네트워크 계층 (데이터 평면) (0) | 2023.10.08 |
컴퓨터 네트워크 2. 어플리케이션 계층 (0) | 2023.08.31 |
컴퓨터 네트워크 1. 컴퓨터 네트워크와 인터넷 (0) | 2023.08.31 |