2023년 4월 10일
2.1 네트워크의 기초
네트워크는 컴퓨터 등의 장치들이 통신 기술을 이용하여 구축하는 연결망이다. "두 대 이상의 정보 단말기가 연결을 이루기 위해서 쓰이는 기기, 선로 등으로 구성되는 일체의 전송 매체"로 정의 할 수 있다. 노드와 링크가 서로 연결되어 있으며 리소스를 공유하는 집합을 의미한다. 노드란 서버, 라우터, 스위치 등의 네트워크 장치를 의미하고 링크는 유선 또는 무선을 의미한다.
인터넷이란 인터네트워킹 장치(라우터, 게이트웨이 등)에 의해 두 개 이상 연결된 것을 말한다.
2.1.1 처리량과 지연 시간
좋은 네트워크란 많은 처리량을 처리하며 지연 시간이 짧고 장애 빈도가 적으며 좋은 보안을 갖춘 것이다.
- 처리량
처리량은 링크 내에서 성공적으로 전달된 데이터의 양을 말하고, 얼만큼의 트래픽을 처리했는지를 나타낸다.
단위는 bps(bits per second)을 쓰고 초당 전송 또는 수신되는 비트 수라는 의미이다. 트래픽은 특정 시점에 링크 내에 흐르는 데이터의 양을 말한다.
많은 트래픽을 처리한다 = 많은 처리량을 가진다
트래픽이 많아졌다 = 흐르는 데이터가 많아졌다
처리량이 많아졌다 = 처리되는 트래픽이 많아졌다.
대역폭 : 주어진 시간 동안 네트워크 연결을 통해 흐를 수 있는 최대 비트 수
- 지연시간
지연 시간이란 요청이 처리되는 시간을 말하며, 어떤 메세지가 두 장치 사이를 왕복하는 데 걸린 시간을 말한다. 지연시간은 매체 타입(무선,유선), 패킷 크기, 라우터의 패킷 처리시간에 영향 받는다.
2.1.2 네트워크 토폴로지와 병목 현상
- 네트워크 토폴로지
네트워크 토폴로지란 노드와 링크가 어떻게 배치되어 있는지에 대한 방식이자 연결 형태를 말한다.
1. 트리 토폴로지(=계층형 토폴로지)
트리 형태로 배치한 네트워크 구성이다.
장점 : 노드의 추가, 삭제가 쉽다.
단점 : 특정 노드에 트래픽이 집중될 때 하위 노드에 영향을 끼칠 수 있다.
2. 버스 토폴로지
중앙 통신 회선 하나에 여러 개의 노드가 연결되어 공유하는 네트워크 구성이다. 근거리 통신망(LAN)에서 사용된다.
장점 : 설치 비용이 적고 신뢰성이 우수하며 중앙 통신 회선에 노드를 추가하거나 삭제하기 쉽다.
단점 : 스푸핑이 가능한 문제점이 있다.
* 스푸핑 : LAN상에서 송신부의 패킷을 송신과 관련 없는 다른 호스트에 가지 않도록 하는 스위칭 기능을 마비시키거나 속여서 특정 노드에 해당 패킷이 오도록 처리하는 것
3. 스타 토폴로지
중앙에 있는 노드에 모두 연결된 네트워크 구성이다.
장점 : 노드를 추가하거나 에러를 탐지하기 쉽고 패킷의 충돌 발생 가능성이 적다.
단점 : 장애 노드가 중앙이 아니면 다른 노드에 영향을 끼치는 것이 적지만 중앙 노드라면 전체 네트워크가 마비되고 설치 비용이 비싸다는 단점이 있다.
4. 링형 토폴로지
각 노드가 양 옆의 두 노드와 연결하여 전체적으로 고리처럼 하나의 길을 통해 통신을 하는 망 구성 방식이다. 데이터는 노드 간 이동을 하며 각 노드는 고리 모양의 길을 통해 패킷을 처리한다.
장점 : 노드 수가 증가되어도 네트워크 상 손실이 거의 없고 충돌이 발생되는 가능성이 적고 노드의 고장 발견을 쉽게 찾을 수 있다.
단점 : 네트워크 구성 변경이 어렵고 회선에 장애가 발생하면 네트워크에 영향을 크게 끼친다.
병목 현상 : 전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한 받는 현상
2.1.3 네트워크 분류
LAN : 근거리 통신망. 같은 건물이나 캠퍼스 같은 좁은 공간에서 운영. 전송 속도가 빠르고 혼잡하지 않다.
MAN : 대도시 지역 네트워크. 넓은 지역. 전송 속도는 평균이며 LAN보다는 더 많이 혼잡하다.
WAN : 광역 네트워크. 국가 또는 대륙 같은 더 넓은 지역에서 운영. 전송 속도는 낮으며 MAN보다 더 혼잡하다.
2.1.4 네트워크 성능 분석 명령어
네트워크 병목 현상의 주된 원인은 다음과 같다.
- 네트워크 대역폭
- 네트워크 토폴로지
- 서버 CPU, 메모리 사용량
- 비효율적인 네트워크 구성
이때는 네트워크 관련 테스트와 네트워크와 무관한 테스트를 통해 네트워크 문제인 것을 확인하고, 네트워크 성능 분석을 해야한다. 이때 사용되는 명령어들을 알아보자.
1. ping
네트워크 상태를 확인하려는 대상 노드를 향해 일정 크기의 패킷을 전송하는 명령어이다. 해당 노드의 패킷 수신 상태와 도달하기까지 시간을 알 수 있고, 해당 노드까지 네트워크가 잘 연결되어 있는지 확인할 수 있다.
ping[IP 주소 또는 도메인 주소]로 실행한다.
2. netstat
접속되어 있는 서비스들의 네트워크 상태를 표시하는 데 사용된다. 네트워크 접속, 라우팅 테이블, 네트워크 프로토콜 등 리스트를 보여준다. 주로 서비스의 포트가 열러 있는지 확인할 때 쓴다.
3. nslookup
DNS에 관련된 내용을 확인하기 위해 쓰는 명령어이며, 특정 도메인에 매핑된 IP를 확인하기 위해 사용한다.
4. tracert
윈도우에서는 tracert이고 리눅스에서는 traceroute라는 명령어로 구동된다. 목적지 노드까지 네트워크 경로를 확인할 때 사용하는 명령어로, 목적지 노드까지 구간들 중 어느 구간에서 응답 시간이 느려지는지 확인할 수 있다.
+ fip을 통해 대형 파일 전송하여 테스팅, tcpdump를 통해 노드로 오고 가는 패킷 캡쳐
+ 네트워크 분석 프로그램 : wireshark, netmon
2.1.5 네트워크 프로토콜 표준화
네트워크 프로토콜이란 다른 장치들끼리 데이터를 주고받기 위해 설정된 공통된 인터페이스다. IEEE, IETF라는 표준화 단체가 이를 정한다. IEEE802.3은 유선 LAN 프로토콜로, 유선으로 LAN을 구축할 때 쓰이는 프로토콜이다.
ex) 웹을 접속할 때 쓰이는 HTTP를 통해 노드들은 웹 서비스를 기반으로 데이터를 주고 받는다.
2.2 TCP/IP 4계층 모델
인터넷 프로토콜 스위트는 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 프로토콜의 집합이다. TCP/IP 4계층 모델로 설명하거나 OSI 7계층 모델로 설명한다. 이 계층들은 특정 계층이 변경되었을 때 다른 계층이 영향 받지 않도록 설계되어 있다.
<OSI 7계층 기준>
- 7계층으로 나누는 이유?
통신이 일어나는 과정을 단계별로 알 수 있고, 특정한 곳에 이상이 생기면 그 단계만 수정할 수 있기 때문이다.
1) 물리(Physical) > 리피터, 허브, 케이블 등
단지 데이터를 전기적인 신호로 변환해서 주고받는 기능을 진행하는 공간이다. 즉, 데이터를 전송하는 역할만 진행한다.
* 리피터 : 근거리 통신망을 구성하는 세그먼트들을 확장하거나 서로 연결하는데 주로 사용. 신호를 수신하여 증폭한 후 다음 구간으로 재 전송
* 허브 : 다수의 pc와 장치들을 묶어 LAN을 구성할 때 각각의 pc에 연결된 노드들을 한 곳에 모으는 장치
2) 데이터 링크(Data Link) > 브릿지, 스위치 등
물리 계층으로 송수신되는 정보를 관리하여 안전하게 전달되도록 도와주는 역할을 한다. Mac 주소를 통해 통신한다. 프레임에 Mac 주소를 부여하고 에러 검출, 재전송, 흐름 제어를 진행한다.
* 세그먼트 : 하나의 네트워크를 브리지 등을 사용해서 분리했을 때 그 각각을 지칭하는 단위
* 브릿지 : 규모가 큰 네트워크를 좀 더 작은 단위인 세그먼트(segment)로 분리할 때 사용. 브릿지는 물리 주소에 접근할 수 있어 세그먼트 구분 가능. 물리 주소란 NIC(유선일 경우 케이블과 연결되고 ,무선일 경우 데이터를 직접 송수신하는 장치. 랜카드가 대표적)에 하드웨어적으로 존재하는 주소를 의미하는데, 모든 로컬 네트워크 내에서 패킷은 이러한 물리 주소를 통해서 이동하게 됨. 브리지는 각 세그먼트간의 프레임을 필터링할 수 있기 때문에 혼잡 제어를 수행하고 문제가 발생한 세그먼트를 격리하는 역할을 수행.
* 스위치 : 네트워크 단위들을 연결하는 통신 장비로서 허브보다 전송 속도가 개선된 것
3) 네트워크(Network) > 라우터, IP
데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능을 담당한다. 라우터를 통해 이동할 경로를 선택하여 IP 주소를 지정하고, 해당 경로에 따라 패킷을 전달해준다. 라우팅, 흐름 제어, 오류 제어, 세그먼테이션 등을 수행한다.
* 라우터 : 패킷의 목적지 IP주소를 보고 가장 최단 경로로 패킷을 중계하는 역할을 담당
4) 전송(Transport) > TCP, UDP
TCP와 UDP 프로토콜을 통해 통신을 활성화한다. 포트를 열어두고, 프로그램들이 전송을 할 수 있도록 제공해준다.
* UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)
비연결형 프로토콜 이다. IP 데이터그램을 캡슐화하여 보내는 방법과 연결 설정을 하지 않고 보내는 방법을 제공한다.
UDP는 흐름제어, 오류제어 또는 손상된 세그먼트의 수신에 대한 재전송을 하지 않는다. 이 모두가 사용자 프로세스의 몫이다. UDP가 행하는 것은 포트들을 사용하여 IP 프로토콜에 인터페이스를 제공하는 것이다.
종종 클라이언트는 서버로 짧은 요청을 보내고, 짧은 응답을 기대한다. 만약 요청 또는 응답이 손실된다면, 클라이언트는 time out 되고 다시 시도할 수 있으면 된다. 코드가 간단할 뿐만 아니라 TCP 처럼 초기설정(initial setup)에서 요구되는 프로토콜보다 적은 메시지가 요구된다.
UDP를 사용한 것들에는 DNS가 있다. 어떤 호스트 네임의 IP 주소를 찾을 필요가 있는 프로그램은, DNS 서버로 호스트 네임을 포함한 UDP 패킷을 보낸다. 이 서버는 호스트의 IP 주소를 포함한 UDP 패킷으로 응답한다.
사전에 설정이 필요하지 않으며 그 후에 해제가 필요하지 않다.
* TCP
대부분의 인터넷 응용 분야들은 신뢰성 과 순차적인 전달을 필요로 한다. UDP 로는 이를 만족시킬 수 없으므로 탄생한 것이 TCP이다.
TCP(Transmission Control Protocol, 전송제어 프로토콜)는 신뢰성이 없는 인터넷을 통해 종단간에 신뢰성 있는 바이트 스트림을 전송 하도록 특별히 설계되었다. TCP 서비스는 송신자와 수신자 모두가 소켓이라고 부르는 종단점을 생성함으로써 이루어진다. TCP 에서 연결 설정(connection establishment)는 3-way handshake를 통해 행해진다.
모든 TCP 연결은 전이중(full-duplex), 점대점(point to point)방식이다.
전이중이란 전송이 양방향으로 동시에 일어날 수 있음을 의미하며, 점대점이란 각 연결이 정확히 2 개의 종단점을 가지고 있음을 의미한다.
TCP 는 멀티캐스팅이나 브로드캐스팅을 지원하지 않는다.
5) 세션(Session) > API, Socket
데이터가 통신하기 위한 논리적 연결을 담당한다. TCP/IP 세션을 만들고 없애는 책임을 지니고 있다.
6) 표현(Presentation) > JPEG, MPEG 등
데이터 표현에 대한 독립성을 제공하고 암호화하는 역할을 담당한다. 파일 인코딩, 명령어를 포장, 압축, 암호화한다.
7) 응용(Application) > HTTP, FTP, DNS 등
최종 목적지로, 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다. 사용자 인터페이스, 전자우편, 데이터베이스 관리 등의 서비스를 제공한다.
<TCP/IP 계층 기준>
1) 애플리케이션 계층
FTP, HTTP, SSH, SMTP, DNS 등의 응용 프로그램이 사용되는 프로토콜 계층이며, 웹 서비스, 이메일 등 서비스를 실질적으로 사람들에게 제공한다.
* FTP : 장치와 장치 간의 파일을 전송하는데 사용
* SSH : 보안되지 않은 네트워크에서 네트워크 서비스를 안전하게 운영하기 위한 암호화 네트워크 프로토콜
* HTTP : World Wide Web을 위한 데이터 통신의 기초이자 웹 사이트를 이용하는 데 쓰는 프로토콜
* STMP : 전자 메일 전송에 사용
* DNS : 도메인 이름과 IP 주소를 매핑해주는 서버
ex) www.naver.com에 DNS 쿼리 옴 -> [Root DNS] -> [.com DNS] -> [.naver DNS] -> [.www DNS]
=> 완벽한 주소를 찾아 IP 주소 매핑
2) 전송 계층
송신자와 수신자를 연결하는 통신 서비스를 제공하며 연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공할 수 있으며, 애플리케이션과 인터넷 계층 사이의 데이터가 전달될 때 중계한다.
* TCP : 패킷 순서보장, 연결지향 프로토콜, 신뢰성, 가상회선 패킷 교환 -> HTTP, Email, FIle transfer
* UDP : 순서 보장 x, 수신 여부 확인 x, 데이터그램 패킷 교환 -> DNS, Broadcasting
- 가상회선 패킷 교환 방식 : 각 패킷에는 가상회선 식별자가 포함되며 모든 패킷을 전송하면 가상회선이 해제되고, 패킷들은 전송된 순서대로 도착한다.
- 데이터그램 패킷 교환 방식 : 패킷이 독립적으로 이동하며 최적의 경로를 선택하여 간다. 하나의 메세지에서 분할된 여러 패킷은 서로 다른 경로로 전송될 수 있으며 전송 순서가 다를 수 있다.
- TCP와 UDP는 왜 나오게 됐는가?
- IP의 역할은 Host to Host (장치 to 장치)만을 지원한다. 장치에서 장치로 이동은 IP로 해결되지만, 하나의 장비 내에서 수많은 프로그램들이 통신을 할 경우에는 IP만으로는 한계가 있다.
- IP에서 오류가 발생한다면 ICMP에서 알려준다. 하지만 ICMP는 알려주기만 할 뿐 대처를 못하기 때문에 IP보다 윗 단계에서 처리를 해줘야 한다.
1번을 해결하기 위하여 포트 번호가, 2번을 해결하기 위해 상위 프로토콜인 TCP와 UDP가 나오게 되었다.
ICMP : 인터넷 제어 메시지 프로토콜로 네트워크 컴퓨터 위에서 돌아가는 운영체제에서 오류 메시지를 전송받는데 주로 쓰임
- 그렇다면 TCP와 UDP가 어떻게 오류를 해결하는가?
- TCP : 데이터의 분실, 중복, 순서가 뒤바뀜 등을 자동으로 보정해줘서 송수신 데이터의 정확한 전달을 할 수 있도록 해준다.
- UDP : IP가 제공하는 정도의 수준만을 제공하는 간단한 IP 상위 계층의 프로토콜이다. TCP와는 다르게 에러 발생, 재전송 필요, 순서가 뒤바뀌는 상황 때문에 애플리케이션에서 처리하는 번거로움이 존재한다.
# TCP
신뢰성 있는 통신을 제공하기 위한 프로토콜이다. IP는 패킷을 올바르게 전달하기 위해 최선을 다하지만 신뢰성을 제공하지는 못한다. 따라서 데이터 전송에 신뢰성을 더하려면 IP 프로토콜 내에 TCP 프로토콜을 함께 실어서 보내야 한다.
-
TCP는 연결 지향적 프로토콜로서 신뢰성을 보장한다.
-
TCP가 전송하는 데이터는 순차성이 있다.
패킷은 네트워크의 상태에 따라 서로 다른 경로를 통해서 목적지 호스트로 갈 수 있다. 이 때 먼저 보낸 패킷이 나중에 보낸 패킷보다 늦게 도착하는 경우도 당연히 생기게 된다. 이럴 경우 TCP에 의해 각 패킷은 순서가 매겨지기 때문에 먼저 보낸 패킷이 나중에 도착하더라도 데이터를 추출하는 과정에서 데이터의 순서에 맞게 재조합 된다. 이런 과정을 "데이터에 순차성이 있다"는 말로 표현할 수 있다. 패킷 1보다 패킷2가 먼저 도착하면 목적지 호스트의 버퍼에 저장되었다가 패킷이 1이 도착하면 원본 데이터를 조합하는데 이용된다. 이러한 일은 운영체제에 있는 프로토콜 스택에서 하게 된다. 프로토콜 스택은 운영체제 코드의 일부분으로서, 각각의 프로토콜에서 규정하는 약속대로 데이터를 전송하고 전송받기 위해 구현된 소스코드다. -
TCP는 흐름 제어를 수행한다.
-
TCP는 오류 제어를 수행한다.
TCP 헤더에 있는 체크섬 값을 이용해서 TCP 패킷이 이상 없이 전송되었는지 확인한다. 만약 이상이 없이 전송되었다면 송신지로 확인 메시지(ACK 패킷)를 보내고, 이상이 발생했다면 이상이 발생한 패킷을 버리고 확인 메시지를 보내지 않는다. 송신지는 자신이 보낸 패킷에 대해서 일일이 확인 메시지를 기다리는데, 만약 전송 과정에서 이상이 생겨 수신지로부터 확인 메시지가 없다면 패킷을 재전송하게 되어 있다. -
TCP는 프로세스 간의 네트워크 자원에 대한 다중화를 실현한다.
일반적으로 하나의 호스트에는 하나의 NIC가 있고 하나의 IP가 부여된다. 호스트로 들어오거나 나가는 패킷은 모두 동일한 IP로 설정되어 나가게 되는데, IP만으로는 여러 프로세스 간의 데이터가 구별되지 않는다. TCP는 포트번호를 이용해서 각각의 프로세스에게서 송수신되는 패킷을 구별해서 나누어준다. -
TCP는 전이중 서비스다. 데이터를 동시에 양방향으로 송수신할 수 있다.
- TCP 연결 성립 과정
TCP는 신뢰성을 확보할 때 3way 핸드셰이크라는 작업을 한다. 이 과정 이후 신뢰성이 구축되고 데이터 전송을 시작한다.
1. SYN(연결 요청 플래그) : 클라이언트는 서버에 클라이언트의 ISN(새로운 TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀀스 번호)을 담아 SYN을 보낸다.
2. SYN + ACK(응답 플래그) : 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보내며, 승인번호로 클라이언트의 ISN + 1을 보낸다.
3. ACK : 클라이언트는 서버의 ISN + 1한 값인 승인번호를 담아 ACK를 서버에 보낸다.
- TCP 연결 해제 과정
TCP 연결을 해제할 때는 4way 핸드셰이크 과정이 발생한다.
1. 먼저 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트를 보낸다. 클라이언트는 FIN_WAIT_1 상태로 들어가고 서버의 응답을 기다린다.
2. 서버는 클라이언트로 ACK라는 승인 세그먼트를 보내고 CLOSE_WAIT 상태에 들어간다. 클라이언트가 세그먼트를 받으면 FIN_WAIT_2 상태에 들어간다.
3. 서버는 ACK를 보내고 일정 시간 후에 클라이언트에 FIN이라는 세그먼트를 보낸다.
3. 클라이언트는 TIME_WAIT 상태가 되고 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 된다. 이후 클라이언트는 어느 정도의 시간을 대기한 후 연결이 닫히고 클라이언트와 서버의 모든 자원의 연결이 해제된다.
왜 TIME_WAIT 상태 이후 일정 시간 뒤 연결을 닫을까?
1. 지연 패킷이 발생할 경우 대비
패킷이 뒤늦게 도달하고 이를 처리하지 못한다면 데이터 무결성 문제 발생
2. 두 장치가 연결이 닫혔는지 확인
만약 LAST_ACK 상태에서 닫히게 되면 다시 새로운 연결을 하려고 할 때 장치는 줄곧 LAST_ACK로 되어 있기 때문에 접속 오류 발생
* TIME_WAIT : 소켓이 바로 소멸되지 않고 일정 시간 유지되는 상태
* 데이터 무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는 것
- TCP 흐름제어 : 송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법
수신측이 송신측보다 데이터 처리 속도가 빠르면 문제없지만, 송신측의 속도가 빠를 경우 문제가 생긴다. 수신측에서 제한된 저장 용량을 초과한 이후에 도착하는 데이터는 손실 될 수 있으며, 만약 손실 된다면 불필요한 응답과 데이터 전송이 빈번히 발생한다. 이러한 위험을 줄이기 위해 송신 측의 데이터 전송량을 수신측에 따라 조절해야 한다. 이를 위해 "흐름제어"를 하는 것이다.
흐름제어의 기본 개념은, 수신측이 송신측에게 자신의 상태를 계속하여 알리는 것이다. 즉, 데이터를 더 받을 준비가 되어있다는 피드백이 이루어졌을 때 송신측에서 패킷을 이어서 보내도록 하는 것이다. 수신 측은 자신이 처리할 수 있는 데이터의 양을 의미하는 윈도우 크기(Window Size)를 자신의 응답 헤더에 담아서 송신 측에게 전해주게 되고, 송신 측은 상대방에게 데이터를 보낼 때 이 윈도우 크기와 네트워크의 현재 상황을 참고해서 알맞은 양의 데이터를 보냄으로써 전체적인 데이터의 흐름을 제어하게 된다.
패킷이 전송되는 과정을 간략히 살펴보자.
1. Application Layer : 송신측 Application Layer가 소켓에 데이터를 입력
2. Transport Layer : 데이터를 세그먼트로 감싸고 Network Layer 에 전달
3. 수신측 노드로 세그먼트가 전송됨. 동시에 송신측의 Send Buffer 와 수신측의 Receive Buffer 각각에 데이터가 저장됨
4. 수신측 Application Layer 에서 준비가 되면, Receive Buffer 에 있는 데이터를 읽기 시작함
5. 이때, 수신자 쪽에서는 Receive Buffer 의 용량을 넘치게 하지 않도록 조절해야 함.수신자 쪽에서는 자신의 수신 버퍼의 남은 용량을 상대방(sender)에게 알려주는데, 이를 "수신 윈도우(Receive Window)"라고 함.
6. 송신자(sender)는 수신자의 수신 윈도우를 확인하여 수신자의 Receive Buffer 용량을 초과하지 않도록 데이터를 전송 -> 이를 통해 데이터 전송 중에 수신 버퍼가 넘치는 현상을 방지하면서, 안정적인 데이터 전송을 보장함
흐름제어 기법 종류에는 두 가지가 있다.
1. Stop-And-Wait
Stop and Wait 방식은 상대방에게 데이터를 보낸 후 잘 받았다는 응답이 올 때까지 기다리는 방식이다. 이때 데이터를 받는 수신 측이 어떤 대답을 해주냐에 따라 사용할 수 있는 오류 제어 방법이 나눠지기도 한다.
Stop and Wait로 흐름 제어를 할 경우의 때 '단순히 상대방이 응답을 하면 데이터를 보낸다'라는 마인드로 보내기 때문에, 구현 자체도 간단하고 개발자가 어플리케이션의 작동 원리를 파악하기도 쉬운 편이지만, 내가 직접 데이터를 보내봐야 수신 측에서 이 데이터를 처리할 수 있는지 없는지 파악할 수 있기 때문에 비효율적인 방법이라고 할 수 있다.
따라서 Stop and Wait 방식을 사용하여 흐름 제어를 할 경우에는, 이런 비효율성을 커버하기 위해 이런 단순한 구현이 아닌 여러가지 오류 제어 방식을 함께 도입해서 사용한다.
2. Sliding Window (Go-Back-n ARQ)
슬라이딩 윈도우는 수신 측이 한 번에 처리할 수 있는 데이터를 정해놓고 그때 그때 수신 측의 데이터 처리 상황을 송신 측에 알려주어 데이터의 흐름을 제어하는 방식이다. 송신 측이 수신 측이 처리할 수 있는 데이터의 양을 알고 있기 때문에 굳이 수신 측이 처리 가능이라는 대답을 일일히 해주지 않아도 데이터를 보내기 전에 데이터의 처리에 대한 예측이 가능하다.
전송은 되었으나, ACK 을 받지 못한 Byte 크기를 파악하기 위해 사용
LastByteSent - LastByteAcked ≤ ReceiveWindowAvertised
→ 마지막에 보낸 바이트 수 - 마지막에 확인된 바이트 수 ≤ 버퍼 남은 공간
(현재 전송 대기 중인 패킷 수 ≤ 슬라이딩 윈도우 크기)
윈도우 크기만큼 패킷을 모두 전송하고, 그 패킷들의 전달이 확인되는대로 해당 윈도우를 옆으로 슬라이딩하면서 그 다음 패킷을 전송하는 방식으로 동작한다. 윈도우 안에 들어있는 프레임은 수신 측의 응답이 없이도 연속으로 보낼 수 있다.
송신 측의 윈도우 크기는 맨 처음 TCP의 연결을 생성하는 과정인 3 Way Handshake 때 결정된다. 이때 송신 측과 수신 측은 자신의 현재 버퍼 크기를 서로에게 알려주게 되고, 송신 측은 수신 측이 보내준 버퍼 크기를 참고해 자신의 윈도우 크기를 정하게 된다.
ACK : 수신지에서 TCP 세그먼트를 받고 제대로 왔다면 발신지에게 제대로 왔다는 것을 알려주기 위한 번호
만약 수신지 노드 A가 발신지 노드 B로부터 순서 번호 1500이고 데이터의 길이가 100인 TCP 세그먼트를 받았다면 확인 응답 번호로는 1600을 보내준다. 여기서 1600은 발신지 노드 B가 다음에 보낼 순서 번호다.
localhost.initiator > localhost.receiver: Flags [S], seq 1487079775, win 65535
localhost.receiver > localhost.initiator: Flags [S.], seq 3886578796, ack 1487079776, win 65535
localhost.initiator > localhost.receiver: Flags [.], ack 1, win 6379
tcpdump를 통해 3 Way Handshake를 관찰해보면 처음의 SYN과 SYN+ACK 패킷에는 각자 자신의 버퍼를 알려준 후, 마지막 ACK 패킷 때 송신 측이 자신이 정한 윈도우 사이즈를 상대방에게 통보하는 것을 볼 수 있다. 송신 측과 수신 측 모두 자신의 버퍼 크기라 65535라고 이야기했지만 최종적으로 송신 측이 정한 자신의 윈도우 크기는 6379이다.
왜 이렇게 확 줄어든 것일까? 송신 측의 윈도우 크기는 수신 측의 버퍼 크기로만 정하는 것이 아니라 다른 여러가지 요인들을 함께 고려해서 결정되는데, 이때 사용하는 대표적인 값이 바로 패킷의 왕복 시간을 의미하는 RTT(Round Trip Time)이다.
송신 측은 자신이 처음 SYN 패킷을 보내고, 다시 수신 측이 SYN+ACK 패킷으로 응답하는 시간을 재고, 이 값을 통해 현재 네트워크 상황을 유추한다. 이때 이 값이 너무 크다면 왕복 시간이 느리다는 것이므로 네트워크 상태가 좋지 않다고 생각하고 윈도우 크기를 조금 더 줄이게 되는 것이다. 이때 윈도우 크기는 고정이 아니라 통신을 하는 과정에서도 동적으로 변경된다. 윈도우의 크기, 즉 연속적으로 보낼 데이터의 양을 변경해가면서 유연하게 흐름 제어를 할 수 있는 것이다.
https://m.blog.naver.com/gaegurijump/110188012832
- TCP 오류제어
TCP는 기본적으로 ARQ(Automatic Repeat Request), 재전송 기반 오류 제어를 사용한다. 말 그대로 통신 중에 뭔가 오류가 발생하면 송신 측이 수신 측에게 해당 데이터를 다시 전송해야 한다는 말이다. 하지만 이 '재전송'이라는 작업 자체가 했던 일을 또 해야하는 비효율적인 작업이기 때문에, 이 재전송 과정을 최대한 줄일 수 있는 여러가지 방법을 사용하게 된다.
TCP를 사용하는 송수신 측이 오류를 파악하는 방법은 크게 두 가지로 나누어진다.
1. 수신 측이 송신 측에게 명시적으로 NACK(부정응답)을 보내는 방법
2. 송신 측에게 ACK(긍정응답)가 오지 않거나, 중복된 ACK가 계속 해서 오면 오류가 발생했다고 추정하는 방법
NACK를 사용하게되면 수신 측이 상대방에게 ACK를 보낼 지 NACK를 보낼 지 선택해야 하는 로직이 추가적으로 필요하기 때문에, 일반적으로는 ACK만을 사용해서 오류를 추정하는 방법이 주로 사용되고 있다.
타임아웃은 말 그대로 송신 측이 보낸 데이터가 중간에 유실되어, 수신 측이 아예 데이터를 받지 못해 ACK를 보내지도 않았거나, 수신 측은 제대로 응답했지만 해당 ACK 패킷이 유실되는 경우에 발생하게 된다. 두 경우 모두 송신 측은 데이터를 전송했는데 수신 측이 응답하지 않고 일정 시간이 경과한 경우이다.
송신 측이 중복된 ACK를 받는 경우 오류라고 판별하는 방법은 다음과 같다.
패킷 기반 전송을 하는 TCP의 특성 상 각 패킷의 도착 순서가 무조건 보장되는 것이 아니기 때문에 위 예시처럼 중복된 ACK를 한 두번 받았다고 해서 바로 에러라고 판별하지는 않고, 보통 3회 정도 받았을 때 에러라고 판별하게 된다.
이제 오류 제어 방법을 살펴보자.
1. Stop and Wait
Stop and Wait는 흐름 제어 때 한번 살펴보았던, 한번 데이터를 보내면 제대로 받았다는 응답이 올 때까지 대기하고 있다가 다음 데이터를 보내는 방식이다. 애초에 제대로 받았다는 응답이 오지 않는다면 제대로 받을 때까지 계속 데이터를 재전송하는 방법이니까 흐름 제어, 오류 제어 모두 가능하다.
그러나 위에서 살펴본 슬라이딩 윈도우를 사용하여 흐름 제어를 하는 경우에는 윈도우 안에 있는 데이터를 연속적으로 보내야 하기 때문에, 오류 제어에 Stop and Wait를 사용해버리면 슬라이딩 윈도우를 쓰는 이점을 잃어버린다. 그런 이유로 일반적으로는 이런 단순한 방법보다 조금 더 효율적이고 똑똑한 ARQ를 사용하게 된다.
2. Go Back N
Go Bank N 방법은 데이터를 연속적으로 보내다가 그 중 어느 데이터부터 오류가 발생했는지를 검사하는 방식이다.
Go Back N 방식을 사용하면 데이터를 연속적으로 보낸 후 한 개의 ACK나 NACK만을 사용하여 수신 측의 처리 상황을 파악할 수 있으므로, 연속적으로 데이터를 보낼 수 있는 흐름 제어 방식인 슬라이딩 윈도우와 잘 맞는다.
수신 측이 4번 데이터에서 에러가 발생했음을 감지하면, 4번 데이터 이후 자신이 받았던 모든 데이터를 폐기하고 송신 측에게 NACK를 보내게 된다. 송신 측은 수신 측으로부터 NACK를 받고나면 오류가 발생한 4번 데이터와 그 이후 전송했던 모든 데이터를 다시 전송해줘야 한다. 이때 송신 측은 비록 5번까지 전송했지만 오류가 발생한 4번 데이터로 되돌아가서 다시 전송해야하므로 Go Back N이라고 부르는 것이다.
3. Selective Repeat
Selective Repeat은 말 그대로 선택적인 재전송을 의미한다. Go Back N 방법도 Stop and Wait에 비하면 많이 효율적인 방법이지만, 에러가 발생하면 그 이후에 정상적으로 전송되었던 데이터까지 모두 폐기 처분되어 다시 전송해야한다는 비효율이 아직 존재한다. 그래서 나온 방식이 에러난 데이터만 재전송하는 방식이다.
얼핏 보면 이 방식이 굉장히 효율적이고 좋은 것 같지만 Stop and Wait와 Go Back N 방식과 다르게, 이 방식을 사용하는 수신 측의 버퍼에 쌓인 데이터가 연속적이지 않다는 단점이 존재한다.
위 예시만 봐도 수신 측의 버퍼에는 0, 1, 2, 3, 4, 5가 순차적으로 들어있는 것이 아니라, 중간에 폐기 처분된 4를 제외한 0, 1, 2, 3, 5만 버퍼에 존재할 것이기 때문이다. 이때 송신 측이 4를 재전송하게 되면 수신 측은 이 데이터를 버퍼 중간 어딘가에 끼워넣어서 데이터를 정렬해야한다. 이때 같은 버퍼 안에서 데이터를 정렬할 수는 없으니, 별도의 버퍼가 필요하게 된다. 결국 재전송이라는 과정이 빠진 대신 재정렬이라는 과정이 추가된 것인데, 이 둘 중에 재전송이 좀 더 이득인 상황에서는 Go Bank N 방식을, 재정렬이 좀 더 이득인 상황에서는 Selective Repeat 방식을 사용하면된다.
- TCP 혼잡제어
송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 한 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리할 수 없게 된다. 이런 경우 호스트들은 또 다시 재전송을 하게되고 상황이 복잡해져 오버플로우나 데이터 손실을 발생시키게 된다. 따라서 이러한 네트워크의 혼잡을 피하기 위해 송신측에서 보내는 데이터의 전송속도를 강제로 줄이게 되고, 이러한 작업을 혼잡제어라고 한다.
혼잡의 다른 의미로는 네트워크 내에 패킷의 수가 과도하게 증가하는 현상이 있다. 이러한 혼잡 현상을 방지하거나 제거하는 기능을 혼잡제어라고 한다.
흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해, 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송 문제를 다루게 된다.
흐름제어 방법을 살펴보자.
1. AIMD(Additive Increase / Multiplicative Decrease)
처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 window 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 증가시켜가며 전송하는 방법이다. 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷을 보내는 속도를 절반으로 줄인다.
공평한 방식으로, 여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만, 시간이 흐르면 평형상태로 수렴하게 되는 특징이 있다. 하지만 이의 문제점은 초기에 네트워크의 높은 대역폭을 사용하지 못하여 오랜 시간이 걸리게 되고, 네트워크가 혼잡해지는 상황을 미리 감지하지 못한다는 것이다. 즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이다.
2. Slow Start (느린 시작)
AIMD 방식이 네트워크의 수용량 주변에서는 효율적으로 작동하지만, 처음에 전송 속도를 올리는데 시간이 오래 걸리는 단점이 존재했다.
Slow Start 방식은 AIMD와 마찬가지로 패킷을 하나씩 보내면서 시작하고, 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 window size를 1씩 늘려준다. 즉, 한 주기가 지나면 window size가 2배로 된다.
전송속도는 AIMD에 반해 지수 함수 꼴로 증가한다. 대신에 혼잡 현상이 발생하면 window size를 1로 떨어뜨리게 된다. 처음에는 네트워크의 수용량을 예상할 수 있는 정보가 없지만, 한번 혼잡 현상이 발생하고 나면 네트워크의 수용량을 어느 정도 예상할 수 있다. 그러므로 혼잡 현상이 발생하였던 window size의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고, 그 이후부터는 완만하게 1씩 증가시킨다.
3. Fast Retransmit (빠른 재전송)
빠른 재전송은 TCP의 혼잡 조절에 추가된 정책이다. 패킷을 받는 쪽에서 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보내게 된다. 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보내게 되므로, 중간에 하나가 손실되게 되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 된다. 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송 해줄 수 있다.
중복된 순번의 패킷을 3개 받으면 재전송을 하게 된다. 약간 혼잡한 상황이 일어난 것이므로, 혼잡을 감지하고 window size를 줄이게 된다.
4. Fast Recovery (빠른 회복)
혼잡한 상태가 되면 window size를 1로 줄이지 않고 반으로 줄이고 선형증가시키는 방법이다. 이 정책까지 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 AIMD 방식으로 동작하게 된다.
https://evan-moon.github.io/2019/11/22/tcp-flow-control-error-control/
# UDP
- User Datagram Protocol의 약자로 데이터를 데이터그램 단위로 처리하는 프로토콜이다.
- 비연결형, 신뢰성 없는 전송 프로토콜이다.
- 데이터그램 단위로 쪼개면서 전송을 해야하기 때문에 전송 계층이다.
- Transport layer에서 사용하는 프로토콜이다.
- UDP의 장점
UDP의 장점은 데이터의 신속성이다. 데이터의 처리가 TCP보다 빠르다. 주로 실시간 방송과 온라인 게임에서 사용된다. 네트워크 환경이 안 좋을때 끊기는 현상을 생각하면 된다.
* DNS
DNS는 숫자로 표현되는 IP주소에 대해서 각각 도메인명을 할당해주고, 사용자가 도메인명으로 다른 호스트에 접속하고자 할 때 IP주소를 알려주는 서비스다.
도메인명으로 접속하려면 도메인명에서 IP주소로 변환하는 과정을 거쳐야 한다. 인터넷에서의 유일한 주소는 IP주소이지 도메인명이 아니기 때문이다. 이때 호스트가 접속하고자 하는 도메인명을 질의하는 곳이 바로 DNS 서버다.
DNS에서 UDP를 사용하는 이유를 살펴보기 전에 간단하게 UDP Header의 구조를 보자.
* Source port : 시작 포트
* Destination port : 도착지 포트
* Length : 길이
* _Checksum_ : 오류 검출 (중복 검사의 한 형태로, 오류 정정을 통해 공간이나 시간 속에서 송신된 자료의 무결성을 보호하는 단순한 방법)
이렇게 간단하므로, TCP 보다 용량이 가볍고 송신 속도가 빠르게 작동된다. 그러나 확인 응답을 못하므로, TCP보다 신뢰도가 떨어진다.
UDP는 트랜스포트 계층 프로토콜이 할 수 있는 최소 기능으로 동작한다. 즉, 다중화/역다중화 기능과 간단한 오류 검사 기능을 제외하면 IP에 아무것도 추가하지 않는다.
* 다중화: 출발지 호스트에서 소켓으로부터 데이터를 모아 헤더 정보를 더해 캡슐화 후, 캡슐화된 세그먼트들을 네트워크 계층으로 전달하는 작업
* 역다중화 : 수신된 세그먼트(다중화로 생성된 패킷)를 올바른 소켓에 전달하는 것
https://uroa.tistory.com/22
DNS는 Application layer protocol이다. 모든 Application layer protocol은 TCP, UDP 중 하나의 Transport layer protocol을 사용해야 한다(TCP는 reliable, UDP는 not reliable). DNS는 신뢰성보다 속도가 중요하다. 도메인 명을 ip로 변경함으로 항상 많은 클라이언트를 수용하는 DNS 서버에게는 연결상태를 유지 하지 않아 정보 기록을 최소화 하는 UDP가 알맞다.
TCP를 사용하게 되면, 데이터를 송신할 때까지 세션 확립을 위한 처리를 하고, 송신한 데이터가 수신되었는지 점검하는 과정이 필요하므로, Protocol overhead가 UDP에 비해서 크다.
DNS는 UDP를 53번 port에서 사용한다.
DNS에서 TCP를 사용하는 경우도 있다. Zone transfer 를 사용해야 하는 경우에는 TCP를 사용해야 한다(Zone Transfer : DNS 서버 간의 요청을 주고 받을 때 사용하는 transfer). 데이터가 512 bytes를 넘거나, 응답을 못받은 경우에도 TCP를 사용한다.
3) 인터넷 계층
장치로부터 받은 네트워크 패킷을 IP 주소로 지정된 목적지로 전송하기 위해 사용되는 계층이다. IP, ARP, ICMP 등이 있으며 패킷을 수신해야 할 상대의 주소를 지정하여 데이터를 전달한다. 상대방이 제대로 받았는지 보장하지 않는 비연결형적인 특징이 있다.
4) 링크 계층(=네트워크 접근 계층)
전선, 광섬유, 무선 등으로 실질적으로 데이터를 전달하며 장치 간에 신호를 주고받는 규칙을 정하는 계층이다.
유선 LAN
유선 LAN을 이루는 이더넷은 IEEE802.3이라는 프로토콜을 따르며 전이중화 통신을 쓴다.
* 전이중화 통신 : 양쪽 장치가 동시에 송수신할 수 있는 방식. 송신로와 수신로로 나눠서 데이터를 주고 받음. 현대의 고속 이더넷이 사용하는 방식.
예전에는 유선 LAN에 CSMA/CD 방식을 썼음(설명 밑에 있음)
- 유선 LAN을 이루는 케이블
1. 트위스트 페어 케이블 : 하나의 케이블처럼 보이지만 실제로는 여덟 개의 구리선을 두 개씩 꼬아서 묶은 케이블 (ex. LAN 케이블)
2. 광섬유 케이블 : 레이저를 통해 통신. 장거리 및 고속 통신 가능. 한 번 들어간 빛이 내부에서 계속적으로 반사하며 전진하여 반대편 끝까지 가는 원리 이용(코어 : 빛의 굴절률이 높은 부분, 클래딩 : 낮은 부분)
무선 LAN
수신과 송신에 같은 채널을 사용하기 때문에 반이중화 통신을 사용한다.
* 반이중화 통신 : 양쪽 장치는 서로 통신할 수 있지만, 동시 통신은 불가능. 단방향 통신. 충돌 방지 시스템 필요
* CSMA/CD : 반이중화 통신 중 하나. 데이터를 보낸 이후 충돌이 발생한다면 일정 시간 이후 재전송하는 방식. 한 경로를 기반으로 데이터를 보내기 때문에 데이터를 보낼 때 충돌에 대해 대비함.
1. 데이터 송신 전 무선 매체 살핌
2. 캐리어 감지 : 회선이 비어 있는지 판단
3. IFS(Inter FrameSpace) : 랜덤 값을 기반으로 정해진 시간만큼 기다리며, 만약 무선 매체가 사용 중이면 점차 그 간격을 늘려가며 기다림
4. 이후에 데이터 송신
- 무선 LAN을 이루는 주파수
무선 신호 전달 방식을 이용하여 두 대 이상의 장치를 연결하는 기술이다. 주로 5GHz 대역을 사용한다. 5GHz 대역은 사용할 수 있는 채널 수도 많고 동시에 사용할 수 있기 때문에 상대적으로 깨끗한 전파 환경을 구축할 수 있다.
* 와이파이 : 전자기기들이 무선 LAN 신호에 연결할 수 있게 하는 기술.
이를 사용하려면 무선 접속 장치(AP)가 있어야 한다. 흔히 이를 공유기라고 한다. 유선 LAN에 흐르는 신호를 무선 LAN 신호로 바꿔주어 신호가 닿는 범위 내에서 무선 인터넷을 사용할 수 있게 한다.
* BSS : 기본 서비스 집합을 의미. 단순 공유기를 통해 네트워크에 접속하는 것이 아닌 동일 BSS 내에 있는 AP들과 장치들이 서로 통신이 가능한 구조. 근거리 무선 통신을 제공. 하나의 AP만을 기반으로 구축이 되어 있어 사용자가 한 곳에서 다른 곳으로 자유롭게 이동하며 네트워크에 접속하는 것은 불가능
* ESS : 하나 이상 연결된 BSS 그룹. 장거리 무선 통신을 제공. 가용성. 이동성. 사용자는 한 장소에서 다른 장소로 이동하며 중단 없이 네트워크에 계속 연결 가능
이더넷 프레임
데이터 링크 계층은 이더넷 프레임을 통해 전달받은 데이터의 에러를 검출하고 캡슐화하며 다음과 같은 구조를 가진다.
Preamble : 이더넷 프레임이 시작임을 알린다.
SFD(Start Frame Delimiter) : 다음 바이트부터 MAC 주소 필드가 시작됨을 알린다.
DMAC, SMAC : 수신, 송신 MAC 주소를 말한다.
EtherType : 데이터 계층 위의 계층인 IP 프로토콜을 정의한다(ex . IPv4, IPv6)
Payload : 전달받은 데이터
CRC : 에러 확인 비트
* MAC 주소 : 컴퓨터나 노트북 등 각 장치에는 네트워크에 연결하기 위한 장비를 구별하기 위한 식별번호
계층 간 데이터 송수신 과정
애플리케이션 계층에서 전송 계층으로 요청 값들이 캡슐화 과정을 거쳐 전달되고, 다시 링크 계층을 통해 해당 서버와 통신하고 해당 서버의 링크 계층으로부터 애플리케이션까지 비캡슐화 과정을 거쳐 데이터가 전송된다.
- 캡슐화
캡슐화 과정은 상위 계층의 헤더와 데이터를 하위 계층의 데이터 부분에 포함시키고, 해당 계층의 헤더를 삽입하는 과정을 말한다. 애플리케이션 계층의 데이터가 전송 계층으로 전달되면서 TCP 헤더가 붙어 '세그먼트' 또는 '데이터그램화'된다. 그 후 인터넷 계층으로 가면서 IP 헤더가 붙어 '패킷화'가 되고, 링크 계층으로 전달되면서 프레임 헤더와 프레임 트레일러가 붙어 '프레임화'가 된다.
- 비캡슐화
비캡슐화 과정은 하위 계층에서 상위 계층으로 가며 각 계층의 헤더 부분을 제거하는 과정을 말한다. 캡슐화된 데이터가 패킷화를 거치고 세그먼트, 데이터 그램화를 거쳐 '메세지화'가 된다. 최종적으로 사용자에게 애플리케이션의 PDU인 메시지로 전달된다.
* PDU
PDU란 네트워크의 어떠한 계층에서 계층으로 데이터가 전달될 때의 덩어리 단위이다. 제어 관련 정보들이 포함된 헤더, 데이터를 의미하는 페이로드로 구성되어 있으며 각 계층마다 명칭이 다르다.
애플리케이션 계층 : 메세지
전송 계층 : 세그먼트(TCP), 데이터그램(UDP)
인터넷 계층 : 패킷
링크 계층 : 프레임(데이터 링크계층), 비트(물리 계층)
'CS > 면접을 위한 CS 전공노트' 카테고리의 다른 글
[네트워크] 브라우저에 URL을 입력하고 일어나는 일 (0) | 2023.04.20 |
---|---|
[네트워크] HTTP/HTTPS (0) | 2023.04.19 |
[네트워크] 네트워크 기기/IP 주소 (0) | 2023.04.18 |
[디자인패턴 & 프로그래밍 패러다임] 프록시/이터레이터/노출모듈/MVC/MVP/MVVM & 선언형/함수형/객체지향/절차지향 (0) | 2023.04.08 |
[디자인 패턴] 싱글톤/팩토리/전략/옵저버 (0) | 2023.04.07 |