Study/TIL(Today I Learned)

24.02.27 퀴즈, 간단한 정리, 백준, KEYWORD

에린_1 2024. 2. 28. 10:17
728x90

퀴즈

1. HTTP GET 요청과 POST 요청의 가장 큰 차이점은 무엇이며, 이것이 요청 헤더나 데이터 전송에 어떤 영향을 미치는가?

  • GET요청은 데이터를 URL의 일부로 전송하지만 POST 요청은 데이터를 요청 본문에 포함한다.
    1. GET 요청은 URL 길이에는 브라우저나 서버에 따라 제한이 있다. 이로인해 전송할 수 있는 데이터의 양이 제한된다.
    2. POST 요청은 ‘Content-Length’와 ‘Content-Type’ 같은 추가적인 헤더 정보를 필요로 한다.

2. HTTP 응답 코드 404의 의미는 무엇인가? 그리고 서버가 요청을 처리할 수 없을 때 반환하는 HTTP 상태 코드는 무엇인가?

  • HTTP 응답 코드 404는 ‘Not Found’를 의미합니다. 이 코드는 서버가 요청된 리소스를 찾을 수 없을 때 반환된다.
  • 서버가 요청을 처리할 수 없을 때 반환하는 HTTP 상태 코드는 500이다. 이 코드는 ‘Internal Server Error’를 나타낸다.

3. 파일 디스크립터(File Descriptor)란 무엇인지 간단히 설명하고 UNIX/Linux 시스템에서 표준입출력/에러의 파일 디스크립터 번호를 써라

  • 파일 디스크립터는 운영 체제에서 파일이나 다른 입출력 리소스에 대한 접근을 추상화하는데 사용되는 정수이다. 파일 디스크립터를 통해 운영 체제는 파일, 파이프, 소켓 등 다양한 입출력 리소스를 일관된 방식으로 관리 할 수 있다.
  • 예를 들어, 파일을 열면 운영 체제는 해당 파일을 가리키는 파일 디스크립터를 프로그램에 제공한다.
  • UNIX/Linux 시스템에서 표준입력의 파일 디스크립터 번호는 0, 표준출력은 1, 그리고 표준에러 는 2다.

4. TCP에서의 ‘3-way handshake’ 절차를 설명하라

  • TCP의 ‘3-way handshake’는 연결 설정 과정에서 사용되는 절차이다.
    1. 클라이언트가 서버에 SYN(Synchronize) 패킷을 보내 연결 요청을 한다.
    2. 서버는 SYN-ACK(Synchronize-Acknowledge) 패킷으로 응답하여 연결 요청을 받았음을 알리고, 자신도 연결 준비가 되었음을 나타낸다.
    3. 클라이언트는 ACK(Acknowledge) 패킷을 서버에 보내 연결을 확정한다.

5. TCP와 UDP에서 패킷 손실 시 대처 방법에는 어떤 차이가 있는가?

  • TCP는 패킷 손실이 발생하면 자동으로 재전송을 시도한다. 수신자는 받은 패킷에 대해 확인 응답(ACK)을 보내고, 송신자는 ACK를 받지 못한 패킷을 재전송한다.
  • 반면, UDP는 패킷 손실에 대해 자체적으로 대처하지 않는다. UDP는 확인 응답이나 재전송 기능이 없어, 패킷 손실이 발생하면 이를 어플리케이션 레벨에서 처리해야 한다.

간단한 정리

12. 동시성프로그래밍

  • 논리 제어흐름이 시간적으로 중첩되면 동시적이다. 이와 같은 현상을 동시성이라고 하며, 컴퓨터의 여러 수준에서 나타난다.
  • 응용 수준 동시성을 사용하는 응용 프로그램들을 동시성 프로그램이라고 한다.
  • 동시성 프로그램을 만들기 위해 세 가지 접근 방법을 제공한다.
    1. 프로세스 : 각 놀리적 흐름은 커널이 스케줄하고 관리하는 프로세스이다. 프로세스가 별도의 가상 주소공간을 가지기 때문에, 서로 통신하기를 원하는 흐름들은 모종의 명시적 프로세스 통신(IPC) 메커니즘을 사용해야 한다.
    2. I/O 다중화 : 응용들은 명시적으로 자신의 논리 흐름을 한 개의 프로세스 컨텍스트 내에서 스케줄한다. 논리적 흐름들은 파일 식별자에 도착하는 데이터에 인해 메인프로그램이 명시적으로 하나의 상태에서 다른 상태로 전환하는 상태머신으로 공유 할 수 있다. 프로그램이 한 개의 프로세스이므로 모든 흐름들은 동일한 주소 공간을 공유한다.
    3. 쓰레드 : 쓰레드는 한 개의 프로세스 컨텍스트에서 돌아가는 논리흐름으로 커널에 의해 스케줄된다. 쓰레드는 다른 두 개의 방식의 하이브리드로 생각할 수 있으며, 프로세스 흐름처럼 커널에 의해서 스케줄되며 I/O 다중화 흐름처럼 동일한 가상주소를 공유한다.

12.1 프로세스를 사용한 동시성 프로그래밍

  • 동시성 프로그램을 만드는 가장 간단한 방법. 이것은 fork, exec, waitpid 같은 친숙한 함수를 사용한다.
  • 동시성 서버를 구현하는 자연스러운 방법은 부모에게서 클라이언트 연결 요청을 수락하는 것이며 그후에 새로운 자식 프로세스를 생성해서 각각의 새로운 클라이언트를 서비스 한다.
  • 부모와 자식의 연결식별자들은 각각 동일한 파일 엔트리를 가리키기 때문에 부모가 이 연결 식별자의 자신만의 사본을 닫는 것은 매우 중요하다. 그렇지 않으면 연결식별자에 대한 파일 테이블 엔트리는 절대로 반환되지 않으며, 그 결과로 메모리 누수가 결국 가용메모리를 소모하게 되고 시스템을 죽게 만든다.

12.1.2 프로세스의 장단점

  • 파일 테이블은 공유되고 사용자 주소공간은 공유되지 않는다. 프로세스들이 분리된 주소공간을 가지는 것은 장점이자 단점이다. 한 개의 프로세스가 다른 프로세스의 가상메모리에 쓰는 것은 불가능하며, 이로 인해서 많은 혼란스러운 오류들을 제거 할 수 있다.
  • 반면에, 별도의 주소 공간은 프로세스가 상태 정보를 공유하는 것을 어렵게 한다. 정보를 공유하기 위해 명시적인 IPC메커니즘을 사용해야 한다. 또 다른 단점은 프로세스 제어와 IPC의 오버헤드가 커서 더 느려지는 경향이 있다.

12.2 I/O 다중화를 이용한 동시성 프로그래밍

  • Select 함수를 사용해서 커널에게 이 프로세스를 정지할 것을 요구해서 한 개 이상의 I/O 이벤트가 발생한 후에만 응용에게 제어를 돌려주도록 하는 것이다.
  • 하나의 프로세스가 여러 개의 I/O 작업을 동시에 처리 할 수 있도록 돕는 기술이다. 이는 프로세스가 I/O 작업을 완료 될 때까지 기다리는 대신, 다른 작업을 수행할 수 있게한다.
  • 주요목적
    • 시스템 효율 향상
    • 응답시간 단축
    • 스케일링 가능성 확대
  • I/O 다중화의 작동방식
    1. I/O 작업요청 : 프로세스는 I/O 작업을 요청하고, I/O 다중화 시스템에 등록한다.
    2. 버퍼 할당 : 각 I/O 작업을 위한 버퍼를 할당한다.
    3. I/O 작업 수행 : 운영체제에 의해 비동기적으로 처리된다.
    4. I/O 작업 완료 : 작업이 완료되면 I/O 다중화 시스템이 프로세스에게 알린다.
    5. 데이터 처리 : 프로세스는 버퍼에서 데이터를 읽거나 쓰거나 처리한다.

12.2.1 I/O 다중화에 기초한 동시성 이벤트 기반서버

  • I/O 다중화는 동시성 이벤트 기반 프로그램을 위한 기초과정으로 사용될 수 있으며, 이 경우 흐름들은 특정 이벤트의 결과로 진행한다. 일반적인 아이디어는 논리흐름을 상태머신으로 모델링 하는 것이다. 비공식적으로, 상태머신은 상태, 입력 이벤트, 상태와 입력이벤트를 상태로 매핑하는 전환의 집합이다. 각각의 전환을 한 개(입력상태, 입력이벤트)의 쌍으로 한 개의 출력 상태로 매핑한다. 자체-루프는 동일한 입력과 출력 상태 사이의 전환이다. 상태머신들은 대개 방향성 그래프로 그리며, 이 경우 노드들은 상태를, 화살표는 전환을, 호의 이름은 입력 이벤트를 나타낸다. 상태머신은 초기 상태에서 실행을 시작한다. 각각의 입력 이벤트는 현재 상태에서 다음 상태로의 전환을 유발한다.

12.2.2 I/O 다중화의 장단점

  • 장점
    • 이벤트 기반 설계로 프로그래머가 프로세스 기반 설계보다 자신의 프로그램을 잘 제어할 수 있다.
    • 단일 프로세스의 컨텍스트에서 돌아가며, 모든 논리흐름은 프로세스의 전체 주소공간에 접근 할 수 있다. 이것은 흐름들 간에 데이터의 공유를 쉽게 해준다. 이것과 관련되어 GDB 같은 디버깅 도구를 이용해서 순차 프로그래밍에서 하는 것처럼 디버그 할 수 있다.
    • 대개 프로세스 기반 설계보다 효율적이다. 새로운 흐름을 스케줄하기 위해 문맥전환을 하지 않는다.
  • 단점
    • 코딩복잡도. echo 프로세스 기반 서버보다 세 배 더 많은 코드.
    • 동시성의 크기가 감소하면 할 수록 복잡성은 증가한다.
    • 멀티코어 프로세서를 완전히 활용할 수 있다.

12.3 쓰레드를 이용한 동시성 프로그래밍

  • 쓰레드는 커널에 의해 자동으로 스케줄 된다. 각 쓰레드는 고유의 정수 쓰레드 ID, 스택, 스택포인터, 프로그램 카운터, 범용레지스터, 조건 코드를 포함하는 자신만의 쓰레드 컨텍스트를 가진다. 한 개의 프로세스에서 돌고 있는 모든 쓰레드는 이 프로세스의 전체 가상주소를 공유한다.

12.3.1 쓰레드 실행 모델

  • 각 프로세스는 메인쓰레드 라는 한 개의 쓰레드로 시작해서 어떤 시점에서 피어 쓰레드를 생성하고, 이때부터 두 쓰레드가 동시에 돌아간다. 제어는 문맥전환을 통해 피어쓰레드로 전달된다.
  • 쓰레드 컨텍스트가 프로세스 컨텍스트 보다 훨씬 더 작기 떄문에 쓰레드 문맥 전환은 프로세스보다 더 빠르다. 프로세스와는 달리 부모-자식 계층구조에서 구성되지 않았다. 하나의 프로세스에 연계된 쓰레드들은 피어들의 풀을 구성하고 쓰레드는 이들과는 독립적으로 다른 쓰레드에 의해 생성되었다. 메인쓰레드는 항상 프로세스에서 돌아가는 첫 번째 쓰레드라는 의미에서만 다른 쓰레드와 구별된다. 피어 풀에 관한 주요 영향은 쓰레드가 자신의 피어 모두를 죽일 수 있거나 자신들의 피어들이 종료하는 것을 기다릴 수 있다. 각 피어는 동일한 고유 데이터를 읽고 쓸 수 있다.

12.3.2 Posix 쓰레드

  • Posix 쓰레드 pthreads 는 C프로그램에서 쓰레드를 조작하는 표준 인터페이스다.

12.3.6 쓰레드 분리하기

  • 쓰레드는 연결 가능하거나 분리되어 있다. 연결 가능한 쓰레드는 다른 쓰레드에 의해 청소되고 종료될 수 있다. 자신의 메모리 자원들은 다른 쓰레드에 의해 청소될 대까지는 반환되지 않는다. 반대로, 분리된 쓰레드는 다른 쓰레드에 의해 종료될 수 없다. 자신의 메모리 자원은 이 쓰레드가 종료할 때 시스템에 의해 자동으로 반환된다.

12.4 쓰레드 프로그램에서 공유변수

  • C프로그램의 변수들
    • 전역변수 : 함수밖에서 선언된 모든 변수. 런타임에 가상메모리 읽기/쓰기 영역은 쓰레드에 의해 참조 될 수 있는 각각의 전역 변수의 정확히 한 개의 인스턴스를 포함한다.
    • 지역 자동변수 : 함수 내에서 static 특성없이 선언된다. 런타임에 각 쓰레드 스택은 자신만의 지역 자동변수의 인스턴스를 가진다.
    • 지역 정적변수 : 함수안에서 static 특성으로 선언된 변수, 전역변수처럼 가상메모리의 읽기/쓰기 영역은 프로그램에서 선언된 각 지역 정적변수의 한 개의 인스턴스를 포함한다.

12.5 세마포어로 쓰레드 동기화 하기

  • 공유변수들은 편리하지만 심각한 동기화 오류를 가져올 수 있다.
  • 운영체제가 여러분의 쓰레드를 위해서 정확한 순서를 선택하게 될지 여부를 예측할 수 있는 방법은 없다.
  • 정확성과 부정확성을 갖는 인스트럭션 순서를 진행그래프라고 하는 도구를 이용해서 명확히 할 수 있다.

12.5.1 진행그래프

  • 진행그래프 Progress Graph는 n개의 동시성 쓰레드를 n차원 직교좌표 공간을 지나는 궤적으로 모델링 한다. 각각의 축 k는 쓰레드 k에 진행에 대응된다. 그래프 원점은 초기상태를 나타내며, 쓰레드 모두가 아직 한 개의 인스트럭션도 완료하지 못한 상태.
  • 진행그래프는 인스트럭션의 실행을 하나의 상태에서 다른 상태로의 전환으로 모델링한다. 전환은 한 점에서 인접하는 한 점으로의 화살표로 표시한다.
  • 쓰레드 i에 대해서 공유변수의 내용을 조작하는 인스트럭션은 크리티컬 섹션을 형성하며, 다른 쓰레드의 크리티컬 내의 인스트럭션 실행하는 동안에는 상호 배타적으로 공유변수를 접근하도록 보장하기를 원한다. 이 현상을 상호 배제 이라고 한다.
  • 진행그래프에서, 두 개의 크리티컬 섹션의 교착점은 위험영역이라는 상태공간의 구역을 정의한다. 위험 영역은 둘레에 있는 상태들과 접하지만 포함하지는 않는다. 위험궤적을 둘러싼 궤적은 안전 궤적이라고 한다.
  • 모든 안전궤적은 공유 카운터를 정확히 갱신한다.

12.5.2 세마포어

  • 세마포어는 여러 프로세스나 스레드가 공유차원에 동시에 접근하는 것을 제어하는 방법이다.
  • 세마포어는 값과 연산 두 가지로 구성되어 있는데, 값은 공유 자원에 접근할 수 있는 프로세스나 쓰레드 수를 의미하고 연산은 그 수를 증가시키거나 감소시키는 기능을 한다. 이를 통해 여러 프로세스나 스레드가 동시에 같은 자원에 접근하는 것을 방지하며 이를 통해 데이터의 일관성을 유지하고 경쟁상태를 피할 수 있다.
  • P와 V의 정의는 돌고있는 프로그램이 적절히 초기화된 세마포어가 음수 값을 가지는 상태로 절대 들어갈 수 없도록 보장해준다. 이 특성을 세마포어 불변성이라고 하며, 동시성 프로그램의 궤적을 제어하기 위한 강력한 도구를 제공한다.

12.5.3 상호배제를 위해 세마포어 이용하기

12.5.4 세마포어를 이용해 공유자원 스케줄링 하기

  • 생산자 - 소비자 문제
  • 읽기 - 쓰기 문제

12.7 다른 동시성 이슈

12.7.1 쓰레드 안정성

  • 쓰레드로 프로그램 할 때 쓰레드 안정성이라고 부르는 특성을 가지는 함수를 작성하도록 유의해야 한다.
  • 쓰레드 - 위험한 함수 클래스
    • 클래스 1 : 공유변수를 보호하지 않는 함수들
    • 클래스 2 : 다중 호출에 대해서 상태를 유지하는 함수
    • 클래스 3 : 정적변수를 가리키는 포인터를 리턴하는 함수
    • 클래스 4 : 쓰레드 - 위험 함수를 호출하는 함수

12.7.2 재진입성

  • 재진입 가능한 함수라고 하는 쓰레드 - 안전 함수의 중요한 클래스가 있으며 이들은 다수의 쓰레드에 의해 호출될 때 공유 데이터는 전혀 참조하지 않는 특성으로 규정된다.
  • 재진입 가능 함수들은 대개 재진입 불가능 쓰레드 - 안전 함수들보다 더 효율적인데, 그 이유는 이들이 동기화 연산을 필요로 하지 않기 때문이다.

경쟁상태

  • 경쟁은 멀티 쓰레딩 환경에서 두 개 이상의 쓰레드가 동시에 공유데이터에 접근하려고 할 대 발생하는 상황이다.

교착상태

  • 다수의 쓰레드가 절대로 참이 될 수 없는 조건을 기다리면서 정지되어있는 경우

백준

1620 나는야 포켓몬 마스터 이다솜

#include <bits/stdc++.h>
using namespace std;
string name[100001];

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n, m;
	cin >> n >> m;
	map<string, int> poket;

	for (int i = 0; i < n; ++i)
	{
		string tmp;
		cin >> tmp;
		poket.insert({ tmp,i });
		name[i] = tmp;
	}
	for (int i = 0; i < m; ++i)
	{
		string tmp;
		cin >> tmp;
		if (65 > tmp[0])
			cout << name[stoi(tmp)-1] << '\\n';
		else
			cout << poket.find(tmp)->second + 1 << '\\n';
	}
	return 0;
}
  • map 함수를 쓰면 간단하게 처리할 수 있다.

KEYWORD

네트워크 계층

1계층 : 물리계층(physical layer)

  • 비트단위 전송
  • 데이터를 전달만 할뿐 전송하려는 데이터가 무엇인지, 어떤 에러가 있는지 신경쓰지 않는다.

2계층 : 데이터 링크 계층(data link layer)

  • 프레임 단위 전송
  • MAC 주소를 가지고 통신
  • 오류를 찾아주고 재전송을 하는 기능이 있다.
  • 포인트 투 포인트간 신뢰성있는 전송을 보장하기 위한 계층으로 CRC기반 오류 제어와 흐름제어가 필요하다.
  • 이더넷

3계층 : 네트워크 계층(Network layer)

  • 라우팅 기능, 포워딩 기능을 수행한다.
  • 패킷, 데이터그램 단위 전송
  • 데이터를 연결하는 다른 네트워크를 통해 전달함으로 인터넷이 가능하게 만드는 계층이다.
  • IP주소를 부여하고 경로를 설정한다.
    • 데이터그램의 전달을 담당하는 프로토콜
    • 주요특징
      • Best-effort
      • connectionless
      • unreliable
      • big-endian 방식 바이트 전달
  • IP

4계층 : 전송 계층(Transport Layer)

  • 통신을 활성화하기 위한 계층. 포트를 열어서 응용프로그램들이 전송을 할 수 있게 한다.
  • 전송 계층이 패킷들의 전송이 유효한지 확인하고 전송 실패한 패킷들을 다시 전송한다는 것을 뜻한다.
  • 패킷 생성 및 전송
    • IP의 비신뢰적인 최선형 서비스에다가 신뢰적인 연결지향성 서비스를 제공한다.
    • 신뢰적인 전송을 보장함으로, 어플리케이션 구현이 한층 쉬워진다.
    • 특징
      • reliable
      • connection - oriented
    UDP
    • 신뢰성이 낮은 프로토콜로써 완전성을 보증하지 않으나, 가상회선을 굳이 확립할 필요가 없고 유연하며, 효율적 응용의 데이터 전송에 사용된다.
    • 특징
      • best-effort
      • unreliable
      • connectionless
      • 실시간 응용 및 멀티캐스팅 가능
      • 헤더가 단순하다
  • TCP

5계층 - 세션 계층(Session layer)

  • 데이터가 통신하기 위한 논리적인 연결
  • 세션 설정, 유지, 종료, 전송 중단시 복구 기능이 있다.
  • TCP/IP 세션을 만들고 없애는 책임을 진다.
  • 통신하는 사용자들을 동시화하고 오류복구 명령들을 일괄적으로 다룬다.

6계층 - 표현 계층(Presentation layer)

  • 데이터 표현이 상이한 응용 프로세스의 독립성을 제공하고 암호화 한다.
  • MIME 인코딩이나 암호화등의 동작이 이뤄진다.
  • 사용자의 명령어를 완성 및 결과 표현. 포장/압축/암호화

7계층 - 응용 계층(Application layer)

  • 최종 목적지로서 HTTP,FTP,TELNET 같은 프로토콜이 있다.
  • 응용 계층은 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다.
    • 웹 상에서 웹서버 및 웹브라우저 상호 간의 데이터 전송을 위한 응용 계층 프로토콜
  • HTTP

클라이언트 서버 모델

  • 클라이언트 - 서버 모델에서 클라이언트는 서비스를 요청하는 역할을 하고, 서버는 이러한 요청에 대해 서비스를 제공하는 역할을 한다. 서버는 네트워크상에서 서비스를 제공하기 위해서 항상 실행되어 대기 상태를 유지한다.

소켓

소켓 API

  • system call API 중 하나이다
  • 운영체제가 응용프로그램에게 제공하는 통신용 인터페이스다.

소켓

  • 응용프로그램에 설치하는 데이터의 송수신구이다.
  • 응용프로그램이 응용프로그램의 일만 처리할 수 있도록 하기 위해서 사용된다.
  • 컴퓨터가 데이터들을 송수신할 때, 꼬이지 않게 해준다.

파일 식별자(File Descriptor)

  • 운영체제가 파일, 소켓, 파이프등의 입출력 리소스를 관리하기 위해 생성하는 비음수의 값이다.
  • 프로세스가 각 리소스에 접근하려고 할 대 리소스에 대한 인덱스로 사용된다. 덕분에 프로세스는 리소스의 실제 물리적 위치를 몰라도, 인덱스를 통해 접근이 가능하다.

스트림 소켓(Stream Socket) / 데이터그램 소켓(Datagram Socket)

스트림 소켓(Stream Socket)

  • TCP를 사용하는 연결 지향적 소켓이다.
  • 두 통신 당사자 간에 신뢰성 있는 양방향 통신 채널을 제공한다.
  • 데이터는 바이트 스트림으로 전송되며, 데이터의 경계가 없다.(연속적이다.)

데이터그램 소켓(Datagram Socket)

  • UDP를 사용하는 비연결형 소켓이다.
  • 데이터를 독립된 메시지 형태의 패킷으로 전송한다.
  • 각 패킷은 다른 패킷과 독립적이며, 네트워크를 통해 개별적으로 전송된다.
  • 신뢰성보다는 빠른 데이터 전송을 중시한다.

CGI(Common Gateway Interface)

  • 서버와 애플리케이션 간에 데이터를 주고 받는 방식 도는 컨벤션
  • 웹 서버와 외부 프로그램 간의 인터페이스를 위한 표준이다.
  • CGI를 사용하면, 웹 서버는 동적 컨텐츠를 생성하거나 클라이언트의 요청에 따라 데이터를 처리할 수 있는 외부 프로그램을 호출할 수 있다.
  • 다양한 프로그래밍 언어로 작성될 수 있으며, 웹 서버에 의해서 실행된다.
  • 사용자의 요청에 따라 CGI 스크립트가 실행되고, 스크립트는 실행 결과를 웹 서버로 다시 보내며, 서버는 그 결과를 사용자에게 전달한다.
  • 장점
    • 기능별로 프로그램을 분리하여 관리하기 때문에, 코드의 모듈성이 증가하고 유지보수가 용이하다.
  • 단점
    • 각 기능마다 별도의 프로그램을 유지해야 하므로, 전체 시스템의 복잡성이 증가하고 리소스 사용이 증가한다.

MIME(Multipurpose Internet Mail Extensions)

  • 인터넷에서 전자메일을 통해 텍스트, 이미지, 오디오, 비디오 등 다양한 종류의 데이터를 교환할 수 있게 하는 프로토콜의 확장
  • MIME은 인터넷 상에서 멀티미디어 데이터를 교환하기 위해 설계된 표준이다.
  • 다양한 데이터 타입이 Content-Type 헤더를 통해 명시되며, 어떤 종류의 데이터가 포함되어 있는지를 알려준다.
  • MIME 표준은 데이터 유형과 인코딩 방식을 명시하여, 이진 데이터나 다양한 문자 인코딩이 포함된 문서를 안전하게 전송할 수 있도록 한다.
  • 인코딩 방식 : MIME은 이진 데이터를 ASCII 텍스트로 인코딩하는 방식을 사용한다.. 이를 통해, 이메일 시스템이나 다른 텍스트 기반 시스템에서도 이진 파일을 안전하게 전송할 수 있다. 가장 널리 사용되는 인코딩 방식은 Base64입니다.
  • MIME이 등장하기 이전에는 주로 ASCII방식만을 사용해서 통신이 이루어졌다.
    • ASCII텍스트만을 사용하여, 이진데이터나 다른 언어의 문자(한글, 일본어 등)은 직접적으로 처리할 수 없었다.
    • 이진 데이터를 이메일에 포함시키기 위해 UUEncode나 BinHex와 같은 방식이 이진 데이터를 ASCII로 변환하기 위해 사용되었지만, 이들은 특정 시스템이나 상황에 한정된 해결책이었다.
      • UUEncode의 한계
        • 기능제한 : 주로 파일을 ASCII 텍스트로 변환하여 이메일을 통해 전송하는 데 사용되었다. 이진 데이터를 텍스트 형태로 인코딩하는 기본적인 방법을 제공하지만, MIME와 같은 더 복잡한 멀티미디어 콘텐츠의 처리와 인코딩을 지원하지 않는다.
        • 효율성 : 데이터를 인코딩하고 디코딩하는 과정에서 추가적인 데이터 크기 증가. MIME에서 사용되는 Base64 인코딩도 데이터 크기를 증가시키지만, MIME은 데이터 타입과 인코딩 방식을 명시할 수 있는 헤더를 사용하여 다양한 형태의 데이터를 더 효율적으로 처리한다.
  • 현재는 ASCII텍스트 이외의 파일형식(예: HTML, 이미지, 오디오, 비디오 파일 등)을 지원
  • 하나의 메시지 안에 텍스트와 파일을 함께 보낼 수 있게 해준다. 예를 들어, 이메일에 텍스트와 함께 이미지나 문서 파일을 첨부하여 보낼 수 있다.
  • 다양한 문자 인코딩을 지원하여 전 세계의 여러 언어로 된 텍스트를 교환할 수 있게 한다.

MIME의 구성요소

  1. 헤더 : MIME 버전, 콘텐츠 유형(Content-Type), 콘텐츠 전송 인코딩(Content-Transfer-Encoding) 등의 정보를 포함한다.
    • MIME-Version ->MIME-Version: 1.0 해당 메세지가 MIME 형식임을 나타낸다.
    • Content-Type ->Content-Type: text/plain 메시지의 타입과 서브타입을 나타낸다.이외에 image/jpeg, application/pdf등이 있다.
    • Content-Transfer-Encoding -> 메시지가 전송되는 동안의 인코딩 방식을 정의한다. 예를 들어, 7bit, 8bit, base64, quoted-printable 등
  2. 본문 : 실제 전송하려는 데이터. 텍스트나 이진 데이터 등이 될 수 있으며, 멀티파트 메시지인 경우 여러 부분으로 나뉘어 있을 수 있다.

MIME의 활용 예

  1. 이메일: 이메일 클라이언트와 서버는 MIME을 사용하여 비ASCII 텍스트, 첨부 파일, HTML 이메일 등을 처리.
  2. 웹: 웹 서버와 브라우저는 MIME 타입을 사용하여 문서, 스타일시트, 스크립트, 이미지 등 웹 콘텐츠의 형식을 식별. 예를 들어, 웹 서버는 HTML 문서를 text/html MIME 타입으로, PNG 이미지를 image/png로 전송.
  3. API 통신: RESTful API나 SOAP과 같은 웹 서비스에서도 MIME 타입이 중요한 역할을 한다. 클라이언트와 서버 간에 JSON(application/json), XML(application/xml) 등의 데이터 포맷을 교환할 때 MIME 타입을 사용하여 콘텐츠의 형식을 명시한다.

MIME의 등장으로 인한 변화

  • 멀티미디어 지원: MIME은 이메일과 인터넷 통신에서 다양한 형태의 데이터를 지원함으로써 멀티미디어 커뮤니케이션의 길을 열었다.
  • 글로벌 커뮤니케이션: 다양한 언어와 문자 인코딩을 지원함으로써, 전 세계적인 커뮤니케이션이 가능해졌다.
  • 화와 호환성: MIME은 널리 퍼진 표준이 되었고, 대부분의 이메일 클라이언트와 웹 브라우저에서 지원된다.

OSI(Open Systems Interconnection) 모델에서 표현 계층(제 6계층)은 데이터의 인코딩, 디코딩, 변환 작업을 담당하여 MIME과 같은 데이터 포맷이 처리된다.

MIME 변환과정

  1. 데이터 준비데이터 유형 결정 : 전송하려는 데이터의 유형(텍스트, 이미지, 오디오, 비디오 등)을 결정합니다. MIME 표준은 다양한 유형의 데이터를 지원하며, 각 데이터 유형에 대해 Content-Type 헤더를 통해 명시한다.
  2. 인코딩 과정이진 데이터 인코딩 : MIME은 이진 데이터를 안전하게 전송하기 위해 텍스트 기반 인코딩 방식을 사용한다. 가장 널리 사용되는 방식은 Base64 인코딩이다. 이 과정에서 이진 데이터는 ASCII 문자열로 변환되며, 이는 이메일 시스템이나 다른 텍스트 기반 프로토콜에서도 안전하게 전송될 수 있다.
  3. 전송MIME 헤더 추가 : 인코딩된 데이터와 함께, Content-Type과 Content-Transfer-Encoding과 같은 MIME 헤더가 메시지에 추가된다. 이 헤더들은 수신자가 데이터를 올바르게 해석할 수 있도록 돕는다.
  4. 수신MIME 헤더 분석 : 수신 측에서는 먼저 MIME 헤더를 분석하여 데이터의 유형과 인코딩 방식을 파악한다. 이 정보는 데이터를 올바르게 디코딩하고 처리하는 데 필요하다.
  5. 디코딩 과정데이터 디코딩 : 인코딩된 데이터는 원래의 이진 형태로 디코딩된다. 예를 들어, Base64로 인코딩된 데이터는 다시 이진 데이터로 변환되어, 수신자가 해당 데이터를 원래의 형태(이미지, 동영상 등)로 확인할 수 있다.

결론

MIME의 도입은 디지털 커뮤니케이션의 획기적인 발전을 의미한다. 이는 단순한 텍스트 메시지에서 벗어나, 풍부한 멀티미디어 경험을 이메일과 웹 상에서 제공할 수 있게 만들었다.

728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.02.29 KEYWORD  (1) 2024.03.01
24.02.28 운영체제, 백준  (1) 2024.02.29
24.02.26 간단한 정리, 백준  (2) 2024.02.27
24.02.25 운영체제, 백준, KEYWORD  (2) 2024.02.25
24.02.24 간단한 정리, 백준, KEYWORD  (1) 2024.02.25