- 애플리케이션 - 전송 - 네트워크
- 서로 다른 호스트에서 실행되는 두개의 애플리케이션 프로세스 사이의 커뮤니케이션 제공 ( 메시지 전달 목적지 호스트의 애플리케이션까지 찾기)
- vs 네트워크 계층 : 호스트간 커뮤니케이션 (메시지 전달 목적지가 되는 컴퓨터 찾기)
- 논리적 연결 사용
Addressing
- 멀티 유저, 프로그래밍 환경
- 로컬 - 리모트 호스트 IP 주소로 식별
- 호스트 내부 프로세스는 포트넘버로 식별 (16비트)
- 클라이언트 - 임시 포트 넘버 (1023보다 큼)
- 서버 - well-known 포트 넘버
ICANN (Internet Coporation of Assigned Names and Numbers)
- 0-1023 : well-known 포트 (FTP 21 SSH 22 telnet 23 HTTP 80)
- 1024-49151 : registered ports
- 49152-65535 : 동적 포트 (등록 X) - 임시 또는 사적 용도로 사용하는 포트넘버
Socket Address
- IP 주소 + 포트넘버
- 인터넷에서 전송 계층 서비스를 사용하려면 클라이언트 서버 소켓 주소 필요
- 네트워크 패킷 헤더 IP 주소
- 전송 계층 패킷 헤더 포트넘버
전송 계층 서비스
- 수신 측에서 encapsulation, 송신 측에서 decapsulation
- 수신 측에서 멀티플렉싱 (many → one), 송신 측에서 디멀티플렉싱
- 흐름 제어
- 전송되는 데이터가 손실없이 송신측에 전달될 수 있게 데이터 전송 비율 관리
- pushing : 수신측의 요청 없이 수신측에서 데이터를 보내는 방식, 송신측에 오버플로우 발생하면 데이터 버림 (흐름제어 필요) (송신지에서 데이터를 수신지로 그냥 밀어넣음)
- pulling : 수신측에 요청하면 데이터를 전송하는데 이 경우 흐름제어 필요 없음 (수신지에서 땡겨 씀)
- 버퍼 사용하기 (송수신 전송계층 각각의 버퍼 사용 ) : 수싱 측 버퍼가 가득 파면 메시지 전달을 그만하라고 애플리케이션 계층에 알리고 빈 공간이 생기면 다시 보내도 된다고 알림 / 수신측 버퍼가 가득 차면 패킷 보내는 걸 그만하라고 네트워크 계층에 알리림
- 즉, 버퍼 사용하는 경우 송신측은 애플리케이션에 버퍼 상태 알리고, 수신측은 수신측의 전송 계층에 알림
- 송신 애플리케이션 ↔ 송신 네트워크 ↔ 송신 전송 ↔ 수신 전송
- 오류 제어
- 망가진 패킷 탐지 및 버리기
- 버려지거나 손실된 패킷 추적 및 재전송
- 중복 패킷 인지하고 버리기
- 사라진 패킷 도착전까지 순서 잘못된 패킷 버퍼링
- sequence numbers
- 전송계층 패킷에 패킷 순서 번호 필드 추가
- 패킷 헤더에 m bit 시퀀스 넘버를 허용 → 시퀀스 넘버 범위 : 0~ 2^m-1
- 오류 제어에서 시퀀스 넘버는 mod 2^m
- acknowledgement (ACK)
- 수신측 타이머 사용 → 패킷 보내고 송신측 타이머 시작, ACK가 타이 아웃 전에 오지 않으면 패킷 손실 탐지, 재전송
- 혼잡 제어
- 네트워크가 수용가능한 것보다 넘치게 부하가 있다면 혼잡 밣생
- 프로세싱 전후에 패킷을 보관하고 있는 큐 in 라우터와 스위치
- 라우터가 패킷이 도착하는 동시에 처리하지 못하면 혼잡 발생 in 큐
- 전송 계층의 혼잡 → 네트워크 계층의 혼잡 유발
Simple protocol
- 흐름제어, 오류제어 필요 없는 비연결 프로토콜
- 수신측에 어떤 패킷이든 받자마자 즉시 처리한다고 가정
Stop and Wait protocol
- 연결 지향
- 흐름제어 오류 제어 필요
- 송신측이 하나의 패킷을 보내고 타이머를 시작하고 ACK를 기다림
- ACK가 타임 아웃전에 도착하면 타이머 스탑 하고 다음 패킷을 보내면서 새로운 타이머 설정 시작
- 타임아웃되면 송신측은 이전 패킷을 다시 보냄
- 체크섭을 추가해서 망가진 패킷을 탐지
- 시퀀스 넘버
- 패킷 중복을 방지하기 위해 시퀀스 넘버, ACK 넘버 사용
- x를 시퀀스 넘버로 예상할때 패킷이 안전하게 도착하면 송신측에 ACK가 도착하고 x+1 패킷을 보냄
- 패킷이 전송 중 손실되면 ACK가 오지 않아 타임아웃되고 이를 재전송함
- ACK가 손실된 경우 타임아웃되면 재전송하는데 이러면 중복 발생
- mod 2 를 활용해서 0 1 0 1 시퀀스 넘버가 반복적으로 발생하도록 해야 함
- ACK 넘버
- 파이프라이닝
- 이전 패킷에 대한 피드백을 송신측이 받기 전에 여러 개의 패킷을 보내는 것
- 송수신측의 버퍼링
- 스탑앤웨잇 프로토콜에는 파이프라이닝 없음
- 송신측은 반드시 패킷이 도착지에 도달했음을 알리는 ACK를 받을 때까지 기다려야 함
Go Back N protocol
- 송신측에 ACK를 기다리는 동안 여러 개의 전송이 이미 수행되어야 함 (파이프라이닝)
- ACK를 받기전에 여러개의 패킷을 보내는 것,
- 수신측은 반드시 하나의 패킷만 버퍼에 넣을 수 있음 (recieve window = 1)
- 시퀀스 넘버
- mod 2^m (m은 시퀀스 넘버의 비트 사이즈)
- Ack 넘버
- ackNo 다음에 도착할것이라고 예상하는 다음 패킷의 시퀀스 넘버를 정의하고 축적됨
- ex) ackNo = 7 → 패키 6까지는 잘 도착했고, 수신측은 다음 패킷으로 시퀀스 넘버 7인 패킷이 올 것이라 예상함을 의미
- Send window
- 데이터 패킷의 시퀀스 넘버를 커버하는 논리적 공간
- Sf : first outstanding packet의 시퀀스 넘버
- Sn : 다음으로 보내질 패킷의 시퀀스 넘버
- Ssize : 윈도우 사이즈 (최대 2^m-1)
- ackNo가 Sf보다 크거나 Sn보다 작아지면 윈도우 슬라이드 (왼 → 오)
- Receive window
- 옮은 패킷을 받고 옳은 ack를 보내는 것을 보장
- size = 1 ⇒ Rn을 value로 가지고 있음
- Rn = 다음 패킷으로 예상되는 시퀀스 넘버
- 다음에 오는 패킷의 시퀀스 넘버가 Rn과 일치해야 ACK 보낼 수 있음
- 올바른 패킷이 도착하면 윈도우 슬라이드
- 타이머 : 하나의 타이머 사용
- 패킷 재전송
- 타임아웃되면 재 전송
- ex) Sn=7을 이미 보내고 ack를 받지 못한 상태에서 타임아웃되면 Sf =3 이면 패킷 2,4,5도착하고 6이 아직 못 온 상태
- 송신측은 3 4 5 6을 다시 보냄
- 즉, 타임아웃되면 N 위치로 다리 돌아가서 모든 패킷을 다시 보냄
Selective Repeat protocol
- GBN은 오류가 난 지점에서 처음으로 돌아가 모든 패킷을 다시 보냄
- SR은 특정 손실된 패킷만 다시 보냄
- send window의 최대 사이즈 = 2^(m-1) = receive winodw (송수신측 윈도우 사이즈 같아야 함)
- 타이머 : GBN - outstanding 패킷들을 그룹화했다면 SR - 개별적으로 다룸
- ackNo : 안전하게 받은 하나의 패킷의 시퀀스 넘버를 정의 (no feedback)
- ex) 6개의 패킷을 보내는 경우 (0~5) → 송신측은 ackNo = 3을 받는다
- GBN의 경우 0 1 2를 받았고 수신측은 3번 패킷을 기대하고 있음을 의미
- SR의 경우 3번 패킷이 잘 받았고다는 것만 알려주고 다른 패킷에 대해 아무것도 알려주지 않음
양방향 프로토콜 - piggybacking
- A→B 일때 B가 ACK를 포함해서 피드백을 보냄
- B→A 일때 A가 ACK를 포함해서 피드백을 보냄
- 클라이언트 서버가 각각 독립적인 송수신 윈도우를 가지고 있는 경우 - 양방향 프로토콜 필요
인터넷 전송 계층 프로토콜 - UDP (User Datagram Protocol)
- UDP 패킷 = 데이터그램
- 헤더 사이트 8 바이트로 고정 (2바이트 필드 * 4)
- source port : 송신측의 포트 정의, 사용 안하면 0
- destination port : 수신측 포트 정의, 필수 필드
- total length : 데이터 그램의 전체 길이 (데이터 + 헤더)
- checksum : 데이터나 헤더에 에러 체크 하는데 사용하는 부분
- 16진수 포맷을 네부분으로 나눠서 각각을 십진수로 바꾸면 됩
- UDP 서비스
- 프로세스간 커뮤니케이션 : 소켓 주소 (IP 주소 + 포트넘버)를 이용해서 소통
- 비연결 서비스
- 각 데이터그램은 독립적으로 전송됨
- 연결 생성 및 종료 없음 → 그냥 서로 다른 경로로 전송되는 것
- 각 요청은 나눠서 보내질 수 없고 하나의 데이터그램에 모두 포함될 수 있는 사이즈여야 함 (65535 - 8 바이트 = 65507) → 짧은 요청과 응답
- 지연시간 적음
- ex) DNS에서 사용
- 흐름 제어 없음 → 수신측에 메시지 오버플로우 발생 가능성 있음
- 오류 제어
- 체크섬 말고는 없음
- 송신측은 메시지가 손실되거나 중복되어도 모름
- 받는쪽은 체크섬을 활용해서 데이터그램이 버려질 수도 있음
- checksum
- 송신측에서 사용하지 않을거면 0으로 설정
- 송신측에서 포함하고 모두 1로 설정
- 송신측에서 사용하기로 했는데 모두 0 인 경우는 없음
- 혼잡 제어 없음
- encapsulation, decapsulation 사용해서 메시지 전송
- queuing
- 멀티플렉싱 디멀티플렉싱 필요
- simple protocol + checksum = UDP
- UDP 애플리케이션
- TFTP (Trivial File Transfer Protocol) : 이미 오류, 프름 제어 있음
- 멀티캐스팅
- SNMP
- RIP (Routing Information Protocol)
- interactive real time 애플리케이션
인터넷 전송 계층 프로토콜 - TCP (Transmission Control Protocol)
- stream 전송 서비스 (바이트 스트림 전송)
- 송신 프로세스와 수신 프로세스는 속도가 다름 → 송수신 각각의 버퍼 사용
- 일정 바이트를 패킷으로 묶음 = 세그먼트
- TCP는 각 세그먼트에 헤더 추가
- 세그먼트는 순서를 이탈하거나 손실되거나 망가질 수 있음
- TCP 서비스
- full-duplex 커뮤니케이션 : 데이터는 동시에 양방향으로 흐를 수 있음
- 멀티플렉싱, 디멀티플렉싱 : 송신측에서 멀티플렉싱, 수신측에서 디멀티플렉싱
- 연결 지향 서비스 : 두 개의 프로세스간 논리적 연결 필요 → 양방향으로 데이터 교환 → 연결 종료
- reliable 서비스 : ACK 매커니즘을 사용해서 데이터의 안전한 도착을 확인함
- TCP 특징
- 바이트 넘버 : 연결에서 전송되는 모든 데이터 바이트
- 시퀀스 넘버 : 전송되는 각 세그먼트의 순서 시퀀스 넘버 할당하고 해당 세그먼트에 포함되어 있는 첫번째 데이터 바이트에 할당된 숫자를 정의함
- ex) 보내는 데이터의 첫번째 바이트가 10,001이고 한번에 1000바이트를 전송하면서 총 5000바이트를 보낸다면 세그먼트 시퀀스 넘버 : 10,001 → 11,001 → 12,001 → 13,001 → 14,001
- ACK 넘버 : 받은 데이터 바이트 확인하기 위해 사용, 받을 것으로 예상하는 바이트 수를 정의
- TCP 연결 성립 (three-way handshaking)
- 클라이언트가 TCP SYN 세그먼트를 서버로 보냄
- 서버는 SYN을 받고 SYN+ACK 세그먼트로 응답
- 클라이언트가 서버로부터의 응답을 받고 ACK 세그먼트로 응답
- 데이터 전송
- 데이터가 도착하면 버퍼에 넣고
- 프로세스가 준비되면 수신 프로세스로 보냄
- PSH 플레그 셋 ⇒ 수신 TCP가 데이터를 받자마자 수신 프로세스로 전달되게 함
- URG 비트가 셋 ⇒ 급한 데이터는 세그먼트 앞부분에, urgent 포인터 필드는 urgent 데이터의 끝을 가리킴
- 연결 종료 (three way handshaking)
- 클라이언트 시스템이 FIN 세그먼트를 서버로 보냄
- FIN을 받은 서버는 ACK로 응답
- FIN을 받은 클라이언트도 ACK로 응답 (데이터 없이 ACK만)
- Half close
- 클라이언트는 FIN 세그먼트를 보내서 연결 절반 종료
- 서버는 ACK 세그먼트를 보내서 수용하고 서버로부터 데이터 나갈 수 있고 클라이언트로부터 ACK 나갈 수 있음
- 모든 데이터를 보낸뒤 서버는 FIN 세그먼트를 보내고 클라이언트는 이에 대해 ACK로 응답
- RST flag
- 연결 요청 거부, 현재 연결 버리기, 이상한 연결 종료 할 때 reset
- 양 방향 커뮤니케이션 → 양 쪽 모두 각각 송신 수신 윈도우 갖고 있음
- receive 윈도우 사이즈 rwnd : 버퍼 사이즈 - pull된 대기 바이트 수
- 흐름 제어
- 데이터 생산자와 사용자의 속도 균형 맞춤
- 데이터 생산 측의 전송 계층에서 애플리케이션 계층으로 피드백보내고, 데이터 사용 측의 전송 계층에서 생산 측의 전송 계층에 피드백을 보내 속도 조절
- 송수신 측의 윈도우를 조절하도록 강제함
- 수신 윈도우는 송신측으로부터 더 많은 바이트가 오면 close (왼 →오 이동), 프로세스에 의해 더 많은 바이트들이 pull되면 오픈 (오→왼)
- 송신 윈도우는 수신측에 의해서 조절됨
- new ackNo + new rwnd = last ackNo + last rwnd ⇒ close
- new ackNo + new rwnd > last ackNo + last rwnd ⇒ open
- 수신 윈도우는 줄어들 수 없음
- 송신 윈도우는 수신측 피드백으로 rwnd가 이전보다 작아지면 줄어들 수 있음
- 오류 제어
- 체크섬 → 세그먼트 망가진거 확인
- ACK → 세그먼트 받은 걸 확인하는데 사용
- cumulative ack : 수신측에서 다음에 받을 것으로 예상하는 바이트를 알림, 버려지거나 손실되거나 중복되는 세그먼트에 대한 피드백 없음, ACK 필드는 TCP 헤더에 존재하고 ACK 플래그가 1 일 때 유효함
- selective ack (SACK) : ACK를 대체하는 것이 아니라 추가적인 정보 제공, TCP헤더의 끝에 옵션으로 구현됨, 잘못된 순서, 중복된 바이트 블럭 정보 제공
- ACK 생성 규칙
- 송신측은 반드시 데이터그램이 ACK를 포함시켜야 함
- 수신측은 오직 하나의 제대로 전달된 세그먼트가 있다면 ACK 전송을 지연시켜야 함 → 다른 세그먼트가 도착하거나 일정 시간이 지난 뒤 전송
- 수신측은 다음과 같은 경우에 즉시 다음 시퀀스 넘버를 알리는 ACK 세그먼트를 보내야 함
- 세그먼트가 수신측이 예상한대로 잘 도착하고 이전의 순서가 맞는 세그먼트가 ACK되지 않은 경우
- 세그먼트가 순서가 잘못되어 도착 (예상 보다 큰 수를 받은) 경우
- 잃어버린 세그먼트가 도착한 경우
- 중복된 세그먼트가 도착한 경우
- 재전송 → 오류 제어 매커니즘의 핵심, 타임아웃되면 재전송, 송신측이 중복된 ACK를 3번 받으면 재전송
- out of order 세그먼트는 지연됨 → 순서대로 전달 해야 함 / 사라진 세그먼트가 도착할 때까지 임시로 저장됨
- 재전송 after RTO (retransmission time out)
- 송신 TCP는 각 연결마다 하나의 재전송 타임아웃 (RTO) 유지
- 타임 아웃되면 TCP는 큐의 맨 앞에 있는 세그먼트를 재전송하고 타이머 재시작
- TCP에 있는 RTO는 동적이고 세그먼트의 RTT (Rount trip time)을 기반으로 갱신됨
- 세번 중복된 ACK 세그먼트 이후에 재전송 (이때는 타임아웃까지 기다리지 않아도 됨) = fast retransmission
- 데드락 : 양단 모두 다른 쪽으로부터 응답을 기다리는 상황
- 혼잡 제어
- congestion window = cnwd
- 실제 윈도우 사이즈 = 혼잡 윈도우와 수신 윈도우 중 작은 것
- ACK 못받는 타임 아웃 → 강한 혼잡 사인 / 혼잡으로 인해 세그먼트가 손실
- 3번 중복 ACK 를 받는 것 → 약한 혼잡 사인
- 혼잡 정책
- slow start
- congestion avoidance : cnwd > sshtresh를 넘으면 혼잡 방지를 위해 수행하는 정책
- fast recovery
- Taho TCP
- 시작 cwnd = 1, slow start(지수적 증가, ex) 1 -> 2 -> 4 -> 8 -> 16 -> ...), ssthresh = cwnd 크기의 절반
- ssthresh에 도달하면 additively increase (1씩 증가 ex) 1 -> 2-> 3-> ...)로 변경
- 이때 타임아웃(강한 혼잡), 3dupACKs 발생하면 ssthresh를 현재 cwnd의 절반으로 수정하고, cwnd를 1로 초기화한 후 다시 slow start (지수적 증가)
- ex)
- ssthresh = 16 cwnd = 1부터 시작 (cwnd = 최대 32라고 가정), 지수적 증가
- 타임아웃 또는 3dupsACKs 가 cwnd = 8에서 발생하면 ssthresh = 4로 설정하고 cwnd =1로 초기화한 뒤, 1씩 증가하는 additively increase 시작
- thresh를 넘으면 그때부터 1씩 증가하는 것으로 변경
- Reno TCP
- 시작은 cwnd = 1, ssthresh는 cwnd 최대 크기의 절반, 지수적 증가 (Taho와 동일한 시작)
- 지수적 증가하다가 3dupACKs 발생하면 cwnd를 현재의 절반으로 줄이고, ssthresh도 줄인cwnd 와 동일하게 설정한 후1씩 증가하는 것으로 변경
- 또는 타임아웃이 발생하면 3dupACK 보다 강한 혼잡이라고 판단하여 cwnd를 1로 초기화하고, ssthresh는 변경하지 않고 지수적 증가 시작
- ssthresh를 넘으면 지수적 증가 -> 1씩 증가로 바꾸면서 congestion avoidance
- 초기 slow start 상태를 지난 후, cwnd는 additive increase, multiplicative decrease (AIMD) 상태를 보임 = 칫솔 모양 그래프
- ACK가 도착하면 cwnd = cwnd + (1/cwnd)
- 혼잡이 갑지되면 cwnd = cwnd/2
- ex) 8 → 10 (혼잡) ⇒ 5 → 12(혼잡) ⇒ 6 → 10 ...
- TCP throughput = (0.75) Wmax / RTT
- 혼잡 발생할 때의 윈도우 사이즈 크기의 평균 = Wmax
- ex) MSS = 10KB, RTT = 100ms, Wmax = (10 + 12+ 10 + 8 + 8) (그래프에서 뚝 떨어진 시점) / 5 = 9.6 ⇒ 스루풋 = 0.75 * 96 /100 = 720KBps = 5.625Mbps
- TCP Cubic
- 더 높은 스루풋을 위한 것
- W(t) = 큐빅에서의 스루풋
- W(t) = C(t-K)^3 + Wmax
- t = 마지막으로 뚝 떨어진 시점 ~ W(t) 시점
- K = 마지막으로 뚝 떨어진 시점 에서 Wmax에 도달하기 까지의 시간
- C = 상수
- TCP 타이머
- 재전송 타이머 : RTP 재전송 타임아웃 처리
- 큐 앞 부분에 있는 세그먼트를 보내고 타이머 시작
- 타임 아웃되면 TCP 는 첫번째 세그먼트 다시 보내고 타이머 재시작
- 세그먼트가 ack를 축적하면 세그먼트 purge from the 큐
- 큐가 비면 TCP 타이머 스탑
- 비어있지 않으면 타이머 재시작
- persistence 타이머 : 데드락 방지를 위해 제로윈도우사이즈 처리
- 손실된 ACK로 인해 생성될 수 있는 데드락 방지
- TCP가 윈도우 사이즈 0 인 상태에서 ACK를 받으면 persistence 타이머 시작
- keepalive 타이머 : 두 TCP 간 이상한 연결 장기간 지속되는 것 방지
- TIME_WAIT 타이머 : 연결 종료 동안 사용
- final ACK를 보내고 close 할 때 사용
- MSL (Maximum segment life time) = 버려지기 전 네트워크에서 어떤 세그먼트가 존재할 수 있는 시간
- 재전송 타이머 : RTP 재전송 타임아웃 처리
QUIC
- Quick UDP Internet Connections
- 애플리케이션 계층 QUIC → 전송 계층 UDP → 네트워크 계층 (IP)
- 멀티플렉싱
- TCP에서는 클라이언트가 여러개의 TCP 서버로의 연결을 오픈
- QUIC에서는 여러개의 스트림이 하나의 UDP 연결 내에서 전달되어 오버헤드 적음
- connection id : 같은 연결 내에 흐르고 있는 엔드디바이스를 알려줌 → 클라이언트가 연결 도중에 IP 를 바꿔도 됨 (연결 재 설립 X) , 반면 TCP 연결은 5개 큐플 (src IP, dstIP, srcport, dst port, porotocl)이 필요한데 이 중 하나라도 바뀌면 연결 재설립 필요
'컴퓨터 공학 > 컴퓨터 네트워크' 카테고리의 다른 글
[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : 파일 전송 프로그램 (0) | 2021.05.03 |
---|---|
[Python3/컴퓨터 네트워크] 소켓 프로그래밍 : 멀티 쓰레드 (0) | 2021.05.03 |
[컴퓨터 네트워크] Application layer 애플리케이션 계층 기본 개념 정리 (0) | 2021.05.02 |
[컴퓨터 네트워크] 컴퓨터 네트워크 Introduction 정리 (0) | 2021.05.02 |
[컴퓨터 네트워크] Chapter4) Network Layer 네트워크 계층 (0) | 2021.04.20 |