반응형

연휴 잘 보내셨나요?
혼공단 방학인 김에 다른 공부들 더 하려고 했는데요
역시 개같이 실패^^하고 2월이 되었읍니다
지난달에 혼공단이라도 해서 다행이지 뭐예요
아니었음 아무것도 못 이룬 사람 될 뻔
하지만 벌써 혼공단 절반이나 잘 마친 사람이 되었다
(혼공단 짱 자주 해조요)
아무튼 다시 돌아온 혼자 공부하는 네트워크 4주 차에 할 일은요
네 번째 챕터인 전송 계층을 공부하고

<목차>
Chapter 1. 컴퓨터 네트워크 시작하기
Chapter 2. 물리 계층과 데이터 링크 계층
Chapter 3. 네트워크 계층
Chapter 4. 전송 계층
Chapter 5. 응용 계층
Chapter 6. 실습으로 복습하는 네트워크
Chapter 7. 네트워크 심화

혼공단 숙제로 작업 관리자에서 프로세스별 PID 확인해 보는 거라죠

지난 내용 복습하기

저번에도 말했지만 제가 혼공단을 하는 목적은 뇌에 뭐라도 남기기입니다
본격적인 전송 계층 공부에 앞서 네트워크 계층까지 복습부터 해볼게요

계층명지난 주 핵심다 합쳐서 복습하기
네트워크인터넷 프로토콜 IP
IP 주소(IPv4, IPv6)
ARP(IP to MAC)
네트워크 클래스
NAT(공인/사설IP)
DHCP(IP 동적할당)
라우팅 프로토콜
(내부 RIP&OSPF,
외부 BGP)
- 메시지를 다른 네트워크에 속한 수신지까지 전달하는 계층 = 네트워크 간 통신 계층
- IP는 데이터그램 기반 비신뢰성, 비연결성 서비스로, IP 단편화(패킷의 분해 및 조립), IP 주소 지정, 경로 선택 기능을 가짐
- 개방 시스템 들 간 네트워크 연결 설정/유지/관리 기능, 데이터의 교환/중계 기능, 경로 제어, 패킷 교환, 트래픽 제어 등의 기능을 수행함
- 전송 단위는 패킷
- 장비로는 라우터
- 관련 프로토콜로는 IP, ICMP, IGMP, ARP, RARP 등

- IPv4는 4바이트(32비트)+10진수 표현, 클래스 단위로 비순차적으로 할당함. 보안 기능이 없으며, 패킷 크기에 제한(64바이트)이 있음. 유니캐스트/브로드캐스트/멀티캐스트 방식을 사용함 
- IPv6는 16바이트(128비트)+16진수 표현, 네트워크/단말 순서로 순차적으로 할당함. 확장 헤더를 사용해 인증/보안 기능을 포함하며, 패킷 크기에 제한이 없음. 유니캐스트/멀티캐스트/애니캐스트 방식을 사용함

- 하나의 IP 주소는 네트워크 주소와 호스트 주소로 구성된
- (클래스 풀 주소 체계) 네트워크 크기에 따라 IP 주소를 분류하는 걸 클래스라 함. 클래스는 A~E까지 5개 존재. 클래스 풀 주소는 네트워크 크기가 고정이라는 한계가 존재함
- (클래스리스 주소 체계) 네트워크 주소는 1로, 호스트 주소는 0으로 표기하여 임의로 나누는 방식을 서브넷 마스크라 함. IP 주소와 서브넷 마스크를 비트 AND 연산하면 네트워크 주소가 나온다. 서브넷 마스크는 10진수로 표기하거나, IP 주소/서브넷 마스크 상 1의 개수 형식으로 표현하는 CIDR 표기법을 사용함

- ARP 프로토콜은 "동일 네트워크 내에서" IP 주소를 통해 MAC 주소를 알아내는 과정. ARP 요청(브로드캐스트) > ARP 응답(유니캐스트) > ARP 테이블 갱신 순으로 동작한다.
- NAT는 공인 IP와 사설 IP를 상호 변환해주는 기술
- DHCP는 네트워크 안의 호스트들에게 IP와 DNS 서버, 서브넷 마스크 주소를 동적으로 할당하는 프로토콜. DHCP 할당은 DISCOVER, OFFER, REQUEST, ACK 4단계로 구성됨(모두 브로드캐스트). 

- 라우팅 프로토콜은 라우터끼리 자신들의 정보를 교환하며 패킷이 이동할 최적의 경로를 찾고자 사용. AS 내부에서 수행되면 IGP로 RIP와 OSPF가 있고, 외부에서 수행되면 EGP로 BGP가 있음
- IGP는 거리 벡터를 사용하는 RIP와 링크 상태를 사용하는 OSPF/IS-IS로 나뉨
데이터 링크NIC
스위치
(전이중 통신+VLAN)
- 네트워크 내 주변장치 간 정보를 올바르게 주고받기 위한 계층
- MAC 주소 체계를 통해 네트워크 내 송수신지를 특정
- 물리적으로 연결된 인접한 개방 시스템들 간 신뢰/효율적 정보 전송을 위해 시스템 간 연결 설정과 유지 및 종료 담당
- 오류 검출 및 회복을 위한 오류 제어, 송수신측 속도 차이 해결을 위한 흐름 제어, 프레임 순서적 전송을 위한 순서 제어 기능을 가짐
- 전송 단위인 프레임에 물리적 주소를 부여함
- 장비로는 랜카드, 브리지, 스위치 등
- 관련 프로토콜로는 HDLC, LAPB, LLC, MAC, LAPD, PPP, 이더넷 등

- 스위치는 전이중 통신을 한다. MAC 주소 학습과 테이블을 이용해, 특정 MAC 주소를 가진 호스트에만 프레임을 전달할 수 있다. MAC 주소 학습은 플러딩, 포워딩과 필터링, 에이징을 통해 이루어진다.
- 스위치는 또한 가상의 LAN을 만드는 VLAN 기능을 지원한다. 
물리트위스티드 페어 케이블
광섬유 케이블
허브(반이중 통신+CSMA/CD)
- OSI 모델 최하단 계층
- 0과 1로 표현되는 비트 신호를 주고 받음 (전송단위가 Bit)
통신 케이블로 데이터를 전송하는 물리적 장비에 필요한 기계/전기/기능/절차적 특성에 대한 규칙을 정의
- 장비로는 통신 케이블, 리피터, 허브 등
- 관련 프로토콜로는 RS-232C, X.21 등

- 허브는 반이중 통신을 해서 무전기처럼 송수신을 번갈아 가면서 한다.
다른 호스트가 기다리지 않고 신호를 보낼시 충돌 위험이 있는데 이를 방지하는 프로토콜이 CSMA/CD이다. Carrier Sense(캐리어를 감지하고) Multiple Access(다중 접근시에) Collision Detection(충돌을 검출)한다.

이것 뭐예요...? 정리하고 보니 3주 차 네트워크 계층에서 공부한 게 엄청 많네?
네트워크 계층의 가장 큰 특징이자 한계는 신뢰할 수 없는 비신뢰성이자 비연결형 프로토콜이라는 점인데요. IP 프로토콜은 패킷을 전달할 때, 패킷이 수신지까지 제대로 전송되었다는 보장을 해주지 않기 때문이에요. 다른 말로 최선형 전달 best effort delivery 라고도 한다는데요. 최선을 다해 전송은 해보겠지만, 그 결과는 보장하지 못한다는 의미래요. 약간 역설적인데,,,
또한, 송수신 호스트 간에 사전에 연결 작업을 하지 않아요. 성능이 더 중요하기에 수신지를 향해 패킷을 전송만 합니다.

연결형 통신 + 신뢰성 있는 통신 = 전송 계층 

이 두 한계를 보완하는 계층이 오늘 배우게 될 전송 계층이에요. 전송 계층에는 가상의 회선을 설정하듯 연결을 수립하고, 송수신하는 동안에는 계속 유지하는 연결형 프로토콜인 TCP가 있어요. 그리고 패킷이 수신지까지 올바른 순서대로 확실히 전달되는 것을 보장하고자, 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어와 같은 기능도 제공합니다. 또한, 성능이 더 중요한 경우를 지원하고자 비연결형 통신 프로토콜인 UDP도 있어요.
여기에 더해 상위 계층인 응용 계층과의 연결 다리 역할을 하기도 한다고 하는데요. 실행 중인 특정 애플리케이션까지 패킷이 전달되기 위해서는 패킷에 특정 어플리케이션을 식별할 수 있는 정보가 있어야 해요. 이를 포트라 하는데요, 전송 계층에서는 패킷 내의 송/수신지 포트 번호를 통해 송/수신지 호스트의 어플리케이션을 식별합니다.

# 포트 port

포트 번호는 16비트로 표현 가능하며, 사용가능한 포트의 수는 2^16 = 65,536개이다.
즉, 할당 가능한 포트 번호는 0번부터 65,535번까지이다. 포트 번호는 번호 범위에 따라 세 종류로 나눈다.

포트 종류포트 번호 범위잘 알려진 포트 번호들
잘 알려진 포트
well known or system port
0-102320/21(FTP), 22(SSH), 23(TELNET), 25(SMTP), 53(DNS), 67/68(DHCP S/C), 80(HTTP), 443(HTTPS)
등록된 포트
registered port
1024-491511433(MS SQL 서버DB), 3306(MySQL DB), 6379(Redis), 8080(HTTPS 대체)
동적 or 사설 포트
dynamic or private port
49152-65535주로 클라이언트에서 동작하는 프로그램들

잘 알려진 포트와 등록된 포트는 인터넷 할당 번호 관리 기관(IANA)에서 할당하고 관리한다. 자세한 목록을 보고 싶다면 IANA 홈페이지에서 확인 가능하다. 하지만 여기의 포트 번호는 권고일 뿐 강제는 아니다.

IP 주소와 포트 번호가 함께 제공되면, 특정 호스트에서 실행 중인 특정 어플리케이션 프로세스를 식별할 수 있게 된다.
그래서 포트 번호는 IP 주소:포트 번호 형식으로 사용되는 경우가 많다.

IP 주소:포트 번호
호스트 식별 어플리케이션 프로세스 식별

# 포트 기반 NAT, NAPT

NAT는 IP 주소를 변환하는 기술로, 주로 네트워크 내부의 사설 IP 주소와 네트워크 외부의 공인 IP 주소를 변환하는 데 사용된다. 하지만 만약 1:1로 매핑해서 사용한다면, 공인 IP 주소 수가 부족하여 수없이 많은 사설 주소를 모두 변환해서 사용하기가 어렵다. 그래서 요즘의 NAT 기술은 변환하고자 하는 다수의 사설 IP 주소를 그보다 적은 수의 공인 IP 주소로 변환할 수 있게 하는데, 이때 포트를 활용한다.
포트 기반의 NAT를 NAPT(Network Address Port Translation)이라 한다. NAPT는 포트를 활용해 하나의 공인 IP 주소를 여러 사설 IP 주소가 공유할 수 있도록 하는 NAT의 일종이다. NAT 테이블에 변환할 IP 주소 쌍과 함께 포트 번호를 기록하고, 변환 시에 참고하는 방법이다. 포트 번호를 통해 네트워크 내부 호스트를 특정할 수 있기에, 다수의 사설 IP 주소를 그보다 적은 수의 공인 IP 주소로 변환할 수 있게 된다. N:1로 매핑할 수 있어 공인 IP 주소 수 부족 문제를 개선하는 것이다.

출처 : 혼공네트 유튜브 강의 내 장표 캡쳐함

# 추가 학습 from 네트워크 계층, ICMP

추가 학습 내용으로 IP의 비신뢰성/비연결성 전송 특성을 보완하기 위한 네트워크 계층의 프로토콜을 알아보자
전송 계층의 내용은 아니라 헷갈림 방지를 위해, 오늘도 접어두기 기능을 적극 활용합니다^^

더보기

💡 ICMP(Internet Control Message Protocol)
- IP 패킷의 전송 과정에 대한 피드백 메시지를 얻기 위해 사용하는 프로토콜
- 호스트 서버와 인터넷 게이트웨이 사이에서 메시지를 제어하고 오류 처리와 전송 경로의 변경 및 파악을 위한 프로토콜임
- IP 데이터그램을 사용하지만, 메시지는 TCP/IP 소프트웨어에 의해 처리되는 특징을 가짐


- ICMP 메시지 종류로는 크게
  1) (오류 보고) 전송 과정에서 발생한 문제 상황에 대한 오류 보고
  2) (질       의) 네트워크에 대한 진단 정보 = 네트워크상의 정보 제공
- ICMP 메시지는 ICMP 패킷 헤더에 포함되어 있는 타입과 코드 정보로 정의한다.
   ICMP 패킷 헤더의 타입 필드에는 ICMP 메시지의 유형을 번호로, 코드 필드에는 구체적인 메시지 내용을 번호로 명시한다.

[ICMP 오류 보고 메시지의 특징]
- 어떠한 ICMP 오류 메시지도 ICMP 오류를 운반하는 데이터그램의 응답으로 생성되지 않음
- 어떠한 ICMP 오류 메시지도 처음 단편이 아닌 단편 데이터그램을 위해 생성되지 않음
- 어떠한 ICMP 오류 메시지도 멀티캐스트 주소를 가진 데이터그램을 위해 생성되지 않음
- 어떠한 ICMP 오류 메시지도 127.0.0.0, 0.0.0.0과 같이 특수 주소를 가진 데이터그램을 위해 생성되지 않음

[ICMP 오류 보고 메시지 종류]
- (Type 3) 목적지 도달 불가, Destination Unreachable
   데이터그램이 최종 목적지에 왜 도착하지 못했는지에 대한 오류를 정의, 0~15까지의 다른 코드를 사용함
   (코드 0) 네트워크 도달 불가, (코드 1) 호스트 도달 불가, (코드 2) 프로토콜 도달 불가, (코드 3) 포트 도달 불가, (코드 4) 단편화가 필요하나 DF가 1이라 단편화 불가
- (Type 4) 근원지 억제, Source Quench
   네트워크 충돌이 발생해서 데이터그램이 폐기되었음을 송신자에게 알림. 메시지를 받은 송신자(근원지)는 데이터그램 송신 과정을 천천히 억제하여 수행한다. 이를 통해 IP 프로토콜에 혼잡제어 메커니즘을 추가하는 셈
- (Type 5) 재지정 메시지, Redirection
   발신자가 메시지 전송에 잘못된 라우터를 사용할 때 이용됨. 라우터는 발신자에게 향후 디폴트 라우터로 변경하라고 알리는 메시지를 보낸다. 그래서 메시지 안에 디폴트 라우터의 IP 주소가 포함됨
- (Type 11) 시간 경과, Time Exceeded
   타임아웃 발생으로 IP 패킷이 폐기되었음을 알림. 타임아웃 사유는 코드를 통해 확인함
   (코드 0) TTL 만료. 최종 목적지 도달 전에 TTL값이 0이 되어 폐기됨
   (코드 1) 패킷 재조합 타임 만료. 보통 IP 데이터그램 일부 단편이 전송과정에서 손실되어 재조합에 실패할 시 발생. 패킷 재조합 과정에서 타임아웃이 발생하여 해당 IP 데이터그램이 모두 폐기되었음을 알림
- (Type 12) 매개변수 문제, Prameter Problem
   (코드 0) 데이터그램의 헤더에 문제, (코드 1) 어떤 옵션에 문제(옵션 없음/의미 파악 불가 등)가 있을 때 사용

[ICMP 질의 메시지 종류]
인터넷에서 호스트/라우터가 활성화되었는지, 두 장치 사이 IP 데이터그램이 단/양방향인지 확인할 때 주로 사용함
- (Type 8) 에코 요청, Echo Request
- (Type 0) 에코 요청 응답, Echo Reply
- (Type 9) 라우터 광고
   라우터가 호스트에게 자신을 알릴 때 사용

* ping은 네트워크 상태를 진단하는 가장 기본적인 명령어로, ICMP 에코 요청과 에코 응답 메시지를 기반으로 구현됨
  그 외에도 traceroute/tracert도 ICMP 메시지를 기반으로 동작함. 참고하시라~

전송 계층 프로토콜, TCP와 UDP

# TCP 통신 단계와 세그먼트 구조

TCP는 데이터를 송수신하기 전에 연결을 수립하고, 통신이 끝나면 연결을 종료한다.
그리고 데이터 송수신 과정에서 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공한다.

1단계 2단계 3단계
연결 수립>>>데이터 송수신
(재전송을 통한 오류/흐름/혼잡 제어)
>>>연결 종료

MSS(Max Segment Size)는 TCP로 전송할 수 있는 최대 페이로드 크기를 의미한다.
MSS 크기 고려 시 TCP 헤더의 크기는 제외한다. 간단하게 그려보자면 아래와 같은 느낌이다.

 IP MTU (헤더 포함) 
이더넷 헤더IP 헤더TCP 헤더페이로드FCS
   TCP MSS 

계속해서 TCP 세그먼트 구조를 살펴보고자 한다. 간단하게 그려보면 아래와 같은데,

0 4 8 12 16     32
송신지 포트 수신지 포트
순서 번호(SEQ NUM)
확인 응답 번호 (ACK NUM)
데이터 오프셋 예약 제어 or 플래그 비트
CWR ECE URG ACK PSH RST SYN FIN
윈도우
체크섬 긴급 포인터
옵션

- 송/수신지 포트 : 송/수신지 애플리케이션을 식별하는 포트 번호가 기재된 필드
- 순서 번호 : 송수신되는 세그먼트의 올바른 순서 보장을 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호
- 확인 응답 번호 : 상대 호스트가 보낸 세그먼트에 대한 응답. 다음으로 수신하기를 기대하는 순서 번호를 명시함
- 제어 or 플래그 비트 : 현재 세그먼트에 대한 부가정보를 나타냄. 기본적으로 8비트로 구성. 각 자리의 비트는 각기 다른 의미를 가짐
   >> ACK : 세그먼트 승인을 나타내는 비트
   >> SYN : 연결을 수립하기 위한 비트
   >> FIN : 연결을 종료하기 위한 비트
- 윈도우 : 한 번에 수신하고자 하는 데이터의 양을 나타내는 수신 윈도우의 크기를 명시
🧐 순서 번호와 확인 응답 번호에 대해 조금 더 알아보자
만약 전송할 데이터가 1900바이트이고, MSS가 500바이트라고 가정한다면, 이 데이터는 4개의 세그먼트로 나눌 수 있다.
처음 통신을 위해 연결을 수립했다면(제어비트 SYN 플래그가 1이라면), 순서 번호는 무작위값이 된다. 이를 초기 순서 번호(ISN)이라 한다.
연결 수립 이후 데이터를 송신하는 동안 순서 번호는 송신한 바이트를 더해가는 누적 형태가 된다.
즉, 순서 번호는 초기 순서 번호 + 송신한 바이트 수가 되는 셈이다.
만일 초기 순서 번호가 100이라면, 이후 세그먼트들의 순서 번호는 초기 순서번호 +500, +1000, +1500 순으로 증가하게 된다.

출처 : 혼공네트 유튜브 강의 내 장표 캡쳐함

확인 응답 번호는 순서 번호에 대한 응답이다. "다음에는 이거 보내조요 or 다음에 받아야 하는 애는 이거임 내놔"하고 알려주는 값이다.
즉, 수신자가 다음에 받기를 기대하는 순서 번호로, 일반적으로 수신한 순서번호 +1로 설정한다.
확인 응답 번호 값을 보낼 때는 제어비트 ACK 플래그 값을 1로 설정하고, 확인 응답 번호에 수신한 순서 번호+1을 설정하면 된다.

# TCP 연결 수립 : 3 웨이 핸드셰이크

TCP의 연결 수립은 3개 단계로 이루어진다. 우선 그림으로 살펴보면 이렇다.

출처 : 도서 용어노트에 추가 필기함

그림만으로는 이해가 안 가니까 단계별로 추가적인 설명을 해보면,

단계TCP 상태송수신 방향세그먼트세그먼트 주요 정보비유
CLOSED / LISTEN : 연결이 수립되지 않은 상태
1단계
액티브 오픈
SYN-SENTA >> BSYN- 호스트 A의 초기 순서 번호
- 1로 설정된 SYN 비트
우리 연결하자
2단계
패시브 오픈
SYN-RECEIVEDB >> ASYN+ACK- 호스트 B의 초기 순서 번호
- 호스트 A 전송 세그먼트에 대한 확인 응답 번호
- 1로 설정된 SYN 비트와 ACK 비트
ㅇㅇ 확인함
연결하자 ㄱㄱ
3단계
연결 확립
ESTABLISHEDA >> BACK- 호스트 A의 다음 순서 번호
- 호스트 B 전송 세그먼트에 대한 확인 응답 번호
- 1로 설정된 ACK 비트
ㅇㅇ 확인함

이렇게 연결이 되고 나면, 필요한 만큼 데이터 송수신을 하면 된다죠.

중요한 개념이라 잘 알아둬야 함... 왜냐?
언제나 그렇듯 시험에 자주 나와요^ㅁ^
이런 식으로...

출처 : 한국은행 전공학술 기출 예시문제

이제 이 문제를 풀 수 있다.
TCP 3-way handshake니까 TCP 연결 수립이다.
HOST B가 패시브 오픈이니까 SYN에 대한 응답으로 ACK =24(23+1)을 보내고,
자신의 SYN 패킷에는 초기 순서 번호로 20(21-1)을 담아 보내면 된다.
일반적으로 수신한 번호+1을 보내기 때문!  
SYN Flooding 공격은... 너무 길어지니까 나중에 공부하자(빈 말)

# TCP 연결 종료 : 4 웨이 핸드셰이크
데이터 송수신이 끝났다면 연결을 종료해야 한다죠. TCP가 연결을 종료하는 과정은 송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으면 된다. 그림으로 또 살펴보자면,

출처 : 도서 용어노트에 추가 필기함

이번에도 그림만으로는 이해가 안 가니까 단계별로 추가적인 설명을 해보면,

단계TCP 상태송수신 방향세그먼트세그먼트 주요 정보비유
ESTABLISHED : 열심히 데이터 송수신하는 상태
1단계
액티브 클로즈
FIN-WAIT-1A >> BFIN- 1로 설정된 FIN 비트우리 연결끊자
2단계
패시브 클로즈
CLOSE-WAITB >> AACK- 호스트 A 전송 세그먼트에 대한 확인 응답 번호
- 1로 설정된 ACK 비트
ㅇㅇ 확인함
 FIN-WAIT-2--상대의 FIN 세그먼트를 기다리는 중-
3단계
연결 끊기
LAST-ACKB >> AFIN- 1로 설정된 FIN 비트이제 연결끊어
4단계
확인
TIME-WAITA >> BACK- 호스트 B 전송 세그먼트에 대한 확인 응답 번호
- 1로 설정된 ACK 비트
ㅇㅇ 확인함
B(서버)는 마지막 ACK 패킷을 수신하면 바로 CLOSED로 바뀐다.
하지만 A(클라이언트)는 마지막 ACK 세그먼트가 올바르게 전송되지 않을 가능성을 고려하여
일정 시간 기다리는 TIME-WAIT 상태를 가진 후에 CLOSED로 접어든다.

CLOSED : 두 호스트 모두 연결을 종료한 상태

이러면 제대로 연결 종료된 거다. FIN-ACK을 서로 한 번씩 주고받고, 잠시 대기했다가 샤따 내리기 정도로 기억하면 된다죠.
여기서 잠깐! 연결 확립과 연결 종료 모두 TCP 상태라는 개념이 새롭게 등장한다. TCP는 연결형/신뢰형 통신을 위해 다양한 상태를 유지한다. 상태는 현재 어떤 통신 과정에 있는지를 나타내는 정보다. 그래서 TCP를 스테이트풀 stateful 프로토콜이라고도 한다.
TCP의 상태는 크게 3가지로 나뉜다. 1) 연결이 수립되지 않은 상태, 2) 연결 수립 과정에서 주로 확인할 수 있는 상태, 3) 연결 종료 과정에서 주로 확인할 수 있는 상태라죠. 각 상태와 의미하는 바를 정리해 보자면,

상태 분류상태명설명
연결 수립 XCLOSED아무 연결이 없는 상태
LISTEN일종의 연결 대기 상태 보통 서버로 동작하는 패시브 오픈 호스트는 이 상태를 유지함
연결 수립 중SYN-SENT액티브 오픈 호스트가 SYN 세그먼트를 보내고, 그에 대한 응답으로 SYN+ACK 세그먼트를 기다리는 상태 = 연결 요청 후 대기하는 상태
SYN-RECEIVED패시브 오픈 호스트가 SYN+ACK 세그먼트를 보내고, 그에 대한 응답으로 ACK를 기다리는 상태
ESTABLISHED연결이 확립되었음을 나타내는 상태 = 데이터 송수신 가능한 상태
연결 종료 중FIN-WAIT-1일반적인 TCP 연결 종료의 첫 단계. FIN 세그먼트로 연결 종료 요청을 보낸 후 액티브 클로즈 호스트의 상태 
CLOSE-WAITFIN 세그먼트의 응답으로 ACK 세그먼트를 보내고, 패시브 클로즈 호스트가 대기하는 상태
FIN-WAIT-2FIN-WAIT-1 상태에서 ACK를 받으면 FIN-WAIT-2로 상태가 변경됨. 상대의 FIN 세그먼트를 기다리는 상태
LAST-ACKCLOSE-WAIT 상태에서 FIN 세그먼트를 보내고, 이에 대한 ACK 세그먼트를 기다리는 상태
TIME-WAITFIN 세그먼트를 수신한 액티브 클로즈 호스트가 ACK를 전송한 후의 상태. 일정시간 기다린 후에 CLOSED로 바뀐다 
CLOSING보통 동시에 연결을 종료하고자 할 때 전이되는 상태. 서로가 FIN을 보내고 받은 뒤에 ACK를 보냈지만, 아직 자신의 FIN에 대한 ACK는 받지 못했을 때 접어드는 상태이다. 이 경우 ACK를 수신한다면 각자 TIME-WAIT 상태로 들어갔다가 연결을 종료하게 된다.

# UDP : 비연결형, 비신뢰성, 스테이트리스 프로토콜

UDP는 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜이다. 상태를 유지/활용하지 않기에 스테이트리스 stateless 프로토콜이라고 하기도 한다. 보장하는 내용이 없기에, TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리한다는 장점이 있다. 그래서 실시간 스트리밍 서비스, 인터넷 전화와 같이 패킷이 조금 손실되어도 무방한, 실시간성을 강조하는 상황에서 주로 사용한다. UDP 데이터그램 헤더 구조는 아래와 같다.

016 32
송신지 포트수신지 포트
길이체크섬

- 송/수신지 포트
- 길이 : 헤더를 포함한 UDP 데이터그램의 바이트
- 체크섬 : 데이터그램 전송 과정의 오류 발생 여부 검사를 위한 필드. 수신지는 이 필드 값을 토대로 정보 훼손 여부를 판별하고, 문제가 있다고 판단한 데이터그램은 폐기함
두 프로토콜도 시험에 자주 나오니까 정리하고 넘어가자면,

TCPUDP
- 연결형 서비스
- 가상 회선 방식 (하나의 회선 사용 = 1:1 통신)
- 패킷 전송 순서 보장 및 수신 여부 확인
- 송수신부간 연결 확인
- 데이터의 신뢰성 높음
- 속도 느림
- HTTP 통신, 이메일/파일 전송 등에 사용
- 오류, 흐름, 혼잡 제어 제공
- 비연결형 서비스
- 데이터그램 패킷 교환 방식(서로 다른 회선 활용)
- 패킷 순서 보장 X 및 수신 여부 확인도 X
- 데이터 신뢰성 낮음
- 속도 빠름
- 실시간 서비스
- 체크섬을 활용한 오류 검출 가능

TCP의 오류, 흐름, 혼잡 제어 기능

TCP는 자신의 신뢰성을 보장하기 위해, 재전송을 기반으로 다양한 오류를 제어하고, 흐름 제어를 통해 처리 가능한 양만큼만 데이터를 주고받으며, 혼잡 제어를 통해 네트워크 상태에 따라 전송량을 조절한다. 각각의 기능에 대해 자세히 알아보자.

# TCP 오류 제어 : 재전송 기법

TCP 세그먼트에는 오류 검출용 체크섬 필드가 있다. 하지만 이 체크섬은 수신 호스트가 수행하는 훼손 여부 체크에만 사용될 뿐이다. 송신 호스트가 세그먼트 전송 과정에 문제가 있다는 걸 인지하는데 쓰이지는 않는다. 그런데 TCP가 제 기능을 하려면,
1) 송신 호스트가 자기가 보낸 세그먼트에 문제가 있다는 걸 알아야 하고, (오류 감지)
2) 이 사실을 알게 되면 해당 세그먼트를 다시 보낼 수 있어야 한다 (재전송)
TCP는 오류를 검출/감지하고 세그먼트를 재전송해야 한다고 판단하는 상황은 크게 2가지로 나눈다.

1) 중복된 ACK 세그먼트를 수신했을 때
수신 호스트는 자신이 받은 세그먼트 순서 번호 중 일부가 누락되었다면 중복된 ACK를 보내게 된다. 중복된 ACK가 도착한다는 건, 송신 호스트가 보낸 세그먼트 중 일부가 상대에게 제대로 도착하지 않았음을 의미한다.
2) 타임 아웃이 발생했을 때
TCP 세그먼트 송신 호스트는 모두 재전송 타이머라는 값을 사용한다. 자신이 세그먼트를 전송할 때 이 타이머를 시작하게 되는데, 이 타이머의 정해진 시간이 끝날 때까지(타임아웃) ACK가 오지 않으면, 세그먼트가 상대에게 정상적으로 도착하지 않았다고 간주한다.
출처 : 혼공네트 유튜브 강의 내 장표 쌔비지

이렇게 수신 호스트가 보내온 ACK와 재전송 타이머를 토대로 문제를 인지한 TCP는 오류가 발생한 메시지를 재전송한다.
이를 ARQ(자동 재전송 요구, Automatic Repeat Request)라 한다. ARQ는 종류가 다양한데, 그중 가장 유명한 세 가지는

1) Stop-and-Wait ARQ = 정지-대기
제대로 전달했음을 확인하기 전까지는 새로운 메시지를 보내지 않음. 세그먼트 송신 후 이에 대한 ACK 세그먼트가 와야만 다음 세그먼트를 보내는, 가장 단순하고 높은 신뢰성을 보장하는 방식이다. 하지만 네트워크 이용 효율과 성능이 저하된다는 단점도 있다. 
2) Go-Back-N ARQ
파이프라이닝을 활용해 여러 세그먼트를 전송하고, 도중에 잘못 전송된 세그먼트가 있다면 해당 세그먼트부터 전부 다시 보내는 방식이다. 잘못 전송되었음을 아는 방법은, 타임아웃이 발생했거나 타임아웃 전에 세 번의 동일한 ACK가 수신되는 것이다. 후자의 상황에서 바로 세그먼트를 다시 보내는 걸 빠른 재전송이라 한다.
수신 호스트는 잘못 전송된 세그먼트 이후의 모든 세그먼트는 정상 여부에 관계없이 폐기한다. 송신 호스트에서 잘못 전송된 세그먼트부터 전부 다시 보낼 예정이기 때문이다.
이 방식에서 순서번호 n에 대한 ACK 세그먼트는 n번까지의 확인 응답에 해당한다(누적 확인 응답)
3) Selective Repeat ARQ
동일하게 파이프라이닝을 활용한다. 하지만 제대로 송수신된 세그먼트는 ACK 응답을 보내는 방식이다(개별 확인 응답)
송신 호스트는 ACK 응답이 오지 않은, 잘못 전송된 세그먼트 하나만 다시 보내면 된다.
불필요한 재전송을 피하는 대신 수신 호스트의 처리 절차가 복잡해진다. 잡음이 많은 경우에 효과적
출처 : 컴퓨터 네트워크 하향식 접근 6판 원서

# TCP 흐름 제어 : 슬라이딩 윈도우

파이프라이닝 기반의 Go-Back-N과 Selective Repeat을 활용하면 한 번에 여러 세그먼트를 보내게 된다. 그런데, 수신 호스트가 한 번에 받아서 처리할 수 있는 세그먼트 양은 한정되어 있다. 수신된 세그먼트가 애플리케이션 프로세스에 의해 읽히기 전에 임시로 저장되는 공간을 수신 버퍼라 하는데, 이 공간보다 더 많은 데이터를 보내면 버퍼가 넘쳐 처리가 불가하기 때문이다. 그래서 송신 호스트는 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 유지하는, 흐름 제어를 사용해야 한다.
흐름 제어에는 슬라이딩 윈도우를 사용한다. 윈도우란 송신 호스트가 파이프라이닝해서 보낼 수 있는 최대량을 의미한다. 윈도우의 크기만큼은 ACK 응답 없이도 한 번에 전송이 가능하다. 윈도우 값은 TCP 세그먼트 내 윈도우 필드를 통해 확인 가능하다.
자세한 건 아래 그림을 보면서 이해해 보자. 만약 수신 호스트가 첫 번째 세그먼트를 올바르게 수신했다면 , ACK를 보내고 수신 윈도우를 오른쪽으로 한 칸 이동한다. ACK를 받은 송신 호스트도 송신 윈도우를 오른쪽으로 한 칸 이동한다. 이렇게 계속 오른쪽으로 미끄러지듯 움직이면서 흐름을 제어해서 슬라이딩 윈도우라고 부른다죠.

출처 : 혼공네트 유튜브 강의 내 장표 쌔비지하고 추가 필기

# TCP 혼잡 제어 : 혼잡 윈도우와 AIMD - 느린 시작, 혼잡 회피, 빠른 회복 

혼잡 congestion 이란 많은 트래픽으로 인해 패킷의 처리 속도가 느려지거나 유실될 우려가 있는 네트워크 상황을 의미한다. 송신 호스트는 네트워크 혼잡도를 판단하고 혼잡한 정도에 맞춰 유동적으로 전송량을 조절하며 혼잡 제어를 수행한다.
혼잡 윈도우는 혼잡 없이 전송할 수 있을 법한 데이터의 양을 의미한다. 요 정도 양이면 혼잡 없이 전송 가능하겠지?! 라고 예측할 때, 요 정도에 해당하는 양을 말한다죠. 혼잡 윈도우가 크면 한 번에 전송할 수 있는 세그먼트의 수가 많다는 의미다.
그런데, 혼잡 윈도우의 크기는 언제나 똑같으면 안된다. 네트워크 상황에 따라 유동적으로 바뀌기 때문. 그래서 혼잡 윈도우 크기로 어느 정도가 적당할지 결정해야 하는데, 이때 사용하는 방법을 혼잡 제어 알고리즘이라 한다.

# 가장 기본적인 혼잡 제어 알고리즘 AIMD

AIMD는 Additive Increase/Multiplicative Decrease 의 약자로, "합으로 증가, 곱으로 감소"라는 의미를 가지고 있다.
혼잡이 감지되지 않을 때는 혼잡 윈도우를 RTT*마다 1씩 선형적으로 증가시키고,
혼잡이 감지된다면 혼잡 윈도우를 절반으로 뚝 떨어뜨리는 동작을 반복하는 알고리즘이다.
그래서 혼잡 윈도우가 톱니 모양으로 변화한다는 특징을 가진다.
초기 전송 속도가 느리다는 단점이 있으나, 시간이 지나면 여러 송신 측이 네트워크 대역폭을 공평하게 사용할 수 있다.
하지만 AIMD 하나로는 혼잡 제어가 어렵기에, 추가적으로 느린 시작, 혼잡 회피, 빠른 회복이라는 세 알고리즘을 같이 사용한다.

1) 느린 시작 Slow start
혼잡 윈도우를 1부터 시작해 문제없이 수신된 세그먼트 하나당 1씩 증가시키는 방법으로, 혼잡 윈도우는 RTT마다 2배씩 지수 증가한다. 혼잡 윈도우 크기 증가가 느린 AIMD에 비해, 초기 전송 속도를 상대적으로 빠르게 확보 가능하다는 장점이 있다.
하지만 계속 지수로 증가하면 혼잡 발생 확률이 높아지기에, 느린 시작 임계치 threshold라는 값을 정한다. 타임아웃이 발생하거나, 세 번의 중복된 ACK 세그먼트가 발생하거나, 혼잡 윈도우 값이 느린 시작 임계치 이상이 되어 혼잡이 감지된다면 각각 이렇게 대응한다.
  >> 타임아웃 발생 : 혼잡 윈도우 값을 1로, 느린 시작 임계치 값은 혼잡 감지 당시의 윈도우 값의 절반으로 초기화하고 느린 시작 재개
  >> 세 번의 중복 ACK 발생 : (빠른 재전송 후) 빠른 회복 수행
  >> 혼잡 윈도우가 느린 시작 임계치 이상 : 느린 시작 종료, 혼잡 윈도우를 절반으로 초기화하고 혼잡 회피 수행

2) 혼잡 회피 Congestion Avoidance
RTT마다 혼잡 윈도우를 1 MSS(Max segment size)씩 증가시키는 방법으로, 혼잡 윈도우가 선형 증가한다. 혼잡 회피 알고리즘에서 혼잡이 감지된다면 각각 이렇게 대응한다.
  >> 타임아웃 발생 : 혼잡 윈도우 값을 1로, 느린 시작 임계치 값은 혼잡 감지 당시의 윈도우 값의 절반으로 초기화하고 다시 느린 시작 수행
  >> 세 번의 중복 ACK 발생 : 혼잡 윈도우와 느린 시작 임계치 값을 대략 절반으로 낮추고 빠른 회복 수행

3) 빠른 회복 Fast Recovery
세 번의 중복 ACK가 발생했을 때 느린 시작은 건너뛰고 혼잡 회피를 수행하는 방법으로, 빠른 전송률 회복을 위해 사용한다.
단, 타임아웃이 발생 시 혼잡 윈도우 값을 1로, 느린 시작 임계치 값은 혼잡 감지 당시의 윈도우 값의 절반으로 초기화하고 다시 느린 시작 수행한다.

그림과 함께 보면 이런 식으로 진행된다죠

출처 : 한국은행 전공학술 기출 예시문제

💡 RTT = Round Trip Time
메시지를 전송한 뒤 그에 대한 답변을 받는 데까지 걸리는 시간을 의미
세그먼트 한 개를 전송하고, 그에 대한 ACK를 수신하는 데까지 걸리는 시간을 RTT라고 보면 된다죠

# 추가 학습:  TCP의 신뢰성 보장

관련해서 공부한 내용이 많으니까 짧게 요약해볼게요

TCP는 데이터의 신뢰성을 보장하기 위해 오류 제어, 흐름 제어, 혼잡 제어를 한다.
[오류 제어] 데이터 오류/유실 발생 시 재전송을 통해 신뢰성을 보장하려는 방식
[흐름 제어] 데이터 송수신측간 데이터 처리 속도 차이로 인한 데이터 손실을 방지하려는 방식. 수신 측이 주체
[혼잡 제어] 데이터 송신 측의 데이터 전달 속도와 네트워크의 속도 차이로 인한 데이터 손실을 방지하려는 방식. 송신 측이 주체

📚 혼공단 기본 숙제 

# (p206) 확인문제 1번 "IP와 연관된 통신 특성으로 알맞은 단어를 보기에서 골라보세요"
  >> 답은 비신뢰성과 비연결형이다. IP 프로토콜은 패킷이 수신지까지 제대로 전달되었다는 보장을 하지 않고(비신뢰), 사전 연결 작업 없이(비연결) 수신지를 향해 패킷을 보내기만 하기 때문이다.
# (p225) 확인문제 2번 "다음은 TCP 쓰리 웨이 핸드셰이크 과정을 나타내는 그림입니다. 괄호 안에 들어갈 말을 보기에서 골라보세요"
  >> 답은 ACK다. 호스트 A가 먼저 SYN을 보냈고, 이에 호스트 B가 응답하는 ACK+연결을 위한 SYN을 보냈다. 호스트 A는 B가 보낸 2번째 SYN에 ACK 세그먼트를 보내 응답해야 하는 상황이다.

📚 혼공단 추가 숙제 : 작업 관리자에서 프로세스별 PID 확인해보기 

나는 맥북이라 작업 관리자 대신 "활성 상태 보기" 메뉴에서 확인해 보았다. 내가 지금 뭐 하는 중인지가 투명하게 나오죠,,,
저는 지금 음악 프로세스(PID 495)로 노래를 들으면서, 사파리(PID 489)로 포스팅을 작성하고 있구요.
궁금한 거 생기면 물어보려고 내 칭구 ChatGPT(PID 930)를 켜놨고요, 숙제하려고 활성 상태 보기(PID 1648)도 켜뒀어요^ㅁ^

이전 회차들과 달리 포스팅을 이틀에 나눠서 했더니
뭔가 내용이 중구난방처럼 느껴진다
다음에는 일필휘지 인간인 척 그냥 하루에 정리해야지
암튼 4주 차도 성공

 

반응형

+ Recent posts