최초작성 : 23.5.11
수정 :23.6.9 (우분투 환경 추가)

[참고]

- 파이썬3 기반의 TCP/IP 활용 지침서 / 오동진·박재유 저 / 이경문 감수 / 에이콘출판

 

[서론]

- 네트워크 공부를 파이썬3으로 실습할 수 있다고?

- 정독해보자

 

[본론]

1. Windows 환경

- 윈도우 환경에서 pip로 scapy 라이브러리 설치 : 

C:\...>python -m pip install scapy

scapy 설치

- 실행

C:\...>scapy 

이렇게 Simple 할 수가...

- github : https://github.com/secdev/scapy

 

GitHub - secdev/scapy: Scapy: the Python-based interactive packet manipulation program & library. Supports Python 2 & Python 3.

Scapy: the Python-based interactive packet manipulation program & library. Supports Python 2 & Python 3. - GitHub - secdev/scapy: Scapy: the Python-based interactive packet manipulation pro...

github.com

2. Ubuntu (우분투 환경)

- 터미널 창에 pip 명령어로 설치

$ pip3 install scapy

$ python3

>>> import scapy (설치 이상 없으면 라이브러리 불러와짐)

[결론]

- 침묵 수행 할 것! (말만하지 말고 행동(실행)할 것!)

[참고]

The Modbus Protocol In-Depth : www.ni.com/ko-kr/innovations/white-papers/14/the-modbus-protocol-in-depth.html

Modbus 사이트 : modbus.org/


(주의! 공부 차원으로 해석을 해서 정확하지 않을 수 있음. 해석이 막힐 때는 구글 번역기를 사용함)

 

1. Modbus Protocol 이란?

Modbus는 master(의역 : 주장치(PC를 말함인가?))-slave(종속 장치) 관계를 사용해서 시행하는 request(요청)-response(응답) 프로토콜이다. master-slave 관계에서, 통신은 쌍으로 항상 발생하며 - 한 장치가 요청을 개시해야 응답을 기다리고 - 개시된 장치(the master)가 모든 대화에 책임이 있다. 보통 master는 HMI(Human Machine Interface), SCADA(Supervisory Control and Data Acqusition) 시스템이고 slave는 센서, PLC(Programmable Logic Controller), 또는 PAC(Programmable Automation Controller) 이다. 이러한 요청과 응답 내용, 그리고 이러한 메시지가 전송되는 네트워크 계층은 프로토콜의 다른 계층에 의해 정의 된다.

 

2. 모드버스 프로토콜의 레이어

초기 구현에서, Modbus는 serial 위에 구축 된 단일 프로토콜이여서, 여러 레이어로 나눌 수 없었다. 시간이 지나, 시리얼을 통해 사용되는 패킷 형식을을 변경하거나 TCP/IP 및 UDP(사용자 데이터그램 프로토콜) 네트워크의 사용을 허용하기 위해 다른 애플리케이션 데이터가 소개되었다. 이것은 핵심 프로토콜의 분리를 이끌었고, PDU(프로토콜 데이터 유닛)와 네트워크 레이어를 정의했고, ADU(애플리케이션 데이터 유닛)를 정의했다.

 

3. PDU (프로토콜 데이터 유닛)

MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b

Modbus_Application_Protocol_V1_1b.pdf
0.31MB

MODBUS MESSAGING ON TCP/IP IMPLEMENTATION GUIDE V1.0b 

Modbus_Messaging_Implementation_Guide_V1_0b.pdf
0.43MB

 

이것을 다루는 PDU와 코드는 위 모드버스 애플리케이션 프로토콜 설명(첨부 문서)에 핵심으로 구성되 있다. 이 설명서는 PDU의 형식을 정의한다. 프로토콜에 의해 다양한 데이터 형식이 사용되고, 데이터에 접근하기 위한 함수코드의 사용, 그리고 각 함수 코드의 구체적인 실행과 제약들이 사용된다.

 

Modbus PDU 형식은 데이터의 연관된 세트로 주어진 함수코드로 정의된다. 이 데이터의 크기와 내용들은 함수 코드에 의해 정의되고, 전체의 PDU(함수코드와 데이터)는 253바이트 크기를 초과할 수 없다. 모든 함수 코드는 slaves(종속장치들)가 원하는 애플리케이션 동작에 따라 유연하게 구현할 수 있는 구체적 동작을 한다. PDU 설명서는 데이터 접근과 취급에 관한 핵심 개념을 정의한다; 그러나 slave(종속장치)는 사양서에 명쾌하게 정의 되지 않은 한 가지 방법으로 데이터를 처리할 수 있다.

 

3-1. Modbus 데이터 접근하기와 Modbus 데이터 모델

일반적으로, 모드버스-접근가능한 데이터는 4개의 데이터 더미나 address(주소) 범위 중 하나(coils, discrete inputs, holding registers, input registers)에 저장된다. 대부분의 사양서와 마찬가지로, 산업 또는 응용에 따라 이름이 다를 수 있다. 예를 들어, holding registers 는 출력 레지스터라고 할 수 있고, coils는 디지털 또는 이산 출력이라고 할 수 있다. 이러한 데이터 더미는 포함된 데이터의 유형 및 액세스 권한을 정의한다. Slave(종속) 장치들은 로컬로 호스팅 되는데, 이 데이터에 직접 접근할 수 있다. Modbus에 접근가능한 데이터는 일반적으로 장치의 메인 메모리의 부분 집합이다. 반대로, Modbus 마스터(주장치)는 다양한 함수코드를 통해 이 데이터에 접근을 요청해야 한다. [테이블 1]에 각 블럭의 행동에 대해 서술했다.

 

메모리 구역 데이터 유형 마스터 접근 종속장치 접근
Coils Boolean 읽기/쓰기 읽기/쓰기
Discrete Inputs Boolean 읽기 전용 읽기/쓰기
Holding Registers Unsigned Word 읽기/쓰기 읽기/쓰기
Input Registers Unsigned Word 읽기 전용 읽기/쓰기

[테이블1] Modbus 데이터 모델 구역

 

이러한 블럭은 다양한 데이터 요소에 대한 접근을 제한하거나 허용하는 기능을 제공하고 또한 application 레이어에 다양한 데이터 형식으로 접근할 수 있는 간단한 메커니즘을 제공한다.

 

블럭들은 완전히 개념적이다. 주어진 시스템에서 독립된 메모리 주소로 존재하고, 또한 겹칠 수도 있다. 예를들면, Coil 한 개가 holding 레지스터 한 개에 해당하는 word의 첫번째 비트로 메모리 안 같은 위치에 존재할 수 있다. 주소(어드레싱) 제도는 전적으로 종속장치(slave)에 의해 정의되고, 각 메모리 블럭의 해석은 장치의 데이터 모델의 중요한 부분이다.

 

3-2. 데이터 모델 어드레싱

사양서는 65,536(2**16)개 요소의 주소공간을 포함함하는 것으로 각 블럭을 정의한다. PDU 정의 내에서, Modbus 는 0~65,535 범위의 각 데이터 요소에 주소를 정의한다. 하지만, 각 데이터 요소는 1부터 n까지 번호화 되어 있고, n의 최대값은 65,536 이다. 그것은, Coil 1은 주소0의 코일블록에 있고, holding 레지스터 54는 종속장치가 hoding 레지스터로 정의하는 메모리의 섹션 안에서 주소 53에 있다.

 

[참고] 

  • TCP IP 소켓 프로그래밍 / 윤상배 저 / 한빛미디어

 

2020.11.19

 

1. 도메인 : 각 영역에 알맞은 통신기기를 선택하는 것처럼, 소켓 역시 쓰이고자 하는 영역에 맞는 값을 지정해줘야 함. 도메인을 이용하면 사용 영역을 저장할 수 있음. 

 

도메인에 사용하는 값들

  • AF_UNIX : 시스템 내부 영역에서 프로세스와 프로세스 간의 통신을 위해 사용 됨
  • AF_INET : 인터넷 영역에서 물리적으로 서로 멀리 떨어진 컴퓨터 사이의 통신을 위해 사용됨. 일반적인 네트워크 프로그램은 이 값을 사용함. IPv4를 사용함
  • AF_IPX : Novell Internet 프로토콜. 지금은 거의 사용되지 않음. MS 윈도우 비스타부터 지원하지 않음.
  • AF_INET6 : AF_INET과 같음. IPv6을 사용함
  • AF_X25 : X.25 아마추어 라디오용 프로토콜

IP 버전 : 프로토콜 버전. IP는 현재 버전6까지 나옴. 가장 너리 사용되는 버전은 IPv4. IPv6는 차세대 프로토콜로 조금씩 사용처를 넓혀가는 추세

 

2. 타입

데이터 통신에 사용할 프로토콜 유형을 지정하기 위해 사용함.

  • SOCK_STREAM : 연결지향의 TCP/IP 기반 통신에서 사용함
  • SOCK_DGRAM : 데이터그램 방식의 UDP/IP 기반 통신에서 사용함
  • SOCK_RAW : 소켓은 개발자에게서 TCP/IP의 복잡함을 감춤으로써 쉽게 프로그래밍하게 도와줌. 하지만 때때로 TCP/IP를 직접 다룰 필요가 있는데, 이때 사용할 수 있는 프로토콜. (RAW_SOCKET)

3. 프로토콜

  • IPPROTO_TCP : TCP 프로토콜로 AF_INET 도메인과 SOCK_STREAM 유형과 함께 사용함
  • IPPROTO_UDP : UDP 프로토콜로 AF_INET 도메인과 SOCK_DGRAM 유형과 함께 사용함

1. C언어 공부. 이후 C++, 자바, 파이썬과 같은 고급언어를 사용하게 될지라도 C로 시작하는 걸 권장


2. 시스템 프로그래밍 공부. 프로그래밍에 발을 들여 놓는 사람들은 지루해 보이는 시스템은 뒷전으로 하고 고급 응용프로그램부터 시작하려고 한다. 멋져 보이는 3D 그래픽 엔진이나 게임 알고리즘부터 배워서 당장의 가시적 결과물에 의존한다. 실패를 통해서 스스로 느껴보는 것도 좋겠지만 닦여져 있는 길을 굳이 돌아서 갈 필요는 없다. 시스템을 공부해라.


3. 네트워크 프로그래밍을 공부


4. 네트워크를 공부하다 보면 시스템 프로그래밍이 중요함을 알게 됨. 시스템 프로그래밍을 깊이 공부하게 된다.


5. 직접 프로그램을 만들면서 고급 응용 프로그램을 공부. 동시에 그전에 대략 이해만 하고 넘어갔던 TCP/IP 네트워크 이론에 대해 공부한다.


[참고] TCP / IP 소켓 프로그래밍  저자 : 윤상배, 출판 : 한빛미디어

+ Recent posts