TCP / UDP 설명

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0G38s&articleno=7181009  에서 참조

일단 자세히 알아보기 전에 조금 쉽게 이야기하면

 

우리가 포트라고 쓰는 것에는 통신포트(물리적인 포트=예를들어 COM1, COM2, LPT1 LPT2 USB 포트등…)란 것도 있고

 

TCP/IP 포트라는 것도 있는데….. (예를들어 예전에 우리회사의 파워넷 같은 경우 홈페이지 주소 되에 ;8080 등으로 포트번호를 지정해서 접속되곤 했죠)

 

여기서의 포트는 하드웨어적인 포트가 아니고 가상의 소프트웨어적인 포트입니다.

 

바로  프로토클 규약인 TCP/IP 에서 지정하는 포트입니다.

 

하드웨어적으로 연결이 된 네트워크망에서, 컴퓨터들끼지 서로 통신을 하는데 필요한 규약이 TCP/IP이죠.

그리고 통신을 할때 동시다발적인 통신을 가능케 하기 위하여 포트라는 가상의 “문"이 정의 됩니다.

 

네트워크 하면 가장 기초적으로 OSI 7 layer에 대해서 이야기 해야 하는데,

 

이는 표준으로서 TCP/IP는 비슷하게(?) 이를 구현은 하지만 정확히 따르지는 않습니다.

 

그래서 OSI 7 layer를 건너 뛰고 바로 TCP/IP에 대해서 설명 드리겠습니다.

 

웹에서 OSI 7 layer를 검색하면 아주 많은 자료를 구하실 수 있을 것 입니다.

 

 

중요하지만 직접적이지 않은 것들은 (계층 이야기) 다 건너 뛰고…

 

TCP/IP에서 TCP는 신뢰성 있는 데이터를 전송하는 프로토콜이고

 

IP는 데이터를 정확한 곳에 보내기 위한 프로토콜 입니다.

 

여기서 유일 무이한 컴퓨터 고유 주소인 IP Address (흔히 말하는 IP)가 있습니다.

 

(똑 같은 주소가 두개라면 집배원 아저씨가 제대로 편지를 전달 못하듯이

 

IP도 내부 IP가 아닌이상 전 세계에 유일 무이 해야 제대로 전달 되겠죠.)

 

 

선박 운항에 비유 하자면….

 

하나의 배가 한 단위의 정보 (패킷)이라고 가정하면 목적지인 부산 항(IP Address)에

 

잘 도착 했다고 가정 하면… 단순히 배가 부산 항에 도착 하는 것 만으로

 

수송이 완료 된 것은 아닙니다.

 

적절한 선착장(Port)에 배를 대어서 짐을 내려 줘야지

 

제대로 수송이 완료 되는 것 입니다.

 

물론 부산항에는 수 많은 선착장이 있을 것 입니다.

 

이때 미리 무역 업자는 약속한 선착장에서 기다리고 있어야 하겠지요.

 

(Port를 의미 그대로 항구로 해석을 하려 한다면 IP Address는 "대한민국"으로

 

Port는 대한민국의 많은 항구 중 하나인 부산항으로 생각하면 됩니다.

 

어디까지나 비유이니…)

 

 

기본적으로 21, 23, 80 번 등의 포트는 FTP, Telnet, HTTP로 약속이 되어 있고

 

(요놈들 말고도 몇개 더 있지만 직접 사용 해 보지 않아서 기억나지 않네요.)

 

저 멀리 몇 천번대 포트는 P2P등 임의로 이용 할 수 있습니다.

 

즉, 선착장에서 무역 업자가 기다리듯이 80번 포트에서는 HTTP가 기다리고 있다가

 

전달된 정보를 적절히 처리해서 우리에게 보여 주게 됩니다.

 

(Port는 65536개가 있는데 TCP와 그의 친구 UTP가 관할하고 있습니다.)

 

 

그리고 이렇게 포트를 사용하는 목적을 어려운 말로

 

호스트 내에서 다중 프로세스에 대한 처리라고 하는데

 

옛날 모뎀으로 통신 하던 시절에는 다운 받고 있는 동안은 채팅을 할 수 없었습니다.

 

그러나 요즘은 프루나로 다운 받으면서 채팅도 하고 동시에 실시간으로 영화도 보는데,

 

즉, 여러 프로그램 (엄밀히 프로세서)이 동시에 사용 할 수 있다는 의미로 생각 합니다.

 

좀더 자세히 하면 TCP 의 역할은 4계층으로 나누어서 다양한일은 하는데(애플리케이션층,트랜스포트층 네트원크 인터넷층, 데이터링크층) 복잡하니까. 간단하게만 설명하면

 

프로그램등이 데이터를 보내면 TCP가 데이터를 송신할 수 있도록 TCP가 이해할 수 있는 형태로 포멧하고,

 TCP는 그 데이터를 패킷 형태로 자르고 에러 체킹을 위한 헤더를 각 패킷에 붙이게되죠.

 네트워크 층에는 IP 포장(목적지 IP의 주소를 가르켜 줌)을 하고 IP헤더를 넣게되고,

 데이터 링크층은 네트워크 층에서 보내온 데이터의 IP 주소를 특정한 네트워크의 하드웨어 주소로 번역하는 역할을 합니다.
 
(네이버에서 퍼온글… 이해를 돕기위해.

 

예를 다시 들면, HTTP 서버가 0 과 1 로만 되어 있는 자료를 애플리케이션 층에 보낸다면,
애플리케이션 층에서는 그 데이터를 새로운 형태로 포멧 (디지털을 아날로그) 트랜스포트 층에 보내고.

트랜스포트 층에서는 TCP가 데이터를 전달하기 쉬운 형태로 자르고 난 뒤 네트워크 층으로 데이터를 보낸다. 네트워크층에서는 데이터가 가야할 장소와 IP 헤더를 붙이고 데이터를 데이터 링크층으로 보낸다. 데이터 링크층은 네트워크 층에서 보내온 데이터의 IP 주소를 특정한 네트워크의 하드웨어 주소로 번역한다.
 
송신측에서 각 계층은 상위 계층에서 받은 데이터의 헤더를 추가하고, 유사하게 수신측에서 각 계층은 다음 상위 계층에 데이터를 보내기 전에 자신의 헤더를 추출한다. 그래서 최종적으로 얻게되는 데이터는 원래 보냈던 데이터와 동일한 것이 된다.
 
TCP는 전달 되는 데이터의 관리 기능외에 또 다른 기능이 있다. 그것은 TCP가 다른
프로토콜과 같이 사용될 수 있도록 지원한다. 예를 들어 여러분이 집에서 모뎀으로
인터넷에 WWW을 항해 하려 한다면 먼저 윈속등으로 여러분 컴퓨터에 TCP/IP 환경을
만들어야 한다. WWW에서는 브라우저와 서버와 통신을 위해 HTTP라는 프로토콜을 따로
사용하는 데 왜 TCP/IP라는 프로토콜을 따로 컴퓨터에 설정 해 주어야 하는가? 이미
언급했다시피 인터넷에는 많은 종류의 컴퓨터(OS)가 존재한다. 이들 간을 묶는 첫 번째
프로토콜(언어)이 TCP/IP이고 인터넷을 기반으로 움직인는 WWW에서 정보를
교환하기 위한 프로토콜이 HTTP인것이다.)

 

 

 

 

TCP포트 번호가 필요한 이유

 

TCP/IP 프로토콜을 기반으로 하는 네트워크상에 한 서버가 있다고 생각하면 그 서버는 한 사용자와 만 통신을 하는 것이 아니라 여러 사용자와 동시에 통신을 하게 됩니다. 또한 서버는 한가지 서비스만 제공하는 것이 아니라 여러 가지의 서버 응용 서비스를 여러 사용자에게 제공을 하게 됩니다. 즉 데이터 통신 환경에서 한 서버는 여러 가지의 서비스를 여러 사용자에 제공을 할 수 있고 또한 한 사용자는 여러 개의 서버로부터 여러 가지의 서비스를 제공 받을 수 있습니다.

 

두 대 이상의 컴퓨터가 통신을 할 때 데이터를 목적지 까지 전달 해 주는 것은 IP주소에 의해 결정이 되고 목적지 서버에 도달한 정보를 어느 응용프로그램에서 처리해 줄 것인지를 결정하는데 사용하는 것이 바로 포트번호가 됩니다. 데이터를 전송 할 때도 같은 방법으로 적용이 될 수 있습니다. 서버가 제공하는 여러 사용자중 어느 사용자가 요청한 서비스인지 또는 어느 프로그램이 요청한 서비스인지를 구분하기 위하여 송신지 포트 번호가 있는 것입니다. 이 표기된 포트 번호에 따라 데이터가 정확한 응용 프로그램에서 처리 될 수 있습니다. 요청한 서비스의 포트번호가 맞지 않거나 차단이 되어 있으면 그 서비스는 제대로 이루어 질 수 없습니다.

 

즉 어느 응용 프로그램이나 사용자가 보낸 데이터 인지를 구분하기 위해 송신측 포트 번호(Source Port Number)가 사용되고 어느 응용 프로그램이 수신해야 하는지를 구분하기 위해 수신측 포트 번호(Destination Port Number)가 사용됩니다.

 

실제로 통신을 할 때는 모든 장치가 포트 번호를 사용하여 전송층에서 통신을 하며 이 포트 번호를 결정하는 방법에는 두 가지가 있습니다. 다음은 이 방법에 대해 알아봅니다.

 

1. 공식 기관에서 공표한 포트 번호

 

많이 쓰이는 일반적인 TCP/IP 프로토콜을 사용하는 응용 프로그램들은 통신을 할 경우 대부분 공식 기관에서 결정한 포트 번호를 사용하게 됩니다. 이와 같이 공식 할당된 포트 번호를 Well-known Port Number또는 Well-known Port Assignment라고 합니다.

 

실제로 사용되는 예를 보도록 하겠습니다.

 

– 포트번호 0 : Reserved

– 포트번호 1 : TCP MUX(TCP 멀티플렉스)

– 포트번호 5 : RJE(Remote Job Entry)

– 포트번호 7 : ECHO

– 포트번호 9 : DISCARD

– 포트번호 11 : SYSTAT(활성 사용자)

– 포트번호 13 : DAYTIME(주간)

– 포트번호 15 : NETSTAT(네트워크 상태 프로그램)

– 포트번호 17 : QOTD(해당일 인용문)

– 포트번호 19 : CHARGEN(문자 발생기)

– 포트번호 20 : FTP-DATA(파일전송 프로토콜(데이터))

– 포트번호 21 : FTP(파일전송 프로토콜)

– 포트번호 23 : TELNET(단말기 연결)

– 포트번호 25 : SMTP(간단한 메일 전송 프로토콜)

– 포트번호 37 : TIME(시간)

– 포트번호 42 : NAME(호스트 이름)

– 포트번호 43 : WHOIS(누구)

– 포트번호 53 : NAMESERVE(도메인 이름 서버)

– 포트번호 79 : FINGER(finger)

– 포트번호 101 : HOSTNAMES(NIC 호스트 이름 서버)

– 포트번호 103 : X400(X.400 메일 서비스)

– 포트번호 113 : AUTH(인증 서비스)

– 포트번호 117 : UUCP-PATH(UUCP 경로 서비스)

– 포트번호 119 : NNTP(USENET 뉴스 전송 프로토콜)

– 포트번호 129 : PWDGEN(암호 발생기 프로토콜)

– 포트번호 160 – 223 : RESERVED(예약되어 있슴)

 

2. 동적으로 포트 번호를 할당하는 방법

 

어떤 장치(device)가 서비스를 제공하기 위해 필요 할 때 그 장치들이 사용하는 포트 번호가 중복이 되거나 불일치가 일어나지 않도록 번호를 임의로 생성하여 사용하는 방법입니다.

 

컴퓨터에서는 임의의 작업을 처리하기 위해 실행 중인 프로그램을 프로세스라합니다. 하나의 프로세스가 하나의 프로그램의 기능을 처리할 수도 있고, 여러 개의 프로세스가 하나의 프로그램의 기능을 처리하기도 합니다.

 

운영체제에 예약된 프로세스는 컴퓨터를 운영하기 위해 반드시 실행되고 있어야 하는 프로그램으로 이 프로세스들은 고유의 프로세스 번호를 가지고 수행이 되며

이러한 예약된 프로세스는 일반 사용자들이 요청한 서비스를 제공하기 위해 다른 프로세스를 불러 오거나 처리를 하게 됩니다. 이 프로세스는 사용자의 서비스 요청이 있을 때 마다 동적으로 생성된 임의의 번호를 가지게 되며, 통신을 위한 처리도 이러한 예약된 프로세스가 수행되고 있는 동안에 필요에 의해 부가적으로 할당이 되므로 동적인 포트 번호 할당이라고 할 수 있습니다.

 

3. 포트 번호와 전송층 프로토콜

앞에서 설명한 TCP에서 사용하는 포트 번호는 다른 전송층 프로토콜에서도 사용 할 수 있습니다. 서로 다른 전송층 프로토콜은 서로 다른 프로세스로 인식이 되고 포트 번호는 전송층 프로토콜 마다 규정이 되어 있기 때문입니다. 일반적으로 TCP와 함께 많이 사용되고 있는 UDP프로토콜에서도 TCP프로토콜에서 사용하는 것과 동일한 포트 번호를 가지고 같은 서비스를 제공 해 줄 수 있습니다. 물론 TCP가 데이터 처리하는 방법과 UDP가 데이터를 처리해 주는 방법은 서로 다릅니다. 보통 TCP/IP서비스는 UDP/IP에서도 처리 할 수 있게 많이 사용 됩니다.

 

UDP프로토콜에서 정의되어 사용하는 포트 번호의 예를 들어 보면 다음과 같습니다.

 

– 포트번호 0 : Reserved

– 포트번호 7 : ECHO

– 포트번호 9 : DISCARD

– 포트번호 11 : SYSTAT(활성 사용자)

– 포트번호 13 : DAYTIME(주간)

– 포트번호 15 : NETSTAT(네트워크 상태 프로그램)

– 포트번호 17 : QOTD(해당일 인용문)

– 포트번호 19 : CHARGEN(문자 발생기)

– 포트번호 37 : TIME(시간)

– 포트번호 42 : NAME(호스트 이름)

– 포트번호 43 : WHOIS(누구)

– 포트번호 53 : NAMESERVE(도메인 이름 서버)

– 포트번호 67 : BOOTPS(부트스트랩 프로토콜 서버)

– 포트번호 68 : BOOTPC(부트스트랩 프로토콜 클라이언트)

– 포트번호 69 : TFTP(간단한 파일 전송 프로토콜)

– 포트번호 123 : NTP(네트워크 시간 프로토콜)

– 포트번호 161 : SNMP(단순 네트워크 관리 프로토콜)

– 포트번호 162 : SNMP-TRAP

– 포트번호 512 : BIFF(UNIX 콤샛 통신)

– 포트번호 513 : WHO(UNIX RWHO 프로세스)

– 포트번호 514 : SYSLOG(시스템 로그)

– 포트번호 525 : TIMED(시간 데몬 프로세스)

 

위에서 보신 것처럼 같은 서비스가 TCP프로토콜로 처리가 될 수도 있고

UDP 프로토콜로 처리가 될 수도 있습니다. 상위 계층 프로그램이 전송층 프로토콜로 TCP또는 UDP를 선택적으로 사용 할 수 있다는 이야기 입니다. 그렇다면 어떤 경우에 TCP를 사용하고 어떤 경우에 UDP를 사용하면 좋을까? 간단하게 정리하면 TCP는 좀 더 안정적인 데이터 처리를 하고자 할 때 쓰는 프로토콜이며 UDP는 안정적인 데이터 전송을 보장 않아도 되는 경우에 사용 하는 것이 좋습니다.

http://networker.jinbo.net/zine/view.php?board=networker_4&id=1756 에서 참조

얼마 전에 시간을 가장 가치 없게 사용하는 방법 중 상위 3위안에 랭크될 것이 분명한 동원예비군 훈련을 갔다 왔습니다. 제가 갔던 부대는 의정부에 있는 통신대대인데, 여기서 하는 일은 말 그대로 부대 사이의 통신을 연결하고 관리하는 일입니다. 통신대는 크게 전송조, 교환조, 유무선조로 나뉘어 집니다. 저는 이 중 교환조에 속하는데, 교환조는 타 부대의 교환조와의 네트워크를 구성하여 이를 제어하고, 내부의 전화를 연결해 번호를 부여하는 등의 역할을 수행합니다. 옛날 전화에 있었다는 교환수와 비슷한 역할이라 할 수 있긴 하지만, 전화번호를 부여하고 음성 통신뿐만 아니라 데이터 통신까지 중계한다는 점에서 보다 하는 일의 범위가 넓다고 할 수 있겠죠. 여하튼 하려는 얘기는 이게 아니고-_-;;;

image

컴퓨터 사이의 네트워크도 전화와 비슷한 중계 구조를 가지고 있습니다. 집마다 있는 전화가 전화번호로서 고유하게 식별할 수 있듯이, 네트워크에 연결된 컴퓨터(정확히는 모뎀 또는 랜카드 등의 네트워크 장비)는 고유한 식별 번호를 가집니다. 예를 들면 공유 폴더로 접근할 때 사용하는 윈도의 인트라넷에서는 네트워크 아이디라는 것을 지정하도록 되어 있습니다.(“시스템 등록 정보"의 "네트워크 식별” 탭에서 지정 가능합니다.) 그리고 일반적인 인터넷 연결에 사용하는 TCP/IP 네트워크에서는 바로 IP 주소라는 것을 발급하도록 되어 있죠.

TCP/IP는 인터넷의 가장 기본적인 프로토콜입니다. 프로토콜은 (전에도 한 번 설명했지만) 통신을 위해 정의된 규약입니다. TCP(Transmission Control Protocol)라는 프로토콜과 IP(Internet Protocol)라는 프로토콜이 결합된 것이 TCP/IP로서, 웹(WWW)에 사용되는 HTTP, 원격 컴퓨터 제어를 위한 텔넷(Telnet), 파일 전송을 위한 FTP, 메일에 사용되는 SMTP등이 TCP/IP를 사용하는 프로토콜들입니다. 물론 인터넷 통신을 하기 위해서는 TCP/IP 프로그램이 반드시 필요합니다. 당연히 윈도나 리눅스 등의 거의 모든 OS에는 TCP/IP를 사용하기 위한 프로그램이 기본적으로 깔려 있죠. 보통 IP 주소를 잡기 위해 들어가는 설정 프로그램도 이런 제어 프로그램의 일부입니다.

IP 주소는 현재 IPv4라는 방식이 사용되고 있습니다. “211.255.23.35” 같이 0~255 사이의 수를 4개 붙여서 사용하는 것이 IPv4의 방식입니다. IP 주소는 앞에서 언급했듯이 전화번호같이 네트워크 상에서 특정 컴퓨터(호스트host)를 인식 가능하게 하는 고유한 번호입니다. 따라서 전 세계의 모든 컴퓨터에 IP 주소를 붙여주어야 한다고 하면, 이론상 각 자리마다 256개의 숫자가 들어갈 수 있으므로 256x256x256x256=4,294,967,296, 즉 대략 43억 대의 컴퓨터가 붙을 수 있게 되는 셈이죠.

하지만 복잡한 IP 주소 부여 법칙에 의해 실제로는 이보다 적은 수의 IP 주소만이 사용할 수 있으며, 특히 각 국가마다 할당된 IP 주소의 영역이 제한되어 있기 때문에 IP 주소는 지금도 매우 부족한 상황에 놓여 있죠. 그래서 방화벽으로 구성된 폐쇄적인 네트워크에서는 보안상의 이유와 더불어 사용 가능한 IP 주소를 늘이기 위해 내부에서만 사용할 수 있는 IP를 따로 정의해 쓰기도 하고, 하나의 IP를 여러 대의 컴퓨터가 공유하기도 합니다. 가장 흔한 예가 인터넷 공유기를 사용해 2대 이상의 컴퓨터를 붙여 쓰는 경우인데요, 이 경우에는 공유기가 라우터의 역할을 수행하여 별도의 IP를 각 컴퓨터에 붙여줍니다.

image

라우터는 독립된 네트워크의 시작점이 되는 장비로서 보통 게이트웨이의 역할을 수행합니다. IP주소를 직접 잡아 보신 분들은 아시겠지만 IP주소를 설정하기 위해 IP주소는 물론이고 게이트웨이 주소와 DNS 주소를 넣어줘야 하는데, 그 게이트웨이 주소가 일반적으로 이 라우터의 주소입니다. 게이트웨이와 DNS에 대한 설명은 조금 길어지므로 다음에 다루도록 하겠습니다.

만약 자신의 컴퓨터가 네트워크에 등록되어 있는데 IP 주소를 알아야 하는 경우가 있습니다. 물론 컴퓨터의 설정 정보를 뒤져보면 어딘가에 IP 주소를 정의해 놓은 곳이 있겠죠. 그러나 그 곳을 찾기 귀찮거나 IP를 자동 설정으로 해 놓으신 분들은 TCP/IP 프로그램을 이용하여 쉽게 IP 주소를 알아낼 수 있습니다. 윈도 2000이나 윈도 XP 이상을 사용하시는 분들은 윈도의 커맨드 창에서 “ipconfig"를 입력하시면 관련 정보가 쉽게 나타납니다.(커맨드 창을 띄우시려면 윈도의 시작 ->실행에서 "cmd"를 입력하시면 되죠.) 리눅스 등 유닉스 계열의 OS에서는 일반적으로 /sbin/ifconfig를 실행하시면 관련 정보가 나옵니다.

image

위에 보면 제 컴퓨터의 IP 주소는 10.0.1.3으로 나오는데요, 일반적인 IP 주소는 이런 식으로 발급되지 않습니다. 10.으로 시작하는 IP는 보통 내부에서만 사용 가능한 IP 주소인데요, 저희 집에서 공유기를 사용해 여러 컴퓨터를 연결해 사용하기 때문에 앞에서 얘기한 대로 제 공유기가 임의로 발급해 준 가짜 주소를 얻은 셈이죠. 제 컴퓨터의 진짜 IP 주소는 공유기가 가지고 있으며, 제 공유기에 연결된 컴퓨터는 외부로 접속할 경우 공유기가 갖고 있는 그 IP 주소를 모두 사용하게 됩니다.

IP 주소도 하나의 자원이다 보니 사용하는 사람이 많아질수록 점차 부족 현상이 심각해질 것임이 분명합니다. 만약 지구상의 60억 인구가 한 대씩 네트워크에 연결된 컴퓨터만 갖고 있어도 일찌감치 IP 주소는 동이 날 터이고, 특정한 주인이 없는 컴퓨터들(예컨대 서버들)도 수없이 많이 있을 테니까요. 그래서 IP 주소의 범위를 늘이기 위해 IPv6라는 방식을 도입하려 하고 있습니다. IPv6는 이론적으로 기존의 IPv4보다 65536배 많은 주소를 사용할 수 있기 때문에, 아마도 IP 주소 부족 현상은 해소 가능하다고 할 수 있겠죠. 하지만 집을 지어도지어도 내 집을 가지기가 어려운 것처럼, 왠지 IP 주소 부족 현상이 쉽게 해결될지 의심이 되는 것은…나쁜 성격 탓일까요? ;;;