포트라고 하는건

TCP/IP 네트웍에서 포트 번호는, 들어오는 트래픽을 컴퓨터 내에서 실행되고 있는 적절한 프로그램에 분배시키기 위해 할당되는 숫자를 말한다. 이것은 물리적인 플러그나 소켓이 아니며, 다만 논리적인 할당일 뿐이다

# 프로그래밍에서, 포트는 "논리적인 접속장소"이며, 특히 인터넷 프로토콜인 TCP/IP를 사용할 때에는 클라이언트 프로그램이 네트웍 상의 특정 서버 프로그램을 지정하는 방법으로 사용된다. 웹 프로토콜인 HTTP와 같이, TCP/IP의 상위 프로토콜을 사용하는 응용프로그램에서는 미리 지정된 포트번호 들을 가지고 있다. 이런 것들은 IANA에 의해 지정되었으며, "잘 알려진 포트들"이라고 불린다. 다른 응용프로그램 프로세스들은 매번 접속할 때마다 포트번호가 동적으로 부여된다. 서버 프로그램이 처음 시작되면, 지정된 포트번호로 바인드된다. 그 서버를 사용하려는 모든 클라이언트 프로그램들은 지정된 포트번호에 바인드해야만 한다. 

바인드가 되면  두개의 컴퓨터간 네트워크를 이용한 통신시 발신지 컴퓨터에서 출발한 사용자 데이터(패킷)는 TCP/IP의 각 계층을 거치면서 최종적으로 목적지 주소(IP)를 가지고 있는 컴퓨터에 도착하게 됩니다. 패킷을 수신한 컴퓨터는 전송시에 사용되었던 주소필드를 제거하고, 패킷 안에 있는 데이터만을 응용프로그램에 넘겨줍니다.

결국 데이터를 넘겨줄 컴퓨터에는 FTP, Mail, Telnet, SSH, Web 등 다양한 종류의 응용프로그램이 기동하고 있을 것입니다. 수신측 컴퓨터가 인터넷 계층에서 패킷을 수신한 후 응용층으로 데이터를 전달하려고 할 때, 컴퓨터내에 기동중인 많은 응용프로그램들 중 누구에게 데이터를 전달해야 하는지 어떻게 구분할까요? 이러한 문제를 해결하기 위해서 운영체제는 응용프로그램의 논리적인 주소인 Port 번호라는 것을 이용합니다. 즉 각각의 응용프로그램 (서비스)에 유일한 논리적 주소인 Port 번호를 할당하여서, 전송계층에서 응용프로그램을 구분할 수 있도록 하고 있습니다. 


포트번호는 0부터 65536 이다. 포트번호 0부터 1024까지는 어떤 특권을 가진 서비스에 의해 사용될 수 있도록 예약되어 있다. HTTP 서비스를 위해서는 대개 80번 포트가 지정되는데, URL에 이를 적을 필요는 없다.

# 하드웨어적인 경우, 컴퓨터나 통신장비에서, 포트는 일반적으로 다른 장치에 물리적으로 접속되는 특정한 부위를 말하며, 대개 소켓이나 플러그 등의 형태로 되어 있다. 일반적으로 PC에는 하나 이상의 직렬 포트와 한 개의 병렬 포트가 제공된다. 직렬 포트는 한번에 한 비트씩 모뎀과 같은 주변장치로 전송하는 직렬 전송을 지원하며, 병렬 포트는 한번에 여러 비트씩 프린터와 같은 주변 장치로 전송할 수 있는 병렬 전송을 지원한다.

#  Port 번호는 16 비트 크기의 정수로 되어 있어 1부터 65535번까지를 사용할 수 있으며, 자주 사용되는 표준 인터넷 서비스에 대해서는 그 번호가 미리 할당(약속)되어져 있습니다. 이러한 것을 잘 알려진 포트(Well-Known Port)라 하며, 관리는 국제 인터넷
할당번호 관리기관인 IANA(Internet Assigned Numbers Authority)에서 하고 있습니다.
 
 예를 들면 FTP는 21번, Telnet 는 23번, SMTP(mail)는 25번, HTTP 는 80번 등으로 약속되어져 있습니다. 보통은 이러한 Well-Known 포트를 각 운영체제별로 "Services"라는 파일로 저장하고 있습니다. IANA에 의하면 보통 1번부터 1023까지는 Well-Known Port 영역으로 예약되어 있으며, 그 이상은 어플리케이션 서비스를 위해 할당되거나, 혹은 그때그때 임시로 할당되는 Port 번호들입니다.

Port 번호의 저장 
Unix의 경우 : /etc/services
Windows의 경우 : C:\windows\services
Windows NT의 경우 : C:\winnt\system32\dirvers\etc\services  파일로 저장합니다.


http://it.moyiza.com/?mid=tip&page=3&document_srl=13388

이 글은  프로그래밍의 노하우및 효율적인 개발론을 담고있지 않습니다.
또한 팁이란 개념에서도 벗어난 주제란것을 알고 있습니다.

하지만 잘 알려지지 않는 부분(제가 이것저것 뒤져여본 결과) 이고,
저만의 관찰이 연관되 있기에 정확히 신뢰할 만한 문서는 아닙니다.
그럼에도 불구하고 팁란에 올린 이유는 여러분들께
보다 좋은 상상력을 유발하지 않을까 기대가되기 때문입니다.

포트란 이름은 왠지 모르게 스위치나 허브의 각 랜포트를 떠오르게 합니다.
이름에서 처럼 실질적으로 선,가닥들의  출.입구란 의미로 사용되기도 합니다.
그러나 흔히 접하는 80번포트, 21번, 22번,23번,25번등등을 포함하여
유저가 임의로 생성하는 포트에는
컴터 어디를 둘러봐도 그러한 포트는 없습니다.

우리가 아무리 포트를 많이 만들어도 랜선을 통하여 통신하게되니까요.
그럼 포트는 어떠한 의미로서 어떻케 포트끼리 통신을 하는지 살펴보겠습니다.
네트워크계층은 여기서 다루지 않습니다.
단지 데이타패킷이 호스트에 들어왔을때, 어떠한 경로로 포트에 접속하는지만
말씀드립니다.

이것은 서버컴터의 대략적인 구조입니다.
[하드웨어] --- [커널] --- [레이어계층] --- [응용프로그램]
  랜카드    row단계처리    슈퍼데몬        ftp서버,웹서버,등등

 저는 하드웨어, 커널에서 어떤식으로 데이타패킷이 처리되는지는 모릅니다.
 슈퍼데몬, 즉 슈퍼서버라 불리는 inetd와 응용프로그램과의 관계만 설명드립니다.
 각각의 응용프로그램은 나름대로 자신만의 포트를 생성하고 자신을 호출하고자하는
 클라이언트에대해 응답을 합니다. 당연 해당 서버에 요청하는 클라이언트 역시
 같은 포트를 내보내어 원하는 서버의 문을 열기를 바랄겁니다.
 그 중계자 역활을 하는것이 바로 슈퍼서버입니다.
 슈퍼서버는 서버가 부팅이되는 즉시 항시 listen를 멈추지 않습니다.
 그러다가 클라이언트쪽에서 요청이 들어오면 inetd.conf파일에 설정된 포트와 서버를
 읽고 클라이언트의 요청번호(포트)와 맞는게 있으면 해당 응용프로그램을
 건듭니다(시그널)

 이것을 네트웍 관계도로 표시한다면 대략 아래와 같겠죠.

 ---------------------------------------------------------------------------------------
 클라이언트                                  서버

 요청번호(포트)                슈퍼서버(매개자)      응용프로그램(호출됨)

 쇼프로그램 시청자            연예인 매니지먼트        연예인
-----------------------------------------------------------------------------------------


******************************************** 자 여기서 전혀 다른 주제로 넘어가겠습니다.

파이프에 대해서 이야기 할건데요.

의미상 파이프는 배관파이프와 같이 흐름을 통제하는 것으로 다가옵니다.
그럼 컴터 프로그램상의 파이프는 어떠한 모습을 하고 있을까요>?
컴터 메모리상에다가 배관파이프을 얹어 놓을수도 없구요..

우리는 pipe()함수를 호출함으로서 파이프를 생성시킬수 있습니다.
아주 간단하게요.

int fp[2];
pipe(fp) 로서 끝입니다.
fp는 배열이죠. 그래서 fp자체를 프린트하면 Array라고 표시됩니다.
왜냐구요>?..  fp자체는 배열이지 값이 아니기 때문이죠. 단지 fp하면 메모리상에 상주한 fp공간의
젤 첫번째 주소만을 가지고 있을뿐입니다.

    | fp[0] | fp[1] |
 fp주소  fp[1]주소

이것을 pipe(fp)하게되면
다른프로세서에서 fp[0]에 23번을 입력하면 동시에 fp[1]에 23값이 들어옵니다.
흔히 파이프는 메모리상에 노드를 생성해서 노드간 값이 채워진다고 말합니다.
임의로 생성된 노드는 fp[0]과 fp[1] 의 주소값을 각각 가짐.


그럼 이것을 도식화 하면

A 프로세서(fp[0]에 값을할당할라함)          B 프로세서 (fp[1]을 리스닝중임)
 
fp[0] = 23                                  A프로세서요청시 fp[1]값은 23이 됨


***************************************  다시 원론으로 돌아와서 살펴보죠.


아까 네트웍계층을 생략한 도식을 다시 그려보겠습니다.

-----------------------------------------------------------------------------------------
  클라이언트                                      서버

    요청                커널(pipe(fp))    슈퍼서버(fp[1]을 항시 리슨)  응용프로그램

  포트23번보냄          연결fp[0]=23          fp[1]에 23번이뜸..          23번호출
  포트24번보냄          연결fp[0]=24          fp[1]에 24번이뜸..          24번호출
   
              ---- 위와같은 도식을 그려볼수도 있습니다..----
--------------------------------------------------------------------------------------------   

그러나 위와같이 생각하는 전문가들은 없겠죠?. 혹 있을수 있을려나~~^^
대게 포트를 데이타패킷에 묶어서 보내면 서버커널을 통과하고 슈퍼서버에서 이를 해석해서
응용프로그램을 호출하는 식입니다.

제가 생각한것이 맞든 안맞든 상상력의 고리를 이용할수도 있단 겁니다.
pipe명령을 내리면 이 명령에 대한 시스템처리는 커널이 맡아합니다.

그럼 클라이언트에서 이것을 이용하여,
패킷을 보낼때 커널에 파이프동작을 일으켜서 엉뚱한 포트를 호출하거나
또다른 파일기술자를 호출할수도 있게되겠죠..
위의 제가 말한 본론이 맞든 안맞든 실제 발생될수 있는 소지입니다.

암튼 말이 길었지 쓸모없는 내용이지만,
구조적인 면면을 생각해 볼수 시간이 되었음 합니다.

'IT 용어' 카테고리의 다른 글

Advertisement on Google  (0) 2011.04.16
Crowdsourcing - Human Computation - InnoCentive  (0) 2011.04.16
Web 2.0  (0) 2011.04.16
CTR (Click through Rate)  (0) 2011.04.16

설정

트랙백

댓글