• 4계층
• 종단 간(프로세스 간) 통신
• TCP, UDP
• 물리 계층
– 비트를 신호로 변환하고 신호에서 비트를 복구합니다.
– 인코딩/디코딩, 변조/복조
• 데이터 링크 계층
– 물리적으로 연결된 노드 간에 비트를 올바르게 전송합니다.
– 프레임 구성, 오류 검출/정정, ARQ, 매체 접근 제어
• 네트워크 계층
– 다중 네트워크를 통한 종단 간 전달 가능
– 전역 주소 지정, 라우팅, 단편화/재조립
• 전송 계층
– 프로세스 간(종단 호스트에서) 데이터를 올바르게 전송합니다.
– 신뢰성 있는 통신, 유량 제어, 혼잡 제어
• 통신이 필요한 많은 프로세스(응용 프로그램)가 단일 호스트에 존재할 수 있습니다.
• 네트워크 계층은 IP 주소에 따라 패킷을 전달합니다.
– 패킷이 어느 프로세스에 속하는지는 알 수 없습니다.
• 패킷은 전송 계층의 "포트(port)"에 수신 대기 중인 프로세스에 전달됩니다.
• 호스트에서 실행 중인 프로세스를 식별하는 데 사용됩니다.
• 16비트 숫자(0~65,535)
• 프로세스 간 통신에 필요한 정보 – 로컬 호스트
– 로컬 프로세스(포트 번호)
– 원격 호스트
– 원격 프로세스(포트 번호)
• 잘 알려진 포트
– 포트 번호 0-1023
– IP 주소를 할당하는 기관인 IANA에서 관리 – 예: 21(FTP), 22(SSH), 23(telnet), 25(SMTP), 80(HTTP)
• 등록된 포트
– 포트 번호 102449151
– IANA에서 등록되지만 강제되지는 않음
• 동적 포트
– 포트 번호 49152~65535 – 관리되지 않으며 자유롭게 사용 가능
• 프로세스 간 통신에 사용되는 데이터 구조
• 소켓 주소 = IP 주소 + 포트 번호
전송 계층 프로토콜
• 연결 지향 vs. 비연결
– 연결 지향
• 통신 전에 (논리적인) 연결
을 설정합니다(TCP).
– 비연결
• 연결 없이 통신이 진행
됩니다(UDP).
• 신뢰성 있음 vs. 신뢰성 없음
– 신뢰성 있음
• 메시지가 순서대로 오류 없이 수신됩니다(TCP
).
– 신뢰성 없음
• 오류 제어 없이 순서를 유지하지 않습니다(UDP
).
• 데이터 링크 계층의 오류 제어
– 물리 링크를 통과한 후 비트가 올바르게 수신됩니다.
– 호스트/라우터에서의 패킷 손실을 막을 수 없습니다.
• 목적지 도달 불가능, 시간 초과 등의 손실
• 신뢰성 있는 프로세스 간 통신을 위해 전송 계층에서도 오류 제어가 필요합니다.
전송 계층 프로토콜은 네트워크 상에서 프로세스 간의 통신을 제공합니다. 이를 위해 전송 계층은 다양한 기능과 프로토콜을 제공합니다. 몇 가지 중요한 프로토콜을 살펴보겠습니다.
TCP (Transmission Control Protocol
): 연결 지향적이고 신뢰성 있는 프로토콜
로, 전송 중 발생한 패킷 손실이나 에러를 검출하고 복구
합니다. 순서가 보장되
며, 중복된 패킷이나 재전송이 발생하지 않도록
합니다. TCP는 흐름 제어와 혼잡 제어 메커니즘을 사용하여 네트워크 혼잡을 관리
합니다.UDP (User Datagram Protocol
): 비연결 지향적이고 신뢰성 없는 프로토콜
로, 단순한 데이터 전송
을 제공합니다. UDP는 패킷의 오류 검출
만 수행하고, 순서 제어나 재전송은 하지 않습니다
. 따라서 신뢰성이 중요하지 않은 응용 프로그램
에서 사용됩니다.전송 계층 프로토콜은 응용 프로그램에서 필요한 통신 요구 사항에 맞게 선택되고 사용됩니다. TCP는 웹 브라우저, 이메일, 파일 전송 등과 같이 신뢰성과 순서가 보장
되어야 하는 응용 프로그램에서 주로 사용됩니다. UDP는 스트리밍, 실시간 음성 통화, DNS 등과 같이 신속한 전송
이 중요한 응용 프로그램에서 사용됩니다.
전송 계층 프로토콜은 네트워크의 상위 계층에 있는 응용 프로그램과 함께 작동하여 안정적이고 효율적인 통신을 제공합니다.
UDP (User Datagram Protocol)은 매우 간단한 전송 계층 프로토콜
입니다. UDP는 연결을 설정하지 않으며 신뢰성을 보장하지 않는 특징
을 가지고 있습니다. UDP의 기능은 다음과 같습니다:
포트를 사용하여 프로세스 간의 분리
를 실현합니다. 이를 통해 다중화와 역다중화가 가능합니다.체크섬(checksum)을 이용하여 간단한 오류 감지
기능을 수행합니다.소스 포트 번호/목적지 포트 번호: 각각 16비트
입니다.총 길이: UDP 패킷의 길이로, IP 패킷 길이에서 IP 헤더 길이를 뺀 값
입니다.UDP는 연결 설정이나 해제 과정이 없으며
, 목적지 IP 주소와 포트로 패킷을 전달
합니다. UDP 패킷은 "데이터그램
(datagrams)"이라고도 불리며, 각 데이터그램은 독립적으로 처리
됩니다. 순서 번호나 중복성 검출 등의 기능은 없습니다.
UDP는 전송 계층에서 흐름 제어나 오류 제어가 필요하지 않은 응용 프로그램에서 사용됩니다. 멀티미디어 스트리밍, 흐름 제어와 오류 제어가 이미 구현된 프로세스(TFTP), 멀티캐스트 응용 프로그램, 관리 프로토콜(SNMP) 등이 UDP를 사용하는 예시입니다.
UDP의 이점은 구현이 쉽고 처리 속도가 빠르다
는 것입니다. UDP와 정반대인 TCP는 신뢰성과 흐름 제어를 보장하며 복잡한 프로토콜이기 때문에 처리 속도가 상대적으로 느립니다.
TCP (Transmission Control Protocol)은 연결 지향적인 프로토콜
로, 연결 설정과 해제 과정
을 거칩니다. 신뢰성 있는 전달을 보장하며, 메시지는 오류 없이 목적지 프로세스에 순서대로 전달
됩니다.
TCP는 스트림 전달 서비스를 제공합니다. TCP는 데이터를 바이트 스트림
으로 전달하며, 각 바이트에는 일련번호
가 부여됩니다.
스트림 전달 서비스
• 송신 버퍼와 수신 버퍼
TCP 세그먼트
• 바이트 스트림의 일부 + TCP 헤더
• 패킷과 유사한 구조를 갖고 있으며 "세그먼트"라고 불립니다.
TCP 연결
• TCP는 연결 지향적인 프로토콜
입니다.
• TCP 연결은 두 개의 프로세스 간에 양방향 통신
에 사용됩니다.
• SYN(Synchronize) : 연결 설정
• FIN(Finish) : 연결 해제
TCP: 숫자
바이트 번호
"를 가지고 있습니다.TCP: 숫자
• TCP 시퀀스 번호
시퀀스 번호
를 가지고 있습니다.TCP: 숫자
• 확인 번호 (Acknowledgement number)
수신자는 세그먼트를 받으면 TCP-ACK 메시지
를 보냅니다.확인 번호
가 포함됩니다.확인 번호: 누락된 바이트 없이 수신자가 마지막으로 받은 바이트의 바이트 번호 + 1
TCP: 기능
TCP 헤더
• 옵션이 없는 경우 20바이트
• 옵션이 있는 경우 최대 60바이트
• 소스 포트/목적지 포트: UDP와 동일한 방식으로 사용됩니다. (각각 16비트)
• 시퀀스 번호 (32비트)
PSH와 URG
• PSH 플래그가 설정되면 수신자는 버퍼링된 데이터를 응용 프로그램에 전송
합니다.
"긴급 데이터"
가 세그먼트에 포함되어 있다는 의미입니다.TCP 연결 설정
• TCP는 양방향입니다.
• 각 측은 연결을 초기화해야 합니다.
• 연결 설정: 3-way handshake (3단계 핸드쉐이크)
클라이언트가 서버에 SYN
을 보냅니다.서버가 클라이언트에 SYN+ACK
를 보냅니다.클라이언트가 서버에 ACK
를 보냅니다.TCP 연결 설정
• SYN 패킷은 데이터를 전달하지 않지만 하나의 바이트 번호를 소비
합니다.
• 만약 SYN 패킷의 시퀀스 번호가 8000이라면, 서버는 확인 번호로 8001을 보냅니다.
• ACK 패킷은 바이트 번호를 소비하지 않습니다.
간략 설명: SYN flooding 공격
• DoS(Denial-of-Service) 공격 중 하나입니다.
• 가짜 소스 IP 주소를 사용하여 여러 클라이언트가 서버로 SYN 패킷을 보내는 것을 가장하는 공격입니다.
TCP 연결 해제
반닫힘 (half-close)
• 한 방향의 연결이 닫힌 상태
입니다.
다른 방향은 여전히 열려
있습니다.서버만 클라이언트로 데이터를 전송
할 수 있습니다.TCP 슬라이딩 윈도우
• 바이트는 송신 윈도우와 수신 윈도우를 사용하여 전송됩니다.
TCP 슬라이딩 윈도우
• 송신 윈도우에 관련된 변수
ACK가 도착하면 윈도우가 오른쪽으로 슬라이딩합
니다.cwnd (혼잡 윈도우): 네트워크 상태에 따라 달라집니다. • rwnd (수신 윈도우): 수신자 상태에 따라 달라집니다.
TCP 슬라이딩 윈도우: 예시
• 수신 호스트 B는 5,000바이트 크기의 버퍼를 가지고 있습니다.
• 현재 버퍼에는 처리되지 않은 데이터가 1,000바이트 들어 있습니다.
• B의 광고된 윈도우(rwnd)는 얼마입니까?
• 5000–1000=4000
• rwnd가 3,000바이트이고, cwnd가 3,500바이트인 경우
• 결과적인 윈도우 크기는 어떻게 됩니까?
TCP
• 연결 지향적인 프로토콜
슬라이딩 윈도우 크기
• 송신 속도는 슬라이딩 윈도우 크기에 의존함
• 큰 슬라이딩 윈도우 → 송신자는 바이트를 빠르게 전송함
• 작은 슬라이딩 윈도우 → 송신자는 바이트를 느리게 전송함
• 그렇다면 왜 항상 큰 슬라이딩 윈도우를 사용하지 않을까요?
• 송신 속도가 너무 빠른 경우
라우터에서 패킷이 손실
될 수 있음패킷 손실 → 재전송 → 대역폭 낭비
흐름 제어
• 수신자는 자신의 수신 버퍼에 얼마나 많은 공간이 남았는지 송신자에게 알림
윈도우 크기 스케일
• 윈도우 크기 필드는 16비트로 최대 65535바이트까지 표현 가능
• 65535바이트는 윈도우 크기로는 너무 작음
• TCP 옵션에서 윈도우 스케일을 정의할 수 있음
• 수신 버퍼가 거의 가득 참
• 작은 advertised window(예: 10바이트)
• 송신자는 매우 작은 TCP 세그먼트를 전송함
• 작은 세그먼트 → 큰 오버헤드
세그먼트 크기
• 큰 세그먼트가 좋음
• 최대 세그먼트 크기(MSS) - 시스템 매개변수
• Nagle 알고리즘(송신자)
• 응용 프로그램이 전송할 데이터를 생성할 때
• 사용 가능한 데이터와 윈도우가 MSS보다 크거나 같으면 전체 세그먼트를 전송함
• 그렇지 않으면
혼잡 제어
• 수신자의 버퍼가 비어 있더라도 라우터에서 세그먼트가 손실될 수 있음
• 라우터의 입력 속도가 출력 속도보다 빠른 경우, 버퍼가 가득 차서 지연이 증가함
• 마지막으로 버퍼가 오버플로우되면 패킷이 손실됨
• 부하가 높아지면 딜레이가 증가함. 부하가 용량에 도달하면 딜레이가 무한대가 됨
• 부하가 높아지면 처리량이 감소함
혼잡 제어: 목표
• 슬라이딩 윈도우 크기 → 부하
• 최상의 처리량을 달성하기 위해 부하를 제어함
혼잡 제어: 방법
• 라우터는 피드백을 제공할 수 없음
• TCP 혼잡 제어 방식: 경험을 통한 접근
혼잡 없음 → CWND(혼잡 윈도우) 증가
혼잡 발생 → CWND 감소
혼잡 제어: 기본 사항
• 제어 변수: CWND
느린 시작 단계
• 각 세그먼트가 ACK될 때마다 CWND를 1 MSS씩 증가
시킴
• CWND는 지수적으로 증가함 → 빠른 증가
느린 시작 단계
• 각 MSS 전송(ACK)마다 CWND가 1 MSS씩 증가
됨
• 각 RTT마다 CWND가 두 배
로 증가함 - 지수적인 증가
느린 시작 단계
• CWND가 증가함에 따라 송신 속도도 증가함
• 어느 시점에서는 혼잡이 불가피하게 발생함 → 패킷 손실
혼잡 제어
• 수신자의 버퍼가 비어 있더라도 라우터에서 세그먼트가 손실될 수 있음
• 라우터의 입력 속도가 출력 속도보다 빠른 경우, 버퍼가 가득 차서 지연이 증가함
• 마지막으로 버퍼가 오버플로우되면 패킷이 손실됨
• 부하가 높아지면 딜레이가 증가함. 부하가 용량에 도달하면 딜레이가 무한대가 됨
• 부하가 높아지면 처리량이 감소함
혼잡 제어: 목표
• 슬라이딩 윈도우 크기를 조절하여 부하를 제어함
• 최상의 처리량을 달성하기 위해 부하를 제어함
혼잡 제어: 방법
• 라우터는 피드백을 제공할 수 없음
• TCP 혼잡 제어 방식: 경험을 통한 접근
혼잡 제어: 기본 사항
• 제어 변수: CWND
느린 시작 단계
• 각 세그먼트가 ACK될 때마다 CWND를 1 MSS씩 증가시킴
• CWND는 지수적으로 증가함 → 빠른 증가
타임아웃
• 각 TCP 세그먼트마다 송신자는 타이머를 유지함
• 일정 시간 동안 ACK를 받지 못하면 타임아웃이 발생함
• 타임아웃이 발생하면 해당 세그먼트는 손실된 것으로 간주됨
느린 시작과 타임아웃
• 타임아웃이 발생하면
• SSThresh는 CWND/2로 설정됨
느린 시작과 SSThresh
• 타임아웃 후에 CWND는 다시 증가함
• CWND가 SSThresh에 도달하면 느린 시작 단계가 종료됨
• 송신자는 혼잡 회피 단계로 들어감
혼잡 회피 단계
• 각 RTT마다 CWND를 1 MSS씩 증가시킴
• CWND += MSS * (MSS / CWND)
• 가산 증가(Additive Increase)
• 세그먼트 손실이 발생할 때까지 혼잡 회피 단계가 계속됨
혼잡 회피 단계
• 느린 시작: 지수적인 증가
• 혼잡 회피: 가산적인 증가
기본 CWND 동작
타이머
• 송신자는 세그먼트를 보내고 일정 시간(재전송 시간 초과, RTO) 동안 ACK를 기다림
• ACK가 도착하면 타이머가 제거
됨
• 타이머가 만료되기 전에 ACK가 도착하지 않으면 타임아웃이 발생하고 세그먼트가 재전송됨
재전송 시간 초과
• 송신자는 얼마나 오래 기다려야 할까요?
• RTO가 너무 짧으면
적절한 RTO
• 적절한 RTO: RTT(라운드 트립 타임) + 여유시간
• 초기 알고리즘
• 지수 평균화
• a=7/8인 경우
• 초기 알고리즘: 문제점
타임아웃
• Karn/Partridge 알고리즘
• Jacobson/Karels 알고리즘
빠른 재전송
• 세그먼트가 손실되면 타임아웃이 발생하기 전에 송신자에게 알려짐
• 그러나 타임아웃이 발생하기까지 시간이 오래 걸림 - 시간 낭비
• 빠른 재전송은 세그먼트 손실을 빠르게 감지하고 세그먼트를 재전송하기 위한 방법을 제공함
빠른 재전송
• 중복 ACK
• 세그먼트에 대한 세 개의 중복 ACK - 세그먼트가 손실되었다고 간주 - 세그먼트 재전송
• 왜 세 개인가?
세그먼트 손실의 표시
• 타임아웃
• 세 개의 중복 ACK
• Slow Start + 혼잡 회피 + 빠른 재전송 = TCP Tahoe (1988)
빠른 복구
• 세그먼트 손실이 감지되면 CWND가 1로 재설정됨 - 송신 속도 갑작스러운 감소
• 3개의 중복 ACK로 세그먼트 손실이 감지되면 슬로우 스타트로 돌아가지 않고 혼잡 회피 단계부터 다시 시작
• SSThresh ← CWND/2
• CWND ← SSThresh
• TCP Tahoe + 빠른 복구 → TCP Reno (1990)
TCP 혼잡 제어
• 타임아웃 → 슬로우 스타트
• 빠른 재전송 → 혼잡 회피
CWND 동작
TCP 옵션
• 최대 40바이트
• 각 옵션에는 KIND 및 LENGTH 필드가 있음
TCP 타임스탬프
• 명시적인 RTT 측정
• 송신자는 세그먼트를 보내기 전에 송신 시간을 타임스탬프로 표시함
• 수신자는 ACK에 송신 시간을 복사함
• 송신자는 ACK를 받으면 송신 시간과 현재 시간을 비교하여 RTT를 계산함
TCP 타임스탬프: 필드
• Kind: 이 옵션이 어떤 옵션인지 나타냄
TCP 타임스탬프: 동작
Time = 100 Time = 130
RTT = 130 – 100 = 30
TCP SACK
• 선택적인 확인
• 수신자가 정확히 어떤 세그먼트를 수신했는지 송신자에게 알려줌
• 송신자는 재전송해야 할 세그먼트를 확인할 수 있음
TCP SACK: 옵션 필드
• Kind=5
• Length=최대 40바이트
• 타임스탬프 옵션(10바이트)이 존재하는 경우 최대 30바이트
TCP SACK: 동작
• LeftEdge+RightEdge → 하나의 블록
• 블록은 수신된 세그먼트를 나타냄
• 예시: 세그먼트 1, 3, 7이 손실됨