반응형


회사에서 숙제가 나왔다..
소켓통신.. 관련 정리 하라는.. 췟.. 시간이 남아도낭? 놀기 바쁜뎀.. 하지만.. 까라니 까야쥐.. ㅋㅋ
가장 정리 잘 되어 있는 싸이트를 찾다보니 티스토리에 떡하니 글이 올라와 있다.. 역쉬이..
근데 영어넴.. OTL
1) C# 으로  하는 Asynchronous socket 프로그래밍
http://goodfeel.tistory.com/1177225672
2) Socket 의 종류와 프로토콜 정리http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/IBMp690/IBM/usr/share/man/info/en_US/a_doc_lib/aixprggd/progcomc/skt_types.htm

위의 글들을 읽어보고 나름대로 정리된 부분들을 대충 써본다..


자 그럼 소켓통신이 뭘까?

내가 대충 알고 있는 내용은 상호 다른 장비간의 데이터 전송을 위한 프로그램.. 이란거랑 클라이언트/서버 프로그램 사이의 통신 방법.. 이란것.. 그 외엔 이해가 안가서 패수~ 했쥥.. 솔직히 귀찮아.. 어려워.. ㅋㅋ

그래도 먹고 살려면, 좀더 알아볼까?  위의 영문 싸이트 중 2) 번을 보니 아래와 같이 정리 되어 있다.
뭐가 이리 많앙.. (영문이라 최대한 본인이 이해한 대로 정리되었음)

OS 상 소켓의 특성 대충 3가지(^^)

a) 소켓은 프로세스가 Decriptor 를 참조하는 동안 존재한다. (오홍.. 구래? 뭔말인지 당췌..)
( 여기서 decriptor란.. 기술어(記述語), 기술자(記述子) 라는 뜻; 네이넘 )
b) 소켓은 file decriptor 나 또는 비슷한 성질을 가진 장치들이 참조를 한다. 이때 적절한 subroutine 의 사용해주면 읽고 쓰고 선택이 가능하다.
c) 소켓은 주어진 이름으로 2개가 생성되어 지며, 다른 도메인상의 소켓 통신의 랑데뷰 즉 연결을 위해 접근을 허용하여 상호간의 메세지를 전달하기 위해 사용된다.


소켓의 역사(?)

왜 만들어졋을까?  소켓은 프로세서들간 서로서로
a) 인터넷처럼 네트워크 상 접근도 가능하고 통신기능도 필요하고
b) 머얼리 떨어져 있는 여러개의 호스트 기계들이나 하나의 컴퓨터를 호스트를 사용하는 관련없는 컴퓨터끼리의 통신의 필요성에 의하여 오래전에 만들어졌단다.
(거 무진장 간단한 이유로군.)

그럼 Socket 을 사용하려면? 단계별로 사용을 함 볼까?

a) 소켓을 생성하고 이름을 부여한다.
    소켓 생성은 Socket Subroutine 이 하며 소켓 이름은 Sockaddr structure(구조) 에서 지정한다. 어플리케이션에서 사용될때는 스트링이지만 통신 도메인상에서는 주로 low level 주소로 형성된다.
b) 소켓 연결을 만들고 허용한다.
    소켓은 연결도 되고 연결해제도 된다 (Socket Subroutine). 연결이전에 소켓이 만들어지는데 이는 소켓 서브루틴이 그 역활을 한다. 연결안된 소켓은 현제 연결된 다른 소켓과 다른 소켓으로 부터 연결을 허용하는 소켓뒤에 대기를 한다.
c) 데이터를 주고 받는다..
    소켓이 연결된 상태에서 읽고 쓰며 데이터를 주고 받는다. 연결을 시도하는 소켓에서 연결 대상 소켓으로 부터 특정 주소를 받는다. (read/write Subroutine)
d) 소켓을 끈다. (Shutdown/Close Subroutine)
e) 네트워크 어드레스를 번역해 준다...

어플리케이션 프로그램들은 프로세스간 통신을 구축하기 위해서 네트워크 주소를 만들어야 하는데 이때 소켓의 subroutine 에서 기본적으로 도메인 이름을 해결해주며, 정확한 네트워크 및 호스트 서비스 그리고 프로토콜 이름을 가지고 온다. 또한 서로 다른 길이의 바이트 양을 변화해 주며, 네트워크 이들을 숫자로, 주소를 호스트이름으로 바꿔준다.

Socket Subroutine

소켓 서브루틴이란 프로세스간 (Interprocess) 그리고 네트워크 프로세스간의 통신(InterProcess Communication: IPC)을 가능케 한다. 몇개의 소켓 루틴들이 모여 Socket Kernel Service Subroutine 으로 그룹지어져 있다.


OS 에서 지원되는 기본적인 소켓 들은..

SOCK_DGRAM Datagrams (max length가 지정된 연결안된 메세지) 를 제공.
주로 사용용도는 짧은 메세지 통신을 위한 소켓 타입이다. 예로 name server 나 time server 정도. 이유는 순서나 메세지 전달의 신뢰성이 보장되지 않기 때문.

Unix Domain 에서 SOCK_DGRAM 소켓 유형은 Message Queue 와 비슷하며 Internet Domain 에서는 User Datagram Protocol/Internet Protocol (UDP/IP) 상에서 실행된다.

Datagram Socket 은 데이터의 양방향 데이터 흐름을 지원. 하지만 그 데이터의 순서나 혹은 데이터의 반복, 또는 데이터 흐름의 신뢰도가 높거나 하지는 않다.
(ㅡ.ㅡ) 어이 없군. (보내준 데이터의 순서가 받을때는 흐트러져 있거나 보낸거 또 보낼 수 있다는 이야기. 크헐.. 그래도 되긴 하나보군요.) 하지만 레코드 경계는 보존이 되어 있다는데, 이 소켓의 사용예는 Packet Switched network 를 사용하는 시설에서 주로 사용되고 있다는 사실.

SOCK_STREAM 순서정렬된 스트림 데이터의 트랜스미션 메카니즘과 양방향 Byte Stream을 제공한다. (오홍..그러냐..?) SOCKET_STREAM 유형은 데이터 전달에 있어서 신뢰도도 높으며 순서무시않고 out-of-band 능력도 있다는.. (out-of-band 능력이라. 이건뭐지? 일단 패수~)

Unix Domain 에서는 Pipe 처럼 작동을 하며 Internet Domain 에서는 Transmission Control Protocol/Internet Protocol (TCP/IP) protocol 상에서 실행된다. (이렇게만 이야기 하면 모두들 이해 한단 말위지? 커헐.. )

A stream socket provides for the bidirectional, reliable, sequenced, and unduplicated flow of data without record boundaries. Aside from the bidirectionality of data flow, a pair of connected stream sockets provides an interface nearly identical to pipes.
Stream Socket 은 데이터 흐름의 양방향을 지원하며, 순서 또한 정렬이 잘되어 있고, 전달의 신뢰도도 높음. 그리고 데이터의 반복이 일어나지 않고, 레코드 경계 또한 가지고 있지 않다. 양방향 데이터 흐름 지원 외에도, 2개의 연결된 스트림 소켓으로 Pipe 와 유사한 인터페이스를 지원한다. (저pipe 란 뭔지 궁금하군..)

SOCK_RAW 내부 네트워크 프로토콜과 인터페이스 접근을 지원,  Root 사용 계정이 있는 사용자만이 다룰 수 있으며, 어플리케이션의 low level 통신 프로토콜을 사용 및 직접 접근을 허용한다. 기본적으로 현존하는 low level 프로토콜 위에 새로운 프로토콜을 만들거나, 전형적인 인터페이스 상에서의 직접연결 허용제한 등 Sock_Raw 가 제공하는 기능들을 사용하려는 일명 내공쎈 사용자들을 위한 소켓임 (췟)

Raw Socket 은 프로토콜이 제공한 인터페이스에 의존하며 DataGram 지향적이다.
SOCK_SEQPACKET 이름에서 볼수 있듯이 순서 정렬되고 복사되지 않는 데이터 흐름을 제공한다.
(딱 이거 한줄이넴.. 간단해서 좋앙 ㅋㅋ)
SOCK_CONN_DGRAM 연결 지향적 Datagram 서비스 제공. 이 유형의 소켓은 양방향 및 순서 정렬 그리고 복사되지않은  데이터 흐름을 지원하지만 신뢰도는 떨어진다. 연결 지향적 서비스인 까닭에 소켓은 데이터를 보내기 전에 연결이 일단 되어 있어야 한다. Network Device Driver(DNN) 안에 있는 Asynchronous Tranfer Mode(ATM) 프로토콜 만이 이 소켓 유형을 지원한다.

2편에서 계속
반응형

+ Recent posts