전체 글
[OS] I/O처리 방식: Non-Blocking
논 블로킹 모드로 프로그래밍을 한다는 것은 먼저 블로킹의 의미 부터 명확히 해야한다. 일반적으로 블로킹은 "운영체제(커널)에게 어떤 요청을 하고 결과를 운영체제가 알려줄 때까지 기다린다" 를 의미한다. 예를 들어 데이터베이스 서버에 요청하고 그 결과를 데이터베이스 서버가 알려줄 때까지 기다린다도 같은 얘기이다.블로킹: 프로그램이 운영체제(커널) 또는 외부 서비스(DB, 네트워크 등) 에 요청을 보내고, 해당 요청의 결과가 반환될 때까지 대기(멈춤) 하는 상태. connect() 를 호출하면 보통은 운영체제가 원격 서버와 연결하고 그 결과를 알려준다. 연결하는데 지연가능한 시간은 1초 이내, 수초 또는 수분이 될 수 있다. 하나의 연결을 위해 이를 수행하는 프로세스는 장시간을 대기(블로킹)할 수 있으며 그..
[Crypto] NEAT, NES
NEAT (National Encryption AlgoriThm) 알고리즘 분석 요약NEAT은 대한민국 국정원이 설계한 비공개 국가 표준 암호 알고리즘으로, 1997년에 국가기관용 표준 암호로 제정되었다. 이 알고리즘은 정부 기관에서 내부 데이터와 문서 암호화를 위해 사용되며, security through obscurity(암호화 원리를 숨김으로써 보안을 유지하는 방식)를 부분적으로 의존하고 있다. 128비트 블록 암호화 알고리즘으로, IDEA(International Data Encryption Algorithm)와 구조적으로 유사하다. 특징암호 구조Feistel 네트워크 기반: 암호화와 복호화 과정이 거의 동일12.5 라운드: 12번의 full-round 연산과 1번의 half-round 연산으로 ..
Base64
Base64, Base32, Base16은 바이너리 데이터를 텍스트 데이터로 인코딩하는 표준 방식으로, 바이너리 데이터를 안전하게 전송하거나 저장하기 위해 사용된다. 이는 주로 이메일, URL, 또는 파일 저장 시 인코딩에 사용된다. Base64 는 64종류의 문자를 이용하기 때문에 인코딩 후에는 1문자당 6bit(64=2^6) 의 정보를 가진다.Base64: 64개의 문자 (A–Z, a–z, 0–9, +, /) → 6bitBase32: 32개의 문자 (A–Z, 2–7) → 5bit숫자 2–7을 사용하는 이유는 혼동을 피하기 위해 (0과 O, 1과 I 구분)Base16: 16개의 문자 (0–9, A–F) → 4bit특성Base64Base32Base16사용 문자 수64 (A–Z, a–z, 0–9, +, /..
Google authenticator를 사용한 2FA 인증 #1 이론
system에 로그인 하기 위한 사용자 이름 과 비밀 번호가 있어야한다. 여기에 보안계층을 추가하기 위해 one time password generator 를 사용할 수 있다. Google Authenticator 에서 사용하는 암호기법을 살펴보면 TOTP, HOTP 두가지를 사용한다. HOTP(Hmac based One Time Password)HMAC 기반 일회용 비밀번호(또는 HOTP) 는 Shared Secret 와 Event Counter를 사용하는 이벤트 기반 OTP 알고리즘 이다. HOTP의 핵심은 비밀 키이다. seed라고도 하는 비밀키는 counter 값과 달리 고정된 값이고, 토큰을 초기화하는 동안 otp 토큰과 서버가 한번만 교환하는 값이다. 그런 다음 비밀키는 클라이언트와 서버에 안..
[C/interrupt] IRQs: Hardware, Software
장치들은 처리할 작업이 준비되었음을 컴퓨터 시스템의 다른 부분에 알리기 위해 여러가지 방법을 사용한다.하드웨어와 소프트웨어 간의 비동기 통신을 효율적으로 처리하기 위해 IRQ가 필요하다. IRQ는 하드웨어 장치에서 이벤트가 발생했을 때 CPU가 이를 처리하도록 알려주는 역할을 한다. IRQ 정보를 확인하기 위해 다음 명령어를 사용할 수 있다.$ cat /proc/interrupts또는$ mpstat -A handle_IPI는 ARM 아키텍처에서 다중 프로세서 간 인터럽트(IPI)를 처리하는 함수이다.void handle_IPI(int ipinr, struct pt_regs *regs){ switch (ipinr) { case IPI_TIMER: tick_receive..
NAPI
대부분의 device(nic..) 들은 두가지 방법으로 커널과 통신한다.polling커널 측에서 수행커널이 장치의 레지스터를 읽어 주기적으로 패킷의 수신 여부를 확인장치가 새로운 패킷을 가지고 있을 경우 이를 처리CPU 리소스 절약이 가능하지만, 불필요한 리소스 소모 가능interruptdevice 측에서 수행장치가 새로운 패킷을 받을 경우 하드웨어 IRQ를 사용하여 커널에게 알려 주는 방식커널이 IRQ를 받게 되면, 해당 IRQ를 처리 하기 위해서 미리 등록된 디바이스 드라이버의 인터럽트의 수신 패킷 처리 루틴(Interrupt Handler)을 호출인터럽트 핸들러(top half handler)는 수신한 패킷을 복사하고 큐에 넣은 후softirq를 사용하여 커널이 해당 패킷을 처리 할 수 있도록 한다..
커널 네트워크 스택 #2 데이터 링크 계층
네트워크 데이터가 애플리케이션에서 하드웨어까지, 또는 반대로 하드웨어에서 애플리케이션까지 흐르는 과정은 다음과 같다.프로토콜 레이어에서 인터페이스 dev_queue_xmit()는 데이터 전송에 사용되고 netif_rx()는 데이터 수신에 사용된다. 물리계층을 거친 후 device 에서 읽은 프레임이 프로토콜 스택으로 어떻게 들어오고 반대로 프로토콜 스택에서 캡슐화된 프레임이 어떻게 나가는지 분석해보자. (커널 4.14.76 버전 기반) 드라이버 관점에서는 먼저 인터럽트를 다뤄야한다. Interrupts인터럽트 처리는 데이터 링크 계층의 전송을 분석하는 출발점이다. 예를 들어 drivers/net/ethernet/intel/i40e는 Intel의 i40e 드라이버로 Intel의 40Gbps 네트워크 어댑..
네트워크 디바이스 드라이버별 벤더 NIC
리눅스에서 사용하는 네트워크 드라이버는 다음과 같다. 각각 특정 제조사의 네트워크 어댑터(NIC)를 지원하며 주로 이더넷 장치를 다룬다. 사용중인 NIC에 적합한 드라이버를 확인하는 명령어lspci -nn | grep -i ethernet드라이버가 지원하는 디바이스 목록을 확인하는 명령어 modinfo Intel NIC 드라이버(1) e1000e지원 NIC:Intel PRO/1000 기가비트 이더넷 어댑터Intel 82574, 82579 계열 NIC주요 용도:데스크톱 및 일반 서버에서 사용.(2) igb지원 NIC:Intel Ethernet Server Adapter i350, i210Intel 82576, 82580 계열 NIC주요 용도:서버급 기가비트 이더넷 환경.(3) ixgbe지원 NIC:In..
커널 네트워크 스택 #1 NIC 드라이버에서 패킷 수신
패킷 수신NIC는 네트워크로부터 데이터를 수신NIC는 DMA를 사용하여 네트워크 데이터를 RAM에 씀NIC는 CPU 개입 없이 DMA를 사용해 패킷 데이터를 RAM의 링 버퍼로 전송링 버퍼는 네트워크 스택에서 패킷 처리를 위해 사용되는 메모리 영역NIC가 IRQ를 발생probe 함수에서 request_irq 핸들러 등록됨NIC 드라이버의 등록된 IRQ 핸들러가 실행IRQ는 NIC에서 지워져서 새로운 패킷이 도착할 때 IRQ를 생성할 수 있음NAPI(NIC Polling) SoftIRQ 폴 루프가 napi_schedule 호출로 시작 됨패킷 처리net_rx_action 함수(ksoftirqd 커널 스레드에서 호출됨)는 현재 CPU의 poll_list에 추가된 NAPI poll 구조체를 처리하기 시작한다.p..