2017-12-26 8 views
0

사람들이 이진 데이터를 어떻게 표현하는지, 네트워크를 통해 어떻게 전송되는지 혼란 스럽습니다. 나는 위키피디아의 예를 통해 설명 할 것이다. 여기에 표시 < - https://imgur.com/a/POELH -> 그래서 나는 이진 데이터를 기본 64로 인코딩하고 TWFU 텍스트를 보내고 있습니다. 그래서 나는 T, W, F 그리고 마침내 U를 보내고 있습니다. 그러나 T, 숯을 보냅니다. 나는 항상 들었던 것처럼 그것을 보내기 위해 1 바이트가 필요할 것이다. 네트워크를 통해 전송 된 한 문자는 1 바이트입니다.인코딩 된 데이터가 네트워크를 통해 전송되는 방법은 무엇입니까?

이제 24 바이트를 인코딩하면 4 문자 이상을 보낼 것이지만 4 문자를 보내려면 문자만큼 바이트가 필요하다고 생각하게 되었습니까?

위의 예에서 네트워크 "Man" (unencoded) (Requiring 3 bytes normally)"TWFu" (encoded) (requiring 4 bytes normally)을 보낼 때 동일한 비트 시퀀스가 ​​네트워크를 통해 동일하게 전송됩니다. 마지막으로 데이터를 보내기 위해 소켓을 사용 했으므로 문자열 입력을 요청하고 텍스트 + 인코딩 입력을 요청하지 않습니다.

답변

1

Base64는 순전히 7 비트 채널에서 임의의 8 비트 데이터를 인코딩하는 방법입니다. 인터넷이 8 비트 바이트의 원칙을 기반으로하는 것처럼 텍스트 모드의 경우 달리 지정되지 않는 한 7 비트 ASCII로 추정됩니다.

인코딩 된 Base64 데이터를 전송하는 경우 문자 그대로 TWFU을 보내야합니다. 많은 텍스트 기반 프로토콜은 Base64를 편리함에서 사용합니다. 그것은 확립 된 표준이며 대부분의 응용 프로그램에서 충분히 효율적입니다.

인터넷의 기초 인 IP는 8 비트 바이트 기반 프로토콜입니다. 바이너리 데이터를 전송할 때는 8 비트를 모두 사용할 수 있지만, 텍스트 모드 프로토콜로 작업하는 경우 (많은 경우) 프로토콜에 7 가지 방법이없는 한 일반적으로 7 비트 ASCII를 사용합니다. 어떤 문자 세트 또는 인코딩을 사용하고 있는지 지정합니다.

"이진"전송으로 전환 할 수있는 옵션이있는 경우 Base64에 대한 필요성을 충족시킬 수 있습니다. 7 비트 ASCII 프로토콜로 작업한다면 Base64가 필요할 것입니다.

임의의 2 진 문자를 인코딩하는 유일한 방법은 아닙니다. 이메일에는 quoted printable이 사용되며 URL은 URI encoding입니다. 이스케이프가 예외적 인 경우보다 효율적이지만 각 문자에 필요한 경우 훨씬 효율적이지 않습니다.

+0

그래서 네가 4 바이트가 필요한 "TWFu"네트워크를 통해 전송한다고 말하고 있습니다. 일단 네트워크를 통해, 사람이 그것을 해독합니까? 난 그냥 더 많은 문자가 필요한 뭔가를 인코딩 지점을보고 실패했습니다. 예를 들어 네트워크를 통해 "Man"을 전송할 수 있으며 3 바이트가 필요합니다. 그러나 그들은 4 바이트가 필요한 "TWFu"로 인코딩합니다. 이 점을 보지 못했습니다. 네트워크를 통해 전송되면 사람이 그것을 디코딩하고 많은 바이트가 무시됩니다. 'https : // en.wikipedia.org/wiki/Base64' 첫 번째 예제를 여기서 읽어보십시오. –

+0

일반적으로 7 비트 ASCII는 인코딩하지 않지만 레거시 시스템과 호환되어야하는 바이너리 컨텐트는 사용자가 필요합니다. 한 예로, 전자 메일은 첨부 파일에 Base64를 사용하여 전자 메일 자체가 단순한 일반 텍스트이며 쉽게 처리되도록합니다. 디코딩은 수신자의 책임이며 대개 해당 프로토콜 또는 표준에 따라 결정됩니다. 바이트는 "무시"되지 않으며 어디에서이 노출이 발생하는지 잘 모르겠습니다. – tadman

+0

여기서 중요한 점은 많은 텍스트 모드 프로토콜은 일반적으로 ASCII 표준에 따라 7 비트 인코딩이 필요하다는 것입니다. 최신 텍스트 기반 인코딩 (예 : JSON)은 8 비트 인 UTF-8을 사용하지만 UTF-8에서는 멀티 바이트 문자에 대해 가장 높은 비트가 중요한 의미를 지니기 때문에 임의의 이진 데이터를 포함 할 수 없습니다. Base64는 6 비트 인코딩이며 ASCII 표준에서 일반 텍스트 문자의 * 대부분 *을 활용하는 데 꽤 능숙합니다. 0에서 31까지는 줄 바꿈과 같은 특별한 의미를 갖는 "제어 문자"로 예약되어 있다는 것을 기억하십시오. – tadman

0

7 비트 텍스트 만 처리하는 경우 base-64 인코딩이 필요하지 않습니다. 당신이 순수하게 7 비트 채널을 통해

Man 
Boy 

을 보내야하는 경우

그러나 줄 바꿈이 같은 문자 보낼 수 없습니다. 대신 기본 64로 인코딩하여 전송합니다.

인코딩 된 줄 바꿈이 있지만 호환되지 않는 문자는 사용하지 않습니다. 물론, 수신자는 인코딩 된 텍스트를 사용하고 있다는 것을 알아야합니다. 사용 된 프로토콜에 의해 암시되거나 명시 적으로 표시됩니다.

+0

당신과 다른 포스터가 7 비트 채널에서이 7 비트를 얻는 곳이 혼란 스럽습니다. 확실하지 않은 내용 –

+0

많은 응용 프로그램 프로토콜은 7 비트 만 사용할 수 있으며 전체 8 비트 데이터를 송수신 할 수 없습니다. SMTP 또는 IMAP. 타이프라이터로 이진 JPEG 이미지를 보내는 것을 상상해보십시오. – Zac67

2

시놉시스 : "어떻게"는 합의입니다. "Raw"는 일반적입니다.


송신자와 수신자가 동의하는 방식으로 데이터가 전송됩니다. 표준 계약 인 많은 프로토콜이 있습니다. 프로토콜은 여러 수준에서 작동합니다. 두 가지 레벨을 다루는 매우 일반적인 쌍은 TCP/IP입니다. 많은 고급 프로토콜이 그 위에 계층화되어 있습니다.(상위 프로토콜은 특정 기본 프로토콜에 의존하거나 그렇지 않을 수도 있습니다.) HTTP와 SMTP는 매우 공통적 인 상위 레벨 프로토콜이며 종종 SSL을 사이에 끼워 넣습니다.

가끔은 레이어 또는 스택을 구현하는 소프트웨어를 스택이라고합니다. 참조 (또는 개념적) OSI Model도 있습니다. 그것에 관한 요점은 다른 레이어에 대해 이야기 할 수있는 언어를 제공한다는 것입니다. 정의 된 계층은 특정 스택에 매핑되거나 매핑되지 않을 수 있습니다.

귀하의 질문에 너무 답답합니다. HTTP를 사용하면 "원시"이진 데이터가 항상 전송됩니다. HTTP 헤더는 본문의 길이를 8 진수로 제공 할 수 있으며 본문은 머리글 뒤에옵니다. 보낸 사람과받는 사람 사이의 계약의 일부로 머리글은 MIME 헤더를 사용하여 이진 데이터에 대한 메타 데이터를 제공 할 수 있습니다. 예를 들면 : 당신의 Gravatar에 enter image description here을 포함 헤더로 전송됩니다

수신자가 송신자가 871 바이트의 PNG 그래픽이라고 주장 알고에 대한 충분
content-length:871 
content-type:image/png 

. 수신자는 헤더를 읽은 다음 본문에 대해 871 바이트를 읽고 다음에 오는 것이 다른 HTTP 헤더라고 가정합니다.

일부 프로토콜은 미리 선언 된 크기를 가진 본문 이외의 동기화 방법을 사용합니다. 그들은 완전히 텍스트 기반 일 수 있으며 특정 문자 만 허용하는 구문을 사용합니다. 이진 데이터를 텍스트로 나타 내기 위해 Base64과 같은 것을 사용하는 중첩 계약을 통해 확장 할 수 있습니다.

일부 계층은 Base64와 같은 상위 계층에 의한 확장이 큰 관심사가 아닌 충분한 밀도의 데이터 압축을 제공 할 수 있습니다. 예를 들어, HTTP Compression을 참조하십시오.

HTTP의 작동 방식을 보려면 F12를 누르고 네트워크 탭으로 이동하십시오. 컴퓨터에서 다른 프로토콜을 활성화하려면 WireShark, Microsoft Message Analyzer, Fiddler 또는 그와 비슷한 값을 사용하십시오.

관련 문제