티스토리 뷰

안녕하세요. 구스입니다.


이전 자료에서 TCP, UDP 통신을 위한 2차배열을 문자열로 변환하는 내용(LabVIEW 2D Array To String)에 대해서 알아보았습니다. 이 글에서는 위의 함수를 이용해서 실질적으로 TCP/IP 통신 기반을 구현해 볼려고 하는데요. 


LabVIEW에서 2차배열을 문자열로 변환하는 과정을 이해하실려면 아래의 링크를 참조하세요.



TCP/IP 통신은 서버-클라이언트 기반의 통신입니다. 

TCP/IP에 대해서 좀더 알아보고자 하면 아래와 같습니다.


컴퓨터 간의 주고받는 메시지를 전송할 때 에러가 발생하지 않도록 알맞은 크기로 나누어져 전송하고 이를 받아서 다시 원래의 정보로 변환하는 것을 약속해 놓은 것이다. TCP/IP는 1960년대 말 미국방성(DARPA)의 연구에서 시작되어 1980년대초 프로토콜 모델이 공개된 바 있다. 이는 인터넷 프로토콜 중 가장 중요한 역할을 하는 TCP와 IP의 합성어로 인터넷 동작의 중심이 되는 통신규약으로 데이터의 흐름 관리, 데이터의 정확성 확인(TCP 역할), 패킷을 목적지까지 전송하는 역할(IP 역할)을 담당한다. 


보통 IP는 데이터를 한 장소에서 다른 장소로 정확하게 옮겨주는 역할을 하며, TCP는 전체 데이터가 잘 전송될 수 있도록 데이터의 흐름을 조절하고 성공적으로 상대편 컴퓨터에 도착할 수 있도록 보장해주는 역할을 한다. TCP/IP는 개방형 프로토콜의 표준으로 특정 하드웨어나 OS에 독립적으로 사용하는 것이 가능하다. 또 인터넷에서 서로 다른 시스템을 가진 컴퓨터들을 서로 연결하고, 데이터를 전송하는데 사용하는 통신 프로토콜로 근거리 및 원거리 모두에 사용된다.


TCP/IP는 응용 계층, 트랜스포트층, 인터넷층, 네트워크 인터페이스층의 4개의 계층으로 구성되어 있다. 응용 계층은 사용자 응용 프로그램으로부터 요청을 받아서 이를 적절한 메시지로 변환하고 하위계층으로 전달하는 역할하는 기능을 담당한다. 트랜스포트층은 IP에 의해 전달되는 패킷의 오류를 검사하고 재전송을 요구하는 등의 제어를 담당하는 계층으로 TCP, UDP 두 종류의 프로토콜이 사용된다. 그리고 인터넷층은 전송 계층에서 받은 패킷을 목적지까지 효율적으로 전달하는 것만 고려한다. 


즉, 데이터그램이 가지고 있는 주소를 판독하고 네트워크에서 주소에 맞는 네트워크를 탐색, 해당 호스트가 받을 수 있도록 데이터그램에 전송한다. 마지막으로 네트워크 인터페이스층은 특정 프로토콜을 규정하지 않고, 모든 표준과 기술적인 프로토콜을 지원하는 계층으로서 프레임을 물리적인 회선에 올리거나 내려받는 역할을 담당한다. 한편 TCP/IP는 OSI 참조모델과 비교할 때 다양한 서비스 기능을 가진 응용 프로그램 계층이 존재하고, 전송계층/네트워크 계층과 호환하는 계층이 존재한다는 공통점을 가지는 반면, TCP/IP 프로토콜의 응용 계층은 OSI 참조모델의 표현계층과 세션계층을 포함하며 ,TCP/IP 프로토콜은 물리계층과 데이터 링크계층을 하나로 취급한다는 점에서 차이가 있다.


[참조 : 네이버 지식백과] 


TCP/IP 프로토콜은 내부적으로 3방식 핸드쉐이킹(3 Way Handshaking)을 이용하여 송수신되는 패킷이 절대 빠지지 않게 처리합니다.


수신측에서 데이터를 받지 못하면 ACK 신호를 송신측에서 받을 수 없고 이에 대한 Resend 요청을 통해서 데이터가 전달되지 않은 패킷을 재전송하여 사용자가 원하는 데이터의 손실없이 통신이 가능하게끔 도와줍니다. 



그럼 LabVIEW에서 2차배열을 TCP/IP로 송수신하는 방법에 대해서 알아봅시다. TCP/IP 통신을 위해서는 서버와 클라이언트 구성이 필요합니다.


데이터 송신의 주체는 서버가 될 수도, 클라이언트가 될 수도 있지만 서버는 클라이언트 접속 이전에 항상 생성이 되어 클라이언트 접속을 기다려야 합니다.(Listen 상태) 그리고 클라이언트가 접속을 하게 되면 데이터 송수신이 이루어집니다. 


그럼 서버 코드를 먼저 살펴보도록 합시다. 


제가 구현한 TCP/IP 서버의 프로세는 3개로 구분이 되느데요. 클라이언트 접속을 기다리고, 접속이 되면 클라이언트 데이터를 수신하고, 종료시 서버해제 및 에러 처리를 하게 됩니다. 


데이터 수신시 패턴화 문자열을 이용하여 기존의 데이터를 2진 문자열로 변환하여 뿌려주게 됩니다. 



클라이언트 코드로 한번 보도록 합시다. 


클라이언트 코드는 LabVIEW의 생산자-소비자(Producer-Customer) 패턴을 이용하여 구현되어 있습니다.

생산자/소비자 패턴은 랩뷰에서 가장 많이 사용하는 디자인 패턴 중 하나이며 데이터 만드는 곳과 처리하는 곳을 따로 둘 때 사용하고 있습니다. 


랩뷰 생산자/소비자 패턴에 대한 자세한 내용은 아래의 링크를 참고하세요.


Application Design Patterns: Producer/Consumer

http://www.ni.com/white-paper/3023/en/




위의 코드를 보면 생산자 While문에서 전송을 위한 배열을 큐에 전달하고, 클라이언트 서버 접속 이후 큐로 부터 데이터를 받아서 송신을 하고 있습니다. 


2개의 코드를 실행해보았습니다. 데이터 송신 측이 클라이언트 이기 때문에 클라이언트 UI부터 보도록 합시다.


왼쪽 배열은 생산자에서 전송하는 배열이며, 오른쪽 원소 배열은 TCP/IP로 송신하는 데이터를 보여줍니다. 생산자에서 30ms 마다 데이터를 큐에 추가하기 때문에 데이터 송신을 담당하는 위쪽 While문의 프로세스 시간도 30ms가 나오는 것 확인이 가능합니다. 




서버 UI도 살펴봅시다. 


서버의 Process Time도 클라이언트와 동일하게 30ms입니다. TCP/IP에서 중요한 Process Time을 확인하는 것은 상당히 중요합니다. 데이터 송수신에 대한 지연(Delay)가 발생하는지 여부를 파악할 수 있기 때문입니다. 


클라이언트에서 보낸 배열의 결과를 값 배열로 확인이 가능합니다. 



이 글에서는 LabVIEW에서 2차배열을 TCP/IP를 이용하여 데이터 송수신하는 방법에 대해서 알아보았습니다.

그럼 이만 줄이겠습니다.


이 글이 도움이 되셨으면 아래의 하트를 눌러주세요.



댓글