3

텍스트 네트워크 프로토콜과 관련된 문법을 표현하는 일반적인 방법은 ABNF를 사용하는 것입니다.일반 언어가 아닌 텍스트 프로토콜?

ABNF는 EBNF 관련 메타 구문과 마찬가지로 문맥 자유 문법을 설명 할 수 있습니다.

이러한 문맥없는 문법은 비정규 언어를 나타낼 수 있습니다. 맞습니까?

네트워크 스택을 구현하는 일반적인 방법은 상태 시스템을 개발하는 것입니다. 정규 언어가 아닌 텍스트 네트워크 프로토콜이 있습니까?

답변

3

"기존의"줄 기반 텍스트 프로토콜을 사용한다고 가정합니다. 예를 들어, XML을 사용하는 모든 프로토콜은 XML이 일반 언어가 아니기 때문에 일반 형식이 아닙니다 (실제로 개별 문자의 수준을 보면 XML은 컨텍스트가없는 것입니다). 이 경우, 나는 비정상적인 프로토콜에 대해 정말로 생각할 수 없다. 언어 구문에서 비정규 화하는 가장 일반적인 방법은 파서가 계산할 수 있도록 요구하는 것이고, 메시지를 파싱 할 수있는 능력을 요구하는 프로토콜은 단지 복잡 할뿐입니다 (예 : 일치 괄호) 또는 제한적 (예 : 임의로 긴 목록을 허용하는 대신 명시 적으로 계산 함).

BNF의 사용은 구문 설명으로 이해하기 쉽기 때문에 문맥 자유로 인해 필요한 추가 기능이 제공되지 않기 때문일 수 있습니다. 필자가 생각하기에 가장 큰 이점은 변수를 사용하여 일반적인 구문을 나타낼 수 있다는 점입니다. 일반적인 인터넷 프로토콜 사양에서 BNF를 살펴보면 일반 언어의 기능 (무제한 반복, 선택, 선택)을 실제로 사용한다는 점을 알 수 있습니다.

프로토콜의 상태 머신 구현을 언급 한 내용이 나에게 약간의 오해처럼 들립니다. 상태 머신으로 구현되는 파서는 아니지만 프로토콜 엔진 및 상태 전환은 입력의 개별 문자 또는 토큰에 의해 트리거되지 않고 전체 메시지에 의해 트리거됩니다. 그리고 일반적으로 프로토콜 상태 머신의 상태는 실제 통신보다 통신의 설정 및 해체에 더 많은 관심이 있습니다. 예를 들어, TCP 상태 머신은 11 개의 상태를 가지며, 그 중 하나만이 연결 확립 상태에 충분합니다. 모든 실제 데이터 전송이 발생하고 나머지는 모두 연결을 열고 닫는 것입니다. (예, 나는 TCP가 텍스트가 아니라는 것을 알고 있지만, 이것은 상태 머신이 설정된 잘 알려진 프로토콜이므로 좋은 예가됩니다 : 프로토콜 엔진 수준에서는 메시지 구문이 텍스트인지 또는 이진.)

관련 문제