노무현 대통령 배너


2006. 4. 5. 11:29

리눅스에서의 시리얼 통신(I)

자료 출처: http://www.linuxlab.co.kr/docs/00-04-5.htm

리눅스에서의 시리얼 통신(I)
- 모뎀에서 PPP 까지 -

배철수 / 리눅스월드 발행인

앞으로의 컴퓨터 발전 추세 중 중요한 흐름은 컴퓨터의 네트워크화다. 인터넷이 이러한 흐름을 촉발했지만 인터넷이 아니라도 컴퓨터의 네트워크화는 필연적 추세다. 각종 가전제품이나 산업용 제품에 컴퓨터 기능이 추가되고 있는 것도 네트워크화의 중요한 요인이다.

그래서 이번 호부터 2회에 걸쳐 고전적인 컴퓨터 통신인 시리얼 통신을 리눅스에서 사용하는데 필요한 지식 및 소프트웨어 등을 살펴보겠다.

피시에서 다른 컴퓨터와 데이터를 주고 받는데는 보통 시리얼포트, 패러랠포트, 랜카드 등이 사용된다. 앞으로는 USB 포트도 많이 사용될 것이다.

데이터 전송속도는 랜카드가 10 ~ 100 mbps로 가장 빠르나 단점은 랜이 설치되어 있어야 한다는 것과 도달거리가 보통 100 ~ 500 미터라는 것이다.
(“우리집에 있는 케이블 모뎀은 랜카드로 연결해서 케이블 TV 회사까지 수 km나 가는데 왜 500미터죠?” 라고 물을 수도 있겠다. 그러나 케이블 모뎀에서 케이블 TV 회사의 인터넷망까지 연결되는 구간은 랜이 아니다.)

패러랠 포트는 최대 케이블 길이가 1~2 미터에 불과하다는 단점 때문에 특수한 경우에나 사용된다.
시리얼 포트는 보통은 최대속도가 115k에 불과하지만 전화선과 모뎀만 연결하면 거리 제한을 받지 않고 두 컴퓨터를 연결할 수 있다는 장점 때문에 원격지 통신에 가장 많이 사용되고 있다.

그러나 현재 인터넷의 비약적 성장으로 고속 데이터 전송의 필요가 많아져 앞으로는 랜카드가 통신에 가장 중요한 역할을 차지할 것이다.

여기서는 리눅스에서 시리얼통신을 처음 시작하는 사람들을 위해 시리얼 통신에 사용되는 시리얼포트, 모뎀 등의 하드웨어부터, 리눅스에서 다이얼인/ 다이얼아웃 설정, 인터넷을 시리얼포트로 연결하는데 필요한 PPP 프로토콜 사용법 등을 다루겠다.

대략적인 목차를 소개 하자면.(금회)

I. 시리얼 통신 일반

1.싱크와 어싱크

2.시리얼 통신에 사용되는 하드웨어
2.1 시리얼포트
- UART 칩
- Com포트(IRQ, IO Address)
- 멀티포트
2.2 모뎀
- 내장모뎀과 외장모뎀
- 다이얼업모뎀과 전용선모뎀
- PCI 모뎀, 소프트모뎀
- 데이터모뎀과 팩스모뎀
* 모뎀에서 56k 속도에 대해
2.3 케이블
시리얼케이블
단말기 케이블
널모뎀 케이블
2.4 전화선

3. 시리얼통신의 기본원리
3.1 통신 파라메터
3.2 시리얼포트 핀 신호 구성

4. 모뎀 통신 표준, 규약
4.1 전송속도
4.2 압축
4.3 에러체크
4.4 헤이즈 명령어
4.5 흐름제어
- Xon/Xoff
- RTS/CTS

II. 리눅스에서 시리얼통신에 필요한 지식

1. 시리얼포트 장치명
1.1 표준 시리얼포트
1.2 멀티포트
1.3 장치 만들기

2. 리눅스에서 사용가능한 모뎀

3.리눅스에서 시리얼포트 설정

4. 리눅스용 단말통신 프로그램

I. 시리얼 통신 일반

    우선 시작 전에 필자가 이 글에서 사용한 환경을 설명하는게 좋겠다.

    <> 피시
    - 마더보드 : Asus P2BF
    - CPU : 셀레론 400
    - 메 모 리 : 64메가
    - 랜카드 : 3COM 3C905
    - 하드디스크 :. hda : 퀀텀 15기가 (UDMA)
    . sda : 퀀텀 2기가 xp32150w (wide scsi)
    - SCSI 콘트롤러 : Aha 2940UW
    - cd-rom 드라이브 : sony cdu76s(SCSI 방식)

    <> 모뎀 : USRobotics sportster 33.6k(ISA) 내장형
    . Com3(3e8)
    . IRQ : 5

    <> 사용 배포본 : 데비안 V2.1 R2

    앞으로 이 글에서 나오는 모든 화면이나 설정은 위의 환경을 기초로 한 것이다.

1. 싱크와 어싱크

    동기와 비동기라고도 표현하는데 피시의 시리얼포트는 어싱크(비동기) 통신을 지원한다. 앞으로의 모든 설명도 어싱크 통신을 대상으로 한다.

    싱크통신의 경우 데이터 전송 중간에 동기 신호를 보내 데이터의 정확한 도달을 확보한다. 어싱크 통신은 글자마다 맨 앞에 시작 신호(스타트비트)가 있어 상대는 이를 보고 그 뒤에 데이터가 있다는 사실을 알게 된다.

    통신 속도는 싱크방식이 빠르다. 그러나 싱크통신에는 클럭 발생장치가 필요해 고가이다.

    피시에서 싱크통신을 하려면 별도의 보드(싱크보드)를 필요로 한다. 라우터의 시리얼 쪽 연결에는 싱크통신이 사용된다.

2. 시리얼 통신에 사용되는 하드웨어

    2.1 시리얼포트

      - UART 칩

      피시의 시리얼 포트는 겉으로는 예전이나 지금이나 똑 같게 보인다. 밖에서 보이는게 D자형태의 9핀(예전 피시는 25핀도 있다) 숫놈이다. 피시에는 보통 2개이다. 하지만 내부적으로는 조금 변했다.

      피시의 시리얼 포트에 들어가는 UART 칩이 초창기에는 8250이었다가 16450으로 그리고 요즘은 16550A로 바뀌었다. 리눅스 부팅시 메시지를 잘 보면 칩의 종류를 알 수 있다.

        Configuring serial ports...done.
        /dev/ttyS0 at 0x03f8 (irq = 4) is a 16550A
        /dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A (spd_hi)
        /dev/ttyS2 at 0x03e8 (irq = 5) is a 16550A (spd_vhi)
        < 화면 1 >

      만약 이 칩이 16550A가 아니라면 고속모뎀으로 PPP 연결시에 문제가 발생한다.

      이 세 칩의 차이는 버퍼의 차이이다. 즉 시리얼 포트에 데이터가 도착했을 경우 CPU가 다른 일을 하느라 그 데이터를 미처 못 가져가는 경우 다음 데이터가 앞 데이터를 덮어 쒸우는 현상(data overrun)을 막기 위해 16550A는 16바이트를 저장하는 FIFO(first in first out : 선입선출) 버퍼를 갖고 있다. 16450은 한 바이트이다.

      리눅스에서 56k 모뎀을 사용하고 CPU가 펜티엄 급이라면 16바이트 버퍼는 충분하다. 그러나 486 CPU이고 CPU 소모가 많은 그래픽 환경(X window)이라면 16바이트 버퍼로도 부족해서 data overrun이 발생할 수 있다. 이 경우는 텍스트 환경으로 바꾸면 효과가 있다.

      그런데 윈9X의 FIFO 설정을 보면 재미있는 현상을 볼 수 있다.

      “제어판 - 모뎀 - 일반 - 등록정보 - 연결 - 포트설정” 을 보면 설치시 기본 수신버퍼를 14바이트로 잡고 있다.

      이 값의 의미는 이렇다. 모뎀으로부터 UART로 도착한 수신 데이터가 14바이트가 되야 UART는 CPU에게 데이터를 가져가도록 호출하라는 의미이다. 그런데 호출하는 순간 CPU가 다른 작업에 몰두하고 있어 바로 데이터를 가져가지 못하면 다음에 모뎀으로부터 도착한 데이터는 15번과 16번 버퍼 즉 2바이트의 여유밖에 없다. 그 2 개가 차도 CPU가 안 가져가면 그때는 data overrun이 발생한다. 물론 윈도우에서 모뎀 통신 하나만 돌리고 있다면 2바이트 여유도 충분하다. 그러나 컴파일이나 캐드 같은 CPU 소모가 많은 작업을 하면서 모뎀통신을 한다면 2바이트 여유로는 문제가 발생한다. 이때는 임계치를 그 이하로 낮추어야 한다.

      요즘 나오는 230k나 460k를 지원하는 시리얼포트의 경우는 16바이트 버퍼로도 부족해서 32바이트나 64바이트를 지원하는 16650, 16750 UART칩을 사용하기도 한다.

      - Com포트의 IRQ와 IO Address

      피시에서는 통신을 하려면 필히 통신에 사용할 com 포트 번호를 지정해야 한다.

      아래는 com 포트별 IO Address 와 IRQ 이다.

      com1 3f8 4
      com2 2f8 3
      com3 3e8 4
      com4 2e8 3

      여기서 IO address는 중복되지 않으나 IRQ는 com1과 com3가 같고 com2와 com4가 같다. 따라서 com1과 com3, com2와 com4를 동시에 사용할 수 없다.

      그럼 내 피시의 시리얼포트는(9핀 콘넥터) 두 개인데 그것이 com 포트 몇 번인지를 어떻게 아느냐고요?

      요즘 피시는 CMOS 셋업에서 정한다. 즉 시리얼포트 1번과 2번은 이미 하드웨어적으로 지정되어 있다. 아래는 필자의 피시 뒤의 콘넥터 그림(ASUS P2BF 보드임)인데 이중에서 왼쪽 9핀이 시리얼포트 1이고 오른쪽이 2번이다. 시리얼 포트 1번을 com 포트 몇 번에 할당할지를 CMOS 셋업에서 지정하면 된다.
      지정할 때는 IO address를 가지고 결정한다. 예를 들어 serial 포트 1번의 io address를 3f8로 CMOS 셋업에서 지정했으면 com1이 되는 것이다.

      CMOS에서는 IO Address를 지정하면 IRQ는 자동으로 할당된다. 즉 시리얼포트 1을 COM1(3f8)으로 지정하면 IRQ는 자동으로 4로 지정된다. COM1으로 지정하면서 IRQ는 3으로 변경할 수는 없다.

      CMOS 셋업을 변경했으면 부팅 시의 화면에서 지정사항을 확인할 수 있다.
      아래는 Award BIOS를 사용한 경우이다.

      Diskette Drive A : 1.44M, 3.5 in. Display Type : EGA/VGA
      Diskette Drive B : None Serial Port(s) : 3F8 2F8 3E8
      Pri. Master Disk : LBA ,UDMA 2,15021MB Parallel Port(s) : 378
      Pri. Slave Disk : None DRAM Type : SDRAM
      Sec. Master Disk : None SPD On Module(s) : Yes
      Sec. Slave Disk : None Data Integrity : Non-ECC

< 화면 2 >

      위의 경우는(필자의 피시) 시리얼 포트가 3개 인데 com3(3e8)는 USRobotics 내장모뎀이다. USRobotics 내장모뎀은 점퍼로 com포트 및 IRQ를 따로 지정할 수 있게 되어 있다.

      그래서 필자는 내장모뎀의 com 포트는 com3로, IRQ는 5번으로 지정했다.(화면 1 참조) IRQ 5는 2번째 프린터에서 사용하므로 모뎀에 사용해도 문제가 없기 때문이다. 시리얼 포트 3개의 IRQ가 다 다르므로 3개를 동시에 사용해도 문제가 없다. (내장모뎀은 시리얼포트와 모뎀이 합해져 있다고 보면 된다)

      위에서처럼 보통은 시리얼포트 1번을 com1으로 시리얼 포트 2번을 com2로 지정하지만 꼭 그래야 하는 것은 아니다. 예를 들어 여러분의 내장모뎀이 com1 이나 com2로 밖에 설정할 수 없게 되어 있다면 피시의 시리얼 포트를 com1이나 com2로 설정하면 안된다.

      - 멀티포트

      통신업체의 경우 리눅스 PPP 서버 한 대에 수십개의 모뎀을 연결해야 할 경우는 멀티포트라는걸 쓴다. 멀티포트는 피시 안에 내장되는 보드와 외부에 외장 모뎀을 연결하는 패널 두개로 구성되어 있다. 내장모뎀을 사용하는 멀티포트도 있다.(Equinox 보드)

      멀티포트에서 사용하는 IO Address와 IRQ는 보드마다 다르다. 어떤 보드는 IRQ를 사용하지 않는다. 어떤 보드는 memory address를 사용하기도 한다.

      현제 리눅스에서 가장 지원이 잘 되는 멀티포트는 사이클레이드(Cyclade) 보드와 로켓(Rocket) 보드이다.

      멀티포트를 쓸 경우 피시 한 대에 128개 까지의 모뎀을 연결할 수 있다.
      필자가 목포넝쿨 인터넷에 설치한 PPP 서버의 경우 펜티엄급에 128M 메모리를 갖고 있는데 96개의 모뎀을 연결해서 2년 이상 한번도 고장 없이 잘 쓰고 있다.
      (중간에 삼성하드가 망가져 하드 교체 한 경우만 빼고)

    2.2 모뎀

      2.2.1 내장모뎀과 외장모뎀

      우리라 흔히 사용하는 다이얼업 모뎀은 외장형과 내장형이 있다. 성능은 같다.

      외장형의 장점은 인디케이터가 있어 모뎀 상태 파악이 쉽고 모뎀에 문제가 있으면 파워를 꺼서 하드웨어적으로 리셋을 할 수가 있다는 점이나 케이스비용이 들어가 가격이 비싸고 자리를 많이 차지한다는 점이다.

      내장형은 값이 싸고 자리를 차지하지 않으나 문제가 생기면 피시를 리부팅해서 리셋해야 한다. 다른 피시로 옮기기도 불편하다.

      2.2.2 다이얼업모뎀과 전용선모뎀

      우리가 집에서 모뎀통신에 사용하는 공중전화망(PSTN)에는 다이얼업 모뎀을 사용해야 한다. 그러나 지점에 전용선으로 단말기를 연결해 주는 경우처럼 24시간 계속 회선을 연결할 경우는 전용선 모뎀을 사용해야 한다. (56k나 128k 디지털 전용선을 사용해도 되나 장비 및 회선비가 훨씬 비싸다)

      현재 우리나라에서 생산되는 전용선모뎀은 최대 속도가 19,200bps에 불과하고 압축도 지원하지 않으나, 외국에서 생산되는 다이얼업 과 전용선 모드(leased line mode) 기능을 동시에 갖춘 2선식 전용선 모뎀은 최대속도가 33.6k이고 약 2배 정도의 압축을 해 주므로 전송속도는 60k 이상이다. USRobotics courier 모뎀이 다이얼업과 전용선모드를 동시에 지원한다.

      우리나라의 기업들의 모뎀통신을 보면 이해가 안돼는 경우가 많다. 전용선모드를 갖춘 다이얼업모뎀보다 배나 비싼 데이터 압축도 안되는 더미(멍텅구리) 전용선 모뎀에다 4선식 라인을 연결해 19.2k 속도로 통신을 하고 있는 경우가 많기 때문이다.

        즉, 모뎀값은 2선식 전용선모뎀의 두 배
        속도는 2선식 전용선모뎀의 1/3 (19.2k vs 66k : 데이터 압축시)
        월 회선비는 2배(4선식이므로)

      이런 식의 모뎀통신을 아직도 하고 있는 업체가 많다. 혹시 여러분의 회사에 전용선모뎀을 사용하고 있다면 확인해 보기 바란다.
      (예전에 필자가 근무했던 회사도 이렇게 쓰고 있었다)

      2.2.3 PCI 모뎀, 소프트모뎀

      요즘 나오는 피시에는 ISA 슬롯이 두개에 불과해 대부분의 피시 주변기기가 ISA에서 PCI로 바뀌고 있다. 필자는 아직 PCI 모뎀을 사용해 보지 않아 리눅스에서의 셋팅을 소개하지는 못한다.

      그러나 CMOS나 리눅스의 setserial 명령등으로 PCI 모뎀의 IO Address와 IRQ 셋팅만 표준 시리얼포트의 IO Addressd와 IRQ로 지정한다면 사용이 가능할 것으로 생각된다.

      일부 PCI 모뎀은 리눅스용 드라이버가 나와 있다고 들었다.

      모뎀 중에서 소프트웨어모뎀이란게 있는데 이는 종전에 모뎀 하드웨어에 들어 있는 기능을 피시의 CPU(즉 드라이버 프로그램)가 대신해 주는 것이다. 모뎀 제작비를 절약하기 위해서 이다. 이런 모뎀을 리눅스에서 사용하려면 리눅스용 드라이버가 필요하므로 구입시 주의해야 한다.

      PCI 모뎀과 소프트모뎀은 같지 않다. PCI 모뎀과 ISA 모뎀은 내장 모뎀이 피시의 ISA 슬롯에 꼽히는지 PCI 슬롯에 꼽히는지의 차이 이나 소프트모뎀은 모뎀 기능 일부가 소프트웨어로 처리된다. 따라서 소프트모뎀은 ISA 방식일 수도 있고 외장형일 수도 있다.

      2.2.4 데이타모뎀과 팩스모뎀

      요즘 나오는 거의 모든 모뎀은 팩스 기능을 갖고 있으나 그렇지 않은 경우도 있다. 팩스 기능을 갖고 있더라도 모뎀에 따라 팩스 최대 전송속도나 지원하는 표준이 다르므로 데이터모뎀과 팩스모뎀을 겸하려면 그 모뎀이 지원하는 팩스 기능도 잘 검토해야 한다.

      아래는 필자의 사견이므로 참고 삼아 들어주기 바란다.
      필자는 하이텔이 생기기 전부터 모뎀통신을 시작했다. 처음에 사용한 모뎀은 그 당시 필자의 월 봉급과 맞먹었던 50만원 짜리 에러첵크 기능도 없던 1200bps 모뎀이었다.

      그 후로 국내에 들어온 모뎀은 거의 대부분 사용해 보았으나 한마디로 우리나라의 모뎀 생산 기술은 세계 수준에 한참 뒤처져 있다. 필자가 여러 TT선 인터넷 서비스 업체에 리눅스로 PPP 서버를 구축해 주었으나 그때마다 모뎀으로 인해 많은 어려움을 겪었다.

      그래서 요즘은 아에 PPP 서버나 팩스서버를 구축할 때는 필자가 지정하지 않은 모뎀으로는 작업을 하지 않는다. 기껏 작업해 놓으면 모뎀 잘못으로 인해 장애가 발생했는데도 리눅스가 잘못 된 것으로 욕을 먹기 때문이다.

      한마디로 피시 살 때 끼워주는 2~3만원 짜리 모뎀은 거의 불량품 수준이다. 필자는 공짜로 준데도 쓰지 않는다. 왜냐면 이런 모뎀을 쓰면은 통신비 손실이 모뎀 구입비를 초과하기 때문이다.

      필자가 외제를 추천한다고 비난하는 사람도 있겠다. 하지만 불량품을 애용하는게 결코 나라를 위하는게 아니라고 생각한다. 세계 시장에서는 전혀 경쟁력이 없는 제품을 국산이라고 사 쓴다면 이는 결국 자원배분의 왜곡을 초래할 뿐이다.

      즉 경쟁력 있는 제품 생산에 쓰여야 할 자금이 낭비되는 결과에 불과하다. 그런 제품을 생산하는 업체들은 차라리 일찌감치 경쟁력 있는 제품 생산으로 전환하는게 낫다고 생각한다. 물론 초창기에는 유치산업 보호를 위해서 어느 정도 국산품을 장려하는게 필요하지만 그렇다고 언제까지나 소비자들만 피해를 볼 수는 없지 않은가?

      국내 모 대기업이 생산하는 하드나 FDD도 외국 유명업체의 비해 성능이 상당히 낮다. 거기에 고장도 잘 난다. FDD는 몰라도 하드의 경우 깨지면 그로 인해 날리는 데이터는 하드 디스크 구입비가 문제가 아니다. 애프터서비스를 아무리 잘 해준다 해도 하드나 교체될 뿐 날린 데이터는 애프터서비스를 받을 수도 없다.

      필자가 단지 필자의 경험만으로 이야기 하는게 아니다. 미국의 유명 피시잡지에서 실시한 하드디스크 벤치마크 테스트를 보라. 국산은 거의 저질품으로 평가 결과가 나온다.

      우리나라에서 생산하는 피시 부품 중에 어느 것이 그런데로 쓸만 한가? 필자가 추천하는 기준은 그 부품이 해외 시장에 수출하는 정도면 믿을 수가 있다는 것이다. 후진국에 수출하는 것은 별로고 선진국 시장에서 다른 제품들과 나란히 팔리는 제품이라면 써도 된다. 하지만 별로 없을 것이다.

    <> 모뎀에서 56k 속도에 대해

    통신속도에는 시리얼포트와 모뎀까지의 속도인 시리얼포트 속도(DTE 속도라고도 함)와 두 모뎀 간의 속도인 모뎀속도 또는 라인 속도(DCE 속도라고도 함) 두 가지 속도 개념이 있다.

    여러분이 통신 소프트웨어에서 지정하는 속도는 시리얼포트 속도이고 라인속도가 아니다.

    라인속도를 모뎀에서 지정할 수도 있지만 이건 별 의미가 없다. 그저 두 모뎀이 상의해서 가능한 최고 속도로 연결하도록 지정해 놓으면 된다.. 이유는 여러분의 모뎀 최고속도가 33.6k라고 해도 이 속도로 연결할 수는 없는 경우도 있기 때문이다. 모뎀 속도는 두 모뎀 중 낮은 속도의 모뎀이 지원하는 속도로 결정되기 때문이다.

    일반적인 데이터는 모뎀에서 보통 2배 정도 이론적으로는 4배까지 압축이 되기 때문에 33.6k 속도의 모뎀에서는 시리얼포트 속도를 115.2k로 지정한다.

    그러나 zip 이나 gzip 으로 이미 압축이 되어 있는 파일을 전송할 때는 모뎀에서 압축이 되지 않는다. 즉 라인속도와 시리얼포트 속도가 같다. 따라서 통신속도를 좌우하는 것은 모뎀속도 즉 전화선에서의 속도이다.

    요즘은 ISDN이니 ADSL 같은 고속 데이터 전송 기법이 등장하였지만 기존의 음성교환기를 사용하는 공중전화망은 원래 음성용으로 설계되어 데이터 전송에 사용하기는 대단히 불리하다. 그래서 전화선을 사용하는 다이얼업 모뎀은 라인속도를 높이는게 매우 어렵다.

    지금 음성전화선에서 낼 수 있는 최대 데이터 전송속도는 56k이고 이는 이론상의 한계에 거의 육박해 있다고 한다.

    그러나 56k 전송속도는 양방향이 아니다. 한쪽(업로드)은 33.6k이다. 여러분이 회사의 리눅스에 56k 모뎀을 설치하고 전화선을 연결한 후 집에서 56k 모뎀으로 연결해도 최대 라인속도는 56k 가 아니고 양방향 모두 33.6k 이다.

    공중전화망은 아날로그 망이라고 알고 있는 분이 많지만 사실이 아니다. 아날로그 구간은 전화국에서 집의 전화기까지의 구간이고 전화국간의 망은 요즘 다 디지털라인이다. 여러분이 인터넷에서 사용하는 T1 라인(1.544mbps)도 원래는 음성통화용 디지털 라인이었다. 즉 음성전화선 1개를 수용하는데 필요한 64kbps 24개를 동시에 수용하는 라인이다.

    여러분이 모뎀으로 하이텔을 연결한다면 피시에서 모뎀까지는 디지털 신호이고 모뎀에서 아날로그로 바뀌어 여러분이 속한 전화국까지 간 후 여기서 다시 디지털로 바뀌어 하이텔 호스트가 있는 전화국으로 가고 여기서 다시 아날로그로 바뀌어 하이텔의 모뎀까지 간다.

    56k 기술은 모뎀에서 전화국까지의 구간이 디지털 회선이어야 가능하다. 즉 전화국에서 호스트까지 디지털라인을 끌어와 특수한 디지털모뎀을 사용해야 하므로 일반인들이 설치하기는 불가능하다. 그래서 56k는 거대 통신회사에서만 채택하고 있어 통신회사에서 피시까지의 다운로드 구간에서만 56k가 가능하고 여러분의 집에서 전화국까지는 아날로그 방식이므로 업로드는 33.6k다.

    그러나 56k 기술은 전화선의 품질에 매우 민감하므로 잡음이 전혀 없는 고 품질의 전화선에서나 나오고 대부분의 경우는 50k 미만이라고 한다. 여러분의 집에서 56k 모뎀으로 통신하고 있다면 zip으로 압축되어 있는 파일을 다운로드 받아 보라. 56k로 연결이 되어 있다면 다운로드시 6,000cps 이상이 나와야 한다.

    2.3 케이블

    시리얼포트와 외장모뎀 또는 시리얼포트끼리 연결하는 케이블에도 여러 종류가 있다.

      2.3.1 시리얼 케이블

      초창기 시리얼포트는 25핀이었다. 이유는 시리얼통신에 관한 국제 표준에 25핀을 사용하기 때문이다. 그러나 피시의 비동기 통신에서는 9핀으로 충분하다. 그래서 IBM이 피시에서 9핀을 사용한 후 요즘 나오는 피시는 모두 9핀이다. 그러나 모뎀은 아직도 25핀이다.

      피시와 모뎀을 연결하는 시리얼케이블 배선은 아래와 같다.

      - 시리얼포트(25) 모뎀(25)
      TxD 22
      RxD 33
      RTS 4 4
      CTS 5 5
      DSR 6 6
      SG 7 7
      DCD 8 8
      DTR 20 20
      RI 22 22

      - 시리얼포트(9) 모뎀 (25)
      .3 2
      .2 3
      .7 4
      .8 5
      .6 6
      .5 7
      .1 8
      .4 20
      .9 22

      2.3.2 단말기 케이블

      지금처럼 랜이 일반화되어 있지 않던 시기에는 모뎀을 사용할 필요가 없는 근거리에서 유닉스에 단말기를 연결할 때는 유닉스 머신과 피시(단말기)의 시리얼포트를 연결하였다. 속도도 9600bps 정도였다.

      이때 유닉스의 시리얼포트와 단말기(피시)를 연결하는 케이블을 단말기 케이블이라 불렀는데 유닉스와 단말기가 멀리 떨어져 있는 경우가 많아 배선비를 줄이기 위해 두 시리얼포트를 연결하는데 세 가닥만 연결돼 있는 단말기 케이블을 썼다. 즉 송신, 수신, 그라운드 이 세 개만 연결하면 기본적인 데이터 송수신이 가능하기 때문이다.

      이 경우는 rts/cts 핀이 연결되지 않으므로 하드웨어 흐름제어 (rts/cts)를 사용할 수 없다.

      리눅스 호스트와 멀리 떨어진 곳에 윈도우/도스 피시를 단말기로 사용하려면 이 케이블을 쓰면 된다. 또는 리눅스에 그래픽카드를 꼽지 않고 콘솔에 나오는 각종 메시지를 다른 피시에서 볼 수 있는 시리얼 콘솔을 사용할 경우에도 이 케이블을 쓰면 된다.

      단말기 케이블은 그 길이가 속도에 따라 제한이 있다. 필자가 기억은 못하지만 차폐가 잘된 시리얼 케이블을 사용하면 38,400bps 속도로 10미터 이상 가능하다.

      단말기 케이블도 다음에 나오는 널모뎀케이블의 일종이다.

      단말기 케이블의 배선은 아래와 같다.

      리눅스(9핀) 단말기(9핀)
      RxD(2) TxD(3)
      TxD(3) RxD(2)
      SG(5) SG(5)

      리눅스(25핀) 단말기/피시(9핀)
      TxD(2) RxD(2)
      RxD(3) TxD(3)
      SG(7) SG(5)

      2.3.3 널모뎀케이블

      위의 단말기케이블과 원리는 같다. 그러나 두 시리얼포트를 연결시 모뎀이 연결된 것과 똑같이 흉내를 내 주므로 널모뎀 케이블이나 불린다.

      실제모뎀을 연결하기 전에 테스트를 위해서 또는 두 시리얼포트를 고속으로 연결하기 위해 필요하다. 사용하는 핀 수에 따라 여러가지가 있으나 모뎀과 똑 같은 흉내를 내기 위해서는 8개의 핀을 연결해야 한다.(링 신호는 없으므로 RI는 사용되지 않는다)

      양쪽 다 9핀이라면 배선은 아래와 같다.

      TxD (3)RxD(2)
      RxD(2)TxD(3)
      RTS(7)CTS(8)
      CTS(8)RTS(7)
      DSR(6)--|
      DCD(1)-----DTR(4)
      SG(5)SG(5)
      |---DSR(6)
      DTR(4)-----DCD(1)

      25핀인 경우는 위에 나오는 핀 이름을 참고해서 만들면 된다.

      널모뎀케이블은 RTS/CTS 신호도 연결되므로 하드웨어 플로우컨트롤이 가능하다. 따라서 시리얼포트와 통신 소프트웨어에서만 허용한다면 230k, 460k 속도도 가능하다.

      그러나 속도가 높아지면 최대 케이블 길이가 짧아진다.
      115k 라면 차폐(shield)가 잘된 케이블을 써도 2 ~3 미터가 최대다.

    2.4 전화선

    시리얼통신을 하는데 모뎀을 쓴다면 두 모뎀을 연결하는데 통신회선이 필요하다. 다이얼업모뎀이라면 보통은 우리가 집에서 사용하는 한국통신의 음성전화선이 -공중전화망(PSTN)이라고 불린다- 사용되지만(ISDN 회선에 모뎀을 사용하려면 추가 장비가 필요하다) 꼭 그렇지는 않다.

    회사의 구내 전화망에 연결된 피시끼리도 다이얼업 모뎀을 사용할 수 있다.

    전용선모드가 있는 모뎀(USRobotics courier) 끼리 연결할 경우는 한국통신의 교환기를 거치지 않고 두 모뎀을 직접 케이블(2선식)로 연결해도 된다.

    공중전화망으로 두 모뎀을 연결한다면 요금은 일반 음성전화 요금과 같다. 그래서 특정 두 모뎀을 장시간 연결하는 경우라면 전용선을 사용해야 한다. 전용선은 한 달 내내 사용해도 요금이 3만원 미만이지만 공중전화망과는 달리 특정 두 지점을 고정으로 연결할 수 있고 공중전화망처럼 임의로 연결 상대를 선택할 수 없다.

    전용선에는 전용선모뎀이나 전용선모드가 있는 다이얼업 모뎀을 사용해야 하지만 음성전용선인 TT선에는 다이얼업 모뎀 사용이 가능하다.

3. 시리얼 통신의 기본 원리

    3.1 통신 파라메터

    통신 프로그램을 사용할 때 제일 먼저 지정하는 부분은 포트번호이고 다음이 속도, 패리티 체크 여부, 스타트비트, 데이터비트 길이 등이다.

    포트는 위에서 설명했고 속도도 위에서 설명했다. 즉 통신프로그램에서 지정하는 속도는 시리얼포트 속도라는 것이다. 보통 시리얼포트 속도는 모뎀속도(라인속도)의 2~4배를 지정한다. 33.6k 모뎀은 115,200bps를 지정하면 된다.

    14.4k 모뎀 같은 경우는 시리얼포트와 연결되는 모뎀포트가 아에 115.2k가 지원이 안되므로 피시의 시리얼포트를 115.2k로 지정하면 통신이 안된다. 이때는 56k로 지정해야 한다. 모뎀은 피시의 시리얼포트 속도를 자동으로 인식한다.

    패리티체크 및 스타트 비트, 데이터비트 길이는 양쪽 모뎀이 동일해야 한다. 틀리면 데이터가 깨진다.
    지금은 거의 대부분이 no parity, 1 start 비트, 8 data 비트(N/8/1)로 통신 파라메터를 지정한다. 특별한 경우가 아니면 달리 지정할 필요가 없다. 특히 PPP 연결은 데이타비트가 8비트여야 가능하다.

    3.2 시리얼포트 핀 신호 구성

    시리얼 포트의 각 핀의 신호가 무슨 역할을 하는지를 알면 통신 연결이 잘 안될 때 원인 파악이 쉽다.
    필자의 경우 특히 PPP 연결을 할 때 이들 핀들의 상태를 체크해서 왜 연결이 안되는지를 알아내곤 한다.

    리눅스용 getty 프로그램을 debug 모드로 설정하면 현재의 각 핀의 상태를 알 수 있다. 모뎀의 인디케이터에도 각 핀의 신호 상태를 표시해 주므로 통신 연결이 잘 안될 때 각 신호의 불빛을 보면 어느 부분이 이상이 있는지 쉽게 알 수 있다.

    시리얼포트의 9개의 핀 중 SG(Signal Ground : 9핀은 5번 25핀은 7번 핀) 를 제외한 나머지는 DTE와 DCE 중 어느 쪽에서 그 신호를 관장하는지가 정해져 있다.

    DTE(Data Terminal Equipment)는 피시의 시리얼포트를 말하고 DCE(Data Circuit Terminating Equipment)는 모뎀을 말한다고 보면 된다.

    아래에서 핀 번호는 9핀과 25핀이 다르므로 이름으로만 설명한다.

    TxD, RTS, DTR 은 피시(DTE)에서 모뎀(DCE)로 신호를 보내주고 RxD, CTS, DSR, DCD, RI는 DCE에서 DTE(모뎀)로 신호를 보낸다/

    아래에 각 신호에 대한 설명이다. 이는 항상 DTE를 기준으로 한 설명이다.

    - TxD : DTE에서 DCE로 데이터를 전송하는데 사용된다.

    - RxD : DCE에서 DTE로 데이터를 보낼 때 사용된다.

    실제 데이터 전송에는 이 두 핀만 사용된다.
    나머지는 제어용으로 사용된다.

    - RTS(Request to Send) :피시가 모뎀으로부터 데이터 송신을 허가할 때

    - CTS(Clear to Send) : 모뎀이 피시에게 데이터를 보내도 좋다는 신호

    이 둘은 데이터 흐름 제어용이다. 예를 들어 피시에서 파일을 업로드 할 때 모뎀의 버퍼가 다 차서 모뎀이 피시로부터 데이터를 받을 수 없으면 모뎀은 CTS 신호를 끈다. 그러면 피시의 시리얼포트는 CTS 신호가 다시 켜 질 때 까지 모뎀으로 데이터를 보내는 것을 잠시 중지한다.

    - DSR(Data Set Ready) : 모뎀이 켜져 있다는 뜻임. 보통 DSR은 모뎀에 파워가 들어오면
    항상 켜진다. 통신프로그램에서는 DSR이 꺼져 있으면 전화걸기를
    시도하지 않는다.

    - DTR(Data Terminal Ready) : 피시가 켜져 있으면 켜진다. 보통은 피시에서 통신프로그램을
    가동하면 DTR 신호가 켜진다. 따라서 DTR이 꺼지면 모뎀은
    피시가 꺼진 것으로 알고 상대모뎀과의 연결을 차단한다.
    그렇지 않으면 계속해서 전화비가 올라가기 때문이다.

    - 통신프로그램에서 통신 연결을 차단하는 방법이 바로 일시적으로 DTR 신호를 끄는 것이다.

    특수한 경우 모뎀이 DTR 신호를 무시하게 설정할 수도 있다. AT&D0 명령이 그것인데 다이얼업 모뎀에 이 설정을 넣으면 통신 중에 피시가 꺼져도 통신 연결이 차단되지 않아 전화요금을 바가지 쓸 수 있다.

    - DCD(Data Carrier Detect) : 모뎀이 상대모뎀으로부터 연결 톤을 받을 때 켜진다. 모뎀은
    DCD가 켜져야 상대 모뎀에게 데이터를 전송한다. 통신 중에
    라인이 절단되면 DCD가 꺼지며 모뎀은 전화를 끊는다.
    그래야 통신비가 허비되지 않기 때문이다.

    at&c0 명령을 모뎀에 주면 모뎀은 DCD 신호를 무시한다.(override) 만약 다이얼업 모뎀에 at&c0 명령을 주면 상대가 전화를 끊거나 회선이 절단 되도 이 쪽 모뎀은 전화연결을 유지하므로 역시 뜻하지 않는 전화비를 부담할 수 있다.

    DCD override 는 전용선에서 사용한다.

    - RI(Ring Indicator) : 전화선에서 링 신호를 받았을 때 켜진다. 모뎀은 자동응답 기능이
    있으므로 ats0=x(x>0) 명령을 주면 자동으로 전화를 받는다.
    모뎀이 자동응답이 아니면(ats0=0) 모뎀은 RI 신호가 들어오면 보통
    통신프로그램에 Ring 이라는 메시지를 보낸다. 이때 전화를 받고
    싶으면, 즉 연결을 하려면 ata 명령을 모뎀에 주면 된다.

    리눅스 다이얼인(외부 사용자에게 연결을 제공하는) 프로그램(getty)는 거의 모뎀을 자동응답으로 설정해야 한다. 그래서 두 모뎀이 연결되어 DCD가 켜지면 그 때 login: 프롬프트를 뿌려 준다.
    그러나 mgetty의 경우는 모뎀을 자동응답으로 설정하지 않는다. 대신 모뎀으로부터 Ring 메시지가 오면 ata 명령을 모뎀에게 주어 모뎀이 전화를 받게 한다.

    모뎀을 수동응답으로 설정하는 mgetty의 장점은 어떤 사유로 getty 프로그램이 다운되면(getty가 disable 되어 있다는 뜻이 아니라 에러를 일으켜 제대로 동작하지 않는다는 뜻) 비록 상대가 연결을 시도해도 모뎀이 전화를 받지 않아 상대에게 불필요한 전화 요금 부담을 주지 않는다는 점이다.(다른 getty 프로그램은 모뎀을 자동응답으로 설정하므로 getty가 에러를 일으켜도 전화 연결이 된다. 물론 상대방의 화면에는 아무것도 안 뜰 것이다. )

    필자도 리눅스 초창기에 회사 피시에서 집의 리눅스로 연결하기 위해 다른 getty 프로그램을 썼으나 가끔씩 프로그램이 다운되어 전화만 연결되고 통신은 안되는 경우가 있어 쓸만한 getty 프로그램을 찾다가 news group에서 mgetty를 알게 되어 지금까지 몇 년째 mgetty를 써 왔다.

4. 모뎀 통신 표준, 규약

    4.1 전송속도

    모뎀속도(선로속도)에 관한 표준은 아래와 같다.

    V.34 : 28.8k 표준
    V.34+ : 33.6k 표준
    V.90 : 56k 표준

    4.2 압축

    V.42bis : 현재의 고속모뎀에서 사용하는 압축 표준이다. 최대 4배 까지 압축을 해준다. 평균적으로 2배 정도의 압축이 가능하다. 단 이미 압축이 되어있는 파일에는 효과가 없다.

    4.3 에러체크

    V.42 : 현재의 고속모뎀에서 사용하는 에러체크 표준이다. 에러를 예방하거나 수정하는 것이 아니라 에러 발생을 탐지하여 재전송하는 방법이다.

    4.4 헤이즈 명령어(AT 명령어)

    모뎀은 두 가지 모드를 갖는다. 명령어모드와 데이터 송수신모드이다. 명령어 모드란 모뎀에게 전화를 걸게 하거나 모뎀의 셋팅을 변경하도록 명령하는 것이다.

    송수신 모드는 두 모뎀 사이에 데이터 송수신이 이루어 지는 상태이다. 명령어 모드에서 피시의 키보드에서 입력한 내용은 모뎀에게만 전달되고 상대모뎀으로는 전송되지 않는다.

    모뎀은 상대 모뎀과 연결되면 자동으로 데이터 송수신 모드로 들어간다. 데이터 송수신 모드 중간에 명령어 모드로 들어가려면 일정한 간격으로 “+” 키를 세번 누르면 된다. 다시 데이터 송수신 모드로 들어가려면 ato 명령을 주면 된다.

    즉 데이터와 명령어를 같은 핀에 동시에 보내는 이 기법은 헤이즈사에서 처음 개발하여 그 후 거의 모든 모뎀에 채택되었다. 하지만 표준으로 채택되지는 않고 단지 표준처럼 사용되고 있다.

    모뎀에 명령을 줄 때 at 다음에 해당 명령을 주므로 at명령어라고 불린다.
    at 명령의 종류는 모뎀마다 조금씩 다르나 몇 가지는 거의 모든 모뎀에서 공통된다.

    주로 많이 사용되는 몇 가지 중요 at 명령어를 보면

    d : 모뎀에게 전화를 걸게 한다.
    e1 : 모뎀이 피시에서 받은 명령어를 반향한다.
    q0 : 모뎀이 명령 수행결과를 피시에 알려준다. 명령이 수행되면 보통 OK 를 보내준다.
    v1 : 명령 수행 결과를 영어로 표시해 준다.
    x1 : 보통 다이얼톤 검출을 않고 전화를 걸어야 할 때 필요하다.
    다이얼톤이란 전화기에서 나는 윙소리를 말하는데 9번을 누르고 외부 전화를 연결하는
    구내 전화망이나 TT선은 다이얼톤이 다르거나 없으므로 이 셋팅이 필요하다.
    &c1 : 전화선의 상태에 따라 모뎀을 제어하라는 뜻이다. 즉 라인이 끊기면 모뎀은 연결을
    종료한다.
    &d2 : 일반적인 DTR 신호에 따른다.(리눅스에서 다이얼인 모뎀을 사용할 경우는&d3 명령이
    필요하다. 이는 DTR 이 떨어지면,즉 모뎀이 전화를 끊으면 모뎀 설정 값을 디폴트
    값으로 다시 세팅하는 것을 말한다)

    * S 레지스터
    위의 헤이즈 명령과 비슷하나 모뎀의 동작형태를 결정하는 값이다. 이 값을 변경하는 것도
    at 명령을 사용한다.

    S 레지스터도 모뎀마다 다르다. 아래는 USRobotics 모뎀에서 필자가 흔히 사용하는 설정이다.

    S0 : 자동응답 기능에서 벨이 몇 번 울릴 때 모뎀이 전화를 받는가를 결정한다.
    0 이면 전화를 받지 않는다. 즉 수동응답이다.

    S7 : 모뎀이 전화를 건 후 몇 초 동안 상대모뎀의 응답을 기다리는가를 결정한다.
    보통 60(초)를 지정하나 국제전화의 경우는 더 늘려야 한다.

    S13 : 1을 지정하면 DTR 드롭시 모뎀을 리셋한다. 다른 모뎀의 at&d3와 같다.

    S19 : 데이터 송수신이 없을 경우 전화를 끊는 시간을 지정한다.(분 단위) 0을 지정하면
    타이머가 작동하지 않는다. 혹시 통신을 연결해 놓고 끊는 것을 잊어 버렸을 경우에
    대비해 값을 넣어 주는게 좋다.

    * S10 : 라인상의 일시적인 캐리어 로스가 있을 때 연결이 끊기기까지의 대기시간이다.(1/10초)
    그시간 내에 다시 캐리어가 들어오면 연결을 끊지 않는다.

    예를 들어 혹시 전화에 통화중 대기를 설정해 놓고 있는데 통신 사용 중에 다른 전화가 걸려와 통화중 대기 신호가 울릴 때 통신이 끊기게 하고 싶으면 이 값을 낮춘다. 거꾸로 통화중 대기 신호가 울려도 통신이 안 끊기게 하려면 이 값을 높인다.(기본은 7이다)
    전화선 상태가 안 좋아 통신 중에 자주 연결이 끊긴다면 이 값을 높여 본다.

    4.5 흐름제어

    모뎀과 피시간의 데이터 흐름을 제어하는 방법에는 소프트웨어 플로우 컨트롤과 하드웨어 플로우 컨트롤이 있다. 피시의 경우는 통신 소프트웨어에서 지정하고 모뎀의 경우는 AT 명령으로 지정한다. 양쪽이 같은 흐름 제어를 사용해야 한다.

    소프트웨어 플로우 컨트롤(Xon/Xoff) :
    ctrl-q(Xon), ctrl-s(Xoff) 캐릭터를 사용해 모뎀과 피시 사이의 데이터 흐름을 통제한다. 바이너리 데이터 전송시 소프트웨어 플로우 컨트롤을 사용하면 바이너리 데이터의 중간에 Xon/Xoff 문자가 흐름제어로 인식돼 데이터 송수신이 중단되므로 텍스트 데이터만 송수신하며 하드웨어 플로우 컨트롤을 사용할 수 없는 특수한 경우에만 사용된다.

    예를들어 rts/cts 핀이 없는 시리얼포트나 TxD, RxD, SG 3개의 선만을 사용하는 단말기의 경우 등에 사용된다.

    하드웨어플로우컨트롤(RTS/CTS) :
    시리얼포트의 RTS/CTS 핀을 이용해서 흐름제어를 하는 방법으로 현재의 고속모뎀으로 통신시 대부분 사용하는 방법이다.

Ⅱ. 리눅스에서 시리얼통신에 필요한 지식

1. 시리얼포트 장치명

    앞으로 여기에 사용하는 통신프로그램은 별도 지정이 없는 한, minicom 에서의 화면이다. 리눅스에서 단말 통신프로그램을 사용하거나 PPP 연결을 하려면 사용하는 시리얼포트 이름을 알아야 한다.

    1.1 표준 시리얼포트

    피시에서 기본으로 사용 가능한 시리얼포트는 4개이다. 이를 표준 시리얼포트라고 한다. 표준 시리얼포트를 사용하기 위해서는 특별한 절차가 필요 없다. 이 4개는 이미 IO address와 IRQ 등이 표준화되어 있어 부팅시 자동으로 탐색되어 사용 가능하기 때문이다.

    단 IRQ가 표준과 다르면 별도의 셋팅이 필요하다.

    A - Serial Device : /dev/ttyS2

    Minicom에서 시리얼포트를 com3로 지정하고 있다. 시리얼장치명은 반드시 앞에 /dev를 넣어야 하고 뒤의 장치명(ttyS2)과 같은 파일이 /dev 디렉토리에 있어야 한다.

    churlsu:~> ls -l /dev/ttyS2
    crw-rw---- 1 root dialout 4, 66 Mar 27 11:41 /dev/ttyS2

    표준 시리얼포트 장치명(IO Address와 IRQ는 2.1을 참조)

    com1 /dev/ttyS0
    com2 /dev/ttyS1
    com3 /dev/ttyS2
    com4 /dev/ttyS3

    -. /dev/cua?
    커널 2.0에서는 다이얼인에서는 /dev/ttyS? 다이얼아웃에서는 /dev/cua?로 장치명이 달랐으나 2.2에서는 /dev/ttyS?로 통일되었다.

    -. /dev/modem
    /dev/modem은 리눅스의 표준 장치명이 아니다. 단지 설치 과정에서 모뎀연결포트를 묻는데 이때 실제 장치명을 대신해서 /dev/modem이란 논리연결을 해 준 것뿐이다. 만약 설치 후 모뎀을 추가하거나 모뎀 위치를 변경하면 /dev/modem 이란 장치는 사용할 수 없다. 따라서 모뎀 장치명에는 가급적 /dev/ttyS?을 사용하는게 좋다.

    1.2 멀티포트

    피시에서 5개 이상의 시리얼포트를 필요로 하면 별도의 멀티포트 카드를 사용해야 하는데 멀티포트의 장치명은 카드마다 다르다. 또 카드를 꼽는다고 바로 사용이 가능하지 않다. 커널 컴파일이나 드라이버 설치가 필요하다.

    아래는 리눅스를 지원하는 주요 멀티포트 장치명이다.

    -. 사이클레이드 보드 : /dev/ttyC??
    -. 로켓포트 : /dev/ttyR??

    [bae@ppp /dev]$ ls -l ttyC1
    crw-rw---- 1 uucp uucp 19, 1 Jul 21 2000 ttyC1

    1.3 장치 만들기

    혹시 실수로 /dev/ttyS? 장치를 지웠거나 없다면 mknod 명령