2016. 7. 22. 11:10 Network

FlatBuffers Guide

https://google.github.io/flatbuffers/


FlatBuffers Documentation


flatbuffers는 효율적인 크로스 플랫폼 직렬화 라이브러리이다.

C++, C#, C, Go, Java, JavaScript, PHP, Python을 지원한다.


이건 원래 구글이 게임 개발과 또다른 성능이 치명적인 프로그램을 위해 만들어졌다.


이것은 아파치 라이센스 v2 기반의 github 오픈소스로써 사용 가능하다.


왜 Flatbuffers를 쓰는가?

  • parsing이나, unpacking 전에도, 직렬화 데이터에 접근 가능하다.

  • 메모리가 효율이 좋고, 빠르다.

  • 유연하다.

  • 경량 코드

  • 강한 타입 처리

  • 편리한 사용

  • 종속성 없는 크로스 플랫폼 코드


https://google.github.io/flatbuffers/flatbuffers_guide_writing_schema.html


writing a schema

C계열 언어 사용자들과 또 다른 언어 사용자들에게 또한 친숙한 스키마 언어 문법으로 작성된다.


// example IDL file

namespace MyGame;

attribute "priority";

enum Color : byte { Red = 1, Green, Blue }

union Any { Monster, Weapon, Pickup }

struct Vec3 {
 x:float;
 y:float;
 z:float;
}

table Monster {
 pos:Vec3;
 mana:short = 150;
 hp:short = 100;
 name:string;
 friendly:bool = false (deprecated, priority: 1);
 inventory:[ubyte];
 color:Color = Blue;
 test:Any;
}

root_type Monster;

(Weapon & Pickup not defined as part of this example)

Tables

테이블은 flatbuffers의 오브젝트를 정의하는 주된 방법이고, 이름과 필드 목록을 가지고 있다.


각 필드는 이름, 타입, 선택 사항으로 기본 값을 가진다.


각 필드의 선택 사항 : 이건 반드시 표현 할 필요는 없다, 그리고 당신은 개별 필드 누락을 선택 할 수 있다.


결과 같이, 당신은 유연하게 데이터의 팽창을 두려워하지 않고, 필드를 추가해도 된다.


이 디자인은 flatbuffers의 메커니즘의 전방위적, 배경적 호환성을 위함 이기도 하다.


Note that:

  • 새 필드는 스키마의 테이블 정의 끝에 추가할 수 있다. 오래된 데이터는 아직 정확히 읽을 수 있고, 그리고 당신은 읽을 때의 기본 값을 줄 수 있다.
    오래된 코드는 단순하게 새 필드를 무시 할 수 있다.
    만일 당신이 유연성을 원한다면, 특정 순서 보장을 원한다면, 수동으로 대입 (protbuf와 매우 유사), id 속성 아래를 봐라.

  • 당신은 최신 스키마로부터 필드를 삭제를 할 수 없다, 그러나 단순하게 당신의 그 곳에 데이터를 기록하는 걸 멈추는 것과 거의 비슷한 효과를 낼 수 있다. 위의 예제를 보면 부가적으로 당신은 그 곳에 deprecated  마크를 할 수 있고,  C++로 생성 되어 있던 접근자들로부터  보호 될 거고, 필드가 더 이상 사용되지 않는 것으로 시행하는 방법이다. (조심해 : 이건 깨질 수 있는 코드야!)

  • 이름이 변경 된 것들과 원래와 같은 때 까지 코드가 깨지는지 확인한다면, 필드 이름과 테이블 이름을 바꿀 수 있어.


밑에 스키마 진화 예제를 확인하자~


Structs

테이블과 유사하고, 오직 현재 비어있는 필드는 선택적이고 (그래서 디폴트 없음 쪽이나), 그리고 필드는 추가하지 못하거나, deprecated일 것이다.

Structs는 오직 수치형 자료나 또 다른 Structs만을 포함 할 수 있다.


단순한 자료형이나, 매우 확정 적으로 영원히 안 바뀔 것들을 만들 때 써라. ( 꽤 분명한 예는 Vec3)


Structs는 table보다 적은 메모리를 사용하고, 빠른 접근도 가능하다. (그것은 항상 그들의 부모 오브젝트에서 in-line되고, 가상 테이블을 사용하지 않는다)


Types

내장 수치 타입

  • 8bit : byte, ubyte, bool

  • 16bit : short, ushort

  • 32bit : int, uint, float

  • 64bit : long, ulong, double


내장 비-수치 타입

  • 다른 타입의 Vector, 계층화 된 벡터는 지원하지 않고, 대신 당신은 테이블안에 내부 벡터로 감쌀 수 있다.

  • string, UTF-8이나 7-bit ASCII로 고정되어 있다. 다른 텍스트 인코딩 또는 일반 바이너리 데이터는 벡터([byte] or [ubyte])로 대체 할 수 있다.

  • 또다른 tables나 structs, enums, unions 참고해라. (밑을 보시오)


필드 타입은 한번 사용되고 나면 바꿀 수 없다, 예외적으로 같은 사이즈 데이터에 reinterpret_cast를 사용하면 원하는 결과를 얻을 수 있다, 예를 들어 현재 사용되고 있던 최상위 비트 값이 없는 경우 uint를 int로 바꿀 수 있다.


https://google.github.io/flatbuffers/md__cpp_usage.html


'Network' 카테고리의 다른 글

FlatBuffers Guide  (0) 2016.07.22
동기화에 대한 간략 정리  (0) 2016.06.30
로직의 네트워크 동기화 처리  (0) 2015.01.28
TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
Posted by 엘키 엘키

댓글을 달아 주세요

동기화 기본

목적

  • 모든 피어가 같은 결과를 얻게 하기 위함.


난제

  • 랜덤값 (시드 동기화)

  • 부동 소수점 실수 오차.


환경 변수

  • 어떠한 변수들을 동기화할것인가를 잘 결정지어야 한다.

  • 애니메이션 시스템에 영향을 주는 요소가, 커맨드 패턴으로 받는 변수 이외의 변수에 영향을 받는다면, 애니메이션 동기화는 불가능하다.

  • 또한 오브젝트간 충돌등의 물리처리가 중요하다면 이 것도 마찬가지로 관리해주어야 한다.

커맨드 패턴 사용

  • 서버가 난수까지 결정해서 주면 좋음.

    • 그럴러면 로직이 서버에 있는게 좋다.

      • 클라이언트는 결정지어진 결과값만 수신받아 표현한다라는 개념으로 가야 한다.

  • 티어간에 커맨드로 동기화를 하기 때문에, 동기화에 영향을 줄 임의 동작이 존재하면 안된다.

동기화 적용 시점

선동작 후보정

  • 액션성을 강조하기에 좋다.

  • 레이턴시가 클 수록 동작이 튄다.

    • A위치로 움직였다가, 서버 응답받고는 뜬금없이 B위치로 워프 하는 등의 동작을 함.

  • 지나치게 레이턴시가 커졌거나, 통신 오류가 발생했을 시에는 피어간 아예 다른 결과를 보게 되기도 한다.

  • 네트웍이 불안정할 수록 부적절하다.

응답 후동작

  • 레이턴시가 크면 클 수록, 느린 반응성으로 보인다.

    • 다만 모든 유저가 같은 결과를 볼 수 있다.

      • 결과를 받게 되는 타이밍은 차이가 날 수 있음. [응답을 받게 되는 시간이 얼마가 걸리냐에 달려있음]

  • 반응이 없을 순 있어도, 잘못된 결과를 보여주진 않는다.

    • 주로 MMORPG가 이렇게 구현되곤한다.


주고 받는 데이터의 형식

이벤트 단위

  • 어떤 동작을 했음을 전달하고, 해당 동작에 대한 동기화를 한다.

    • 커맨드 패턴화하기 딱 좋은 구조.

  • 로직 구현시 같은 Input (이벤트) -> Ouput을 보장하게 만들어야 한다.


상태 기반

  • 현재 어떤 상태가 됐음을 전송한다.

  • 기존 상태 -> 변경된 상태를 보간해야 하고, 보정 로직이 모든 유저가 일치하게 구현해야 하는 이슈가 있다.

동기화 주기

턴 베이스

  • 내부적으로 턴을 구성하는 방식이다.

    • 턴으로 구성된 로직 동기화 주기에 맞춰서, 패킷을 전송하고, 수신받아 이벤트 들을 처리한다.

  • 명확한 지연 허용 범위가 존재한다

    • n턴 이상 수신 받지 못하면, 통신 오류로 판정 가능하다.

  • 반응성에 대한 기준치도 존재해, baseline을 잡고 튜닝하기 좋다.

    • 결국 한 턴의 단위가 시간을 기준으로 하기 때문에 서버에서도 비정상적 일만큼 많은 패킷이나 과도하게 많은 액션을 수행하고 있는지 판별할 수 있는 기준이 되어준다.

    • 초당 처리 가능 패킷 수가 계산 가능한 수치가 되기 때문에, 기준을 잡을 수 있어 서버 당 수용 동접을 결정 짓기 쉬워진다.


패킷 단위

  • 동작마다 실시간 전송한다. nagle 알고리즘을 끄고 바로 바로 전송함으로써, 최대한 빠른 전송을 의도하고, 그만큼 빠른 반응성을 보여주기 위함이다.

  • 패킷은 하나당 패킷 헤더를 차지함으로, 뭉쳐서 보내기보다 패킷양도 큰 단점도 있다.

  • 이벤트 폭발에 취약하다.

    • 과도한 패킷이란걸 검증할 baseline을 잡기 어렵기 때문.

      • 그럼에도, 일정 수치 이상은 baseline을 벗어났다고 판정해 anti-floording 처리 해야 한다.


'Network' 카테고리의 다른 글

FlatBuffers Guide  (0) 2016.07.22
동기화에 대한 간략 정리  (0) 2016.06.30
로직의 네트워크 동기화 처리  (0) 2015.01.28
TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
Posted by 엘키 엘키

댓글을 달아 주세요

실시간 게임이라 하더라도, 내부적으로는 모든 게임의 구성은 턴으로 구성하는 것이 좋다. (실제 초당 n프레임 같은 개념에서 각 프레임은 턴과 같은 개념이기 때문이다.)


이 턴의 동작 주기를 입력, 렌더, 로직 등을 잘 구분지어 처리하는 것이 좋다.

 

예를 들면, 입력은 1초에 5번, 렌더는 1초에 30번, 로직은 1초에 5번 등의 턴 기준을 명확히 정해 쪼개 놓는 것이 좋다.


그래야 네트워크 동기화, AI 구현 등의 처리 규정을 명확히 세울 수 있다.



로직을 1초에 5번으로 규정을 짓는다면, 한턴은 200ms이고, 200ms동안 이루어진 로직의 변화는 묶어서 다른 클라이언트로 전송하고, 내 변화도 묶어두었다가, 다른 유저의 정보를 수신한 다음턴이 돌아올 때 처리하는 식으로 구성하면 된다.


LOL의 경우에도 4단계를 두고 지연 시간에 따라 턴이 어떻게 밀리는가를 표시한다.


위에 언급한 방식으로 구현을 하면, 처리 규정이 명확하므로 지연시간 발생시에 얼마만큼의 늦은 반응성을 보여줄 것인지가 표현 가능하고, 이를 본 사용자가 자신이 겪고 있는 상황에 따라 판단이 가능하다는 장점이 있다.



로직 처리 방식 분류


액션 베이스

- 현재 값 수신.

- 이전 -> 현재 보간.


이벤트 베이스

- 명령에 대해 전달. 새 명령을 수신하거나, 기존 명령을 완수할 때 까지, 기존 명령을 수행함.

 

어떠한 방식을 취하던 크게 상관없으나, 기본적으로 이벤트 베이스를 두는 것이 지연에 대처하기 조금 더 유연한 방식이라고 할 수 있다.


액션 베이스는 보간을 위한 기준값이 있으며, 이를 넘어서서 늦게 도달시에는 그만큼 어색할 수 있고, 지연이 조금이라도 발생한다면 지연 시간 동안 어떤 액션을 취해야 하는지 알 수 없기 때문이다.



이벤트 베이스라고 해도, 지연시간이 일정 시간이 넘어서면 제대로된 반응성을 보장하지 못한다. 하지만, 사용자의 입력이 적용 완료될 때까지의 시간동안 보여줄 이벤트가 존재하기에 상대적으로 여유가 있다.


물론 이벤트 베이스에서도 지속적으로 지연시간이 발생한다면 제대로 된 플레이는 어렵다고 볼 수 있다. (롤 400핑 이상에서의 플레이에서의 반응성은 정상적인 게임 진행이라 보기 어렵다)


그렇지만 이벤트 베이스로 구성되어야 이벤트를 묶거나, 이벤트 적용 과정도 조금 더 매끄럽기 때문에 이벤트 베이스 방식으로 구현하길 권장한다. (상대방의 이벤트 수신 코드와, 내 이벤트 처리 코드 부분을 일체시켜 나의 플레이와 상대방의 플레이를 구분 짓지 않고, 모든 것을 이벤트로 처리하기 쉽게 코드가 작성될 수 있기 때문이다.)



'Network' 카테고리의 다른 글

FlatBuffers Guide  (0) 2016.07.22
동기화에 대한 간략 정리  (0) 2016.06.30
로직의 네트워크 동기화 처리  (0) 2015.01.28
TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
Posted by 엘키 엘키

댓글을 달아 주세요

2013. 3. 22. 23:35 Network

TCP/IP, UDP 주요 포트

▶ TCP/IP 프로토콜에서 사용하는 Port
1) 가장 많이 사용되는 포트 : 0 ~ 1023
2) 예약된 포트 : 1024 ~ 49151
3) 동적, 사설 포트 : 49152 ~ 65535

▶ 가장 많이 사용되는 포트 요약 (0~1023)
키워드
포트번호
포트용도
icmp
8/tcp, 8/udp
0/tcp, 0/udp
Unassigned
ftp-data
20/tcp, 20/udp
File Transfer [Default Data]
ftp
21/tcp, 21/udp
File Transfer [Control]
ssh
22/tcp, 22/udp
SSH Remote Login Protocol
telnet
23/tcp, 23/udp
Telnet
smtp
25/tcp, 25/udp
Simple Mail Transfer
domain
53/tcp, 53/udp
Domain Name Server
whois++
63/tcp, 63/udp
whois++
tftp
69/tcp, 69/udp
Trivial File Transfer
gopher
70/tcp, 70/udp
Gopher
finger
79/tcp, 79/udp
Finger
www
80/tcp, 80/udp
World Wide Web HTTP
pop3
110/tcp, 110/udp
Post Office Protocol - Version 3
ntp
123/tcp, 123/udp
Network Time Protocol
epmap
135/tcp, 135/udp
DCE endpoint resolution
profile
136/tcp, 136/udp
PROFILE Naming System
netbios-ns
137/tcp, 137/udp
NETBIOS Name Service
netbios-dgm
138/tcp, 138/udp
NETBIOS Datagram Service
netbios-ssn
139/tcp, 139/udp
NETBIOS Session Service
imap
143/tcp, 143/udp
Internet Message Access Protocol
snmp
161/tcp, 161/udp
SNMP
namp
167/tcp, 167/udp
NAMP
imap3
220/tcp, 220/udp
Interactive Mail Access Protocol v3
ldap
389/tcp, 389/udp
Lightweight Directory Access Protocol
https
443/tcp, 443/udp
http protocol over TLS/SSL
shell
514/tcp
cmd
syslog
514/udp
syslog
printer
515/tcp, 515/udp
spooler
ftps-data
989/tcp, 989/udp
ftp protocol, data, over TLS/SSL
ftps
990/tcp, 990/udp
ftp protocol, control, over TLS/SSL
telnets
992/tcp, 992/udp
telnet protocol over TLS/SSL
imaps
993/tcp, 993/udp
imap4 protocol over TLS/SSL
pop3s
995/tcp, 995/udp
pop3 protocol over TLS/SSL (was spop3)
▶ 예약된 포트 요약 (1024 ~ 49151)
키워드
포트번호
포트용도
ms-sql-s
1433/tcp, 1433/udp
Microsoft-SQL-Server
ms-sql-m
1434/tcp, 1434/udp
Microsoft-SQL-Monitor
sybase-sqlany
1498/tcp, 1498/udp
Sybase SQL Any
atm-zip-office
1520/tcp, 1520/udp
atm zip office
ncube-lm
1521/tcp, 1521/udp
nCube License Manager
ricardo-lm
1522/tcp, 1522/udp
Ricardo North America License Manager
cichild-lm
1523/tcp, 1523/udp
cichild
ingreslock
1524/tcp, 1524/udp
ingres
orasrv
1525/tcp, 1525/udp
oracle
sybasedbsynch
2439/tcp, 2439/udp
SybaseDBSynch
sybaseanywhere
2638/tcp, 2638/udp
Sybase Anywhere
ms-wbt-server
3389/tcp, 3389/udp
MS WBT Server
http-alt
8080/tcp, 8080/udp
HTTP Alternate (see port 80)

▶ 웜/바이러스 포트로 방화벽에서 차단해야할 포트 요약
포트번호
원래 포트 용도
키워드
69/udp
TFTP
Nachi 웜,
Blaster 웜
80/udp
web server
Nachi 웜
135/tcp, 135/udp
NETBios
Nachi 웜,
Blaster 웜
137/udp
NETBios
Nachi 웜,
Blaster 웜
138/udp
NETBios
Nachi 웜,
Blaster 웜
139/tcp
NETBios
Nachi 웜,
Blaster 웜
443/tcp, 443/udp
HTTPS
Slapper 웜
445/tcp
NETBios
Nachi 웜,
Blaster 웜
514/tcp
SHELL
RPC Backdoor
515/tcp, 515/udp
LPRng
Red 웜
593/tcp
http-rpc-epmap, HTTP RPC Ep Map
Nachi 웜,
Blaster 웜
1008/udp
-
LiOn 웜
1243/tcp
-
ShoolBus Backdoor
1433/tcp, 1433/udp
ms-sql-m, Microsoft-SQL-Monitor
W32.Slammer 웜
1434/tcp, 1434/udp
ms-sql-m, Microsoft-SQL-Monitor
W32.Slammer 웜
3385/tcp
qnxnetman
Net-Worm.Win32.Mytob.dc
4444/tcp
krb524
Blaster 웜,
Welchia 웜
6667/tcp, 6667/udp
ircu 6665-6669/tcp IRCU
Welchia 웜
6668/tcp, 6668/udp
ircu 6665-6669/tcp IRCU
Welchia 웜
6669/tcp, 6669/udp
ircu 6665-6669/tcp IRCU
Welchia 웜
10008/tcp, 10008/udp
-
LiOn 웜
54321/tcp
-
ShoolBus Backdoor
17300/tcp
-
Kuang2 바이러스
30999/tcp
-
Kuang2 바이러스
27374/tcp, 27374/udp
-
SubSeven Backdoor

▶ 메신저 관련
Service
Name
Server
Port
Description
MSN
64.4.130.0/24
207.46.104.0/24
207.46.106.0/24
207.46.107.0/24
207.46.108.0/24
207.46.110.0/24
TCP 1863 ,80
1863접속 시도 후 차단 되면 80 접속 시도
TCP 6891-6900
파일 전송
UDP 6901
음성채팅
UDP1863,5190
Microsoft Network Messenger
Yahoo
216.136.233.152/32
216.136.233.153/32
216.136.175.144/32
216.136.224.143/32
66.163.173.203/32
216.136.233.133/32
216.136.233.148/32
66.163.173.201/32
216.136.224.213/32
TCP 5050,5101
5050 접속 시도 후 차단 되어 있으면Port 계속 변경
TCP 5000-5001
음성채팅
TCP 5100
화상채팅
Nate On
203.226.253.75/32
203.226.253.135/32
203.226.253.82/32
TCP 5004-5010
기본 포트 5004-5010 접속 시도후 차단되어 있으면 Port를 계속 변경
TCP80,83,7003
웹 컨텐츠 및 문자 보내기
Daum
211.233.29.78/32
TCP 8062
SayClub
211.233.47.20/32
AOL
TCP 5190
AOL Instant Messenger Also used by: ICQ
UDP 4000
ICQ_locator
Dreamwize
211.39.128.236/32
211.39.128.184/32
TCP 10000
버디버디
TCP 810
TCP 940
TCP 950
케이친구
TCP 7979
천리안
TCP 1420
TCP4949, 8989
파일 송수신
ICQ
TCP 5190
UIN
TCP 8080
Genile
TCP 10000

▶ P2P 관련
service name
TCP
UDP
소리바다
22322, 22323, 7675
22321, 7674
당나귀
4661, 4662, 4665
8719, 4665, 4672
구루구루
9292, 9293, 8282, 31200
Direct
411-412
411-412
Gnutella
6346, 6347
GoBoogy
5325
Hotline
5497, 5498, 5500, 5501, 5503
KaZaA
1214
Madster
23172, 9922
Maniac
2000, 2222
2010
V-Share
8401-8404
8401-8404
shareshare
6399, 6777
WINMX
6699
6257
엔유
8185, 8184
파일구리
9493
9493
파일피아
8090-8091
iMash
5000
BitTorrent
6881, 6889
Guntella-Morpheus
6346-6347
6346-6347
GuRuGuRu
9292, 8282, 31200
Madster-Aimster
23172, 9922
MiRC
6667, 6665-6670, 7000
Bluster
41170
GoToMyPc
8200
Napster
6600-6699, 4444, 5555, 6666, 7777, 8888, 8875

▶ Game 관련
service name
TCP
UDP
스타크래프트
6112, 1156-1158
6112, 1156-1158

'Network' 카테고리의 다른 글

동기화에 대한 간략 정리  (0) 2016.06.30
로직의 네트워크 동기화 처리  (0) 2015.01.28
TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
FTP 명령어  (0) 2011.02.17
Posted by 엘키 엘키

댓글을 달아 주세요

2011. 2. 17. 17:10 Network

ncftp 사용법

ncftp
http://www.ncftp.com/

1] 리모트서버에서 파일 받아오기

ncftpget -u [아이디] -p [패스워드] [리모트서버주소] . [파일경로]


2] 리모트서버로 파일 올리기

ncftpput -u [아이디] -p [패스워드] [리모트서버주소] [저장디렉토리 경로] [로컬파일명]


3] 서브디렉토포함 전송/받기

ncftpget -R -u [아이디] -p [패스워드] [리모트서버주소] . [디렉토리경로]
ncftpput -R -u [아이디] -p [패스워드] [리모트서버주소] [저장디렉토리경로] [로컬디렉토리명]


[참고사항] - 테스트 결과
ncftpget에서 파일경로는 상대경로로 설정한다.
ncftpput에서 저장디렉토리 경로는 상대경로로 설정한다.

ncftpput에서 -R을 사용할경우 [로컬디렉토리명]뒤에 '/'는 붙이지 않는다.


'Network' 카테고리의 다른 글

로직의 네트워크 동기화 처리  (0) 2015.01.28
TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
FTP 명령어  (0) 2011.02.17
[UDP] 홀 펀칭 (Hole Punching)  (0) 2009.11.19
Posted by 엘키 엘키
 TAG ftp, ncftp

댓글을 달아 주세요

FTP Passive mode

FTP 서버의 Passive 모드는 명령어 연결(Control connection)과 데이터 연결(Data Connection)을 분리해서 접속하는 방식이다.

Active 모드


Active 모드는 클라이언트가 보내중 정보를 기준으로 서버에서 클라이언트의 Data 포트에 접속을 시도한 후 클라이언트의 요청에 따라 데이터를 전송하는 방식이다.
하지만 Ip 공유기등 사설 IP에서 접속을 시도할 경우 클라이언트의 Data 포트가 막힐 가능성이 있기 때문에 500 Illegal PORT command 와 같은 오류를 출력할 수 있다.
즉 명령은 전달이 되었지만 실제적으로 전송을 담당하는 데이터 포트가 막혀서 데이터를 전송 못할 가능성이 있다.

연결 과정
1. FTP 서버 IP xxx.xxx.xxx.xxx 포트 21 번으로 접속
2. FTP 서버의 21 포트 -> 클라이언트 1023(n) 이상의 포트 (서버에서 클라이언트의 Command 포트로 응답)
3. FTP 서버의 20번 포트 -> 클라이언트 n+1 번 포트 (서버에서 클라이언트의 data포트로 접속)
4. FTP 서버의 20번 포트 <- 클라이언트 n+1 번 포트 (클라이언트에서 서버의 data포트로 응답)

사용자 삽입 이미지

*실제로 포트 번호는 정해진것이 아닌 1023포트 이상에서 서버나 클라이언트가 정함

연결 과정에 있어서 클라이언트는 서버에 접속할때 PORT xxx,xxx,xxx,xxx,yy,nn 이런식의 메세지를 전달한다. 여기서 xxx 는 IP Address를 나타내고 포트는 마지막 부분
yy,nn 부분이다 포트번호는 (yy * 256) + nn 으로 결정이 되어 클라이언트의 포트를 서버에알려준다.

Passive 모드


Passive 모드는 데이터 포트와 명령포트 전부 클라이언트에서 서버로 연결을 하는 방식이다. 즉 클라이언트의 공유기의 간섭없이 서버와의 통신이 가능하다.
하지만 클라이언트에서 접속하는 데 있어서 열어둔 포트가 서버의 방화벽에서 막혀 있지 않아야 한다.

연결과정
1. FTP 서버 IP xxx.xxx.xxx.xxx 포트 21번에 접속
2. FTP 서버의 21포트 -> 클라이언트 1023(n) 이상의 포트(서버에서 클라이언트의 Command 포트로 응답)
3. FTP 서버의 Passive 설정된 범위의 포트 -> 클라이언트 n+1 포트(클라이언트에서 접속)
4. FTP 서버의 Passive 설정된 범위의 포트 -> 클라이언트 n+1 포트(클라이언트에서의 데이터 전송)

사용자 삽입 이미지

포트의 범위는 서버의 서비스에 간섭이 없는 범위내에서 적당히 설정한다. 여기서 적당히는 클라이언트의 접속량에 따라 다르다. 또 웹 서비스의 경우 8080포트 등으로 운영이 될 수 있고
또 IRC 나 기타 서비스의 간섭이 없는 범위내에서 포트를 설정해야 한다. 보통 1000~2000 사이의 범위를 정해서 포트를 열어둔다.

'Network' 카테고리의 다른 글

TCP/IP, UDP 주요 포트  (0) 2013.03.22
ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
FTP 명령어  (0) 2011.02.17
[UDP] 홀 펀칭 (Hole Punching)  (0) 2009.11.19
[UDP] Reliable UDP  (0) 2009.11.06
Posted by 엘키 엘키

댓글을 달아 주세요

2011. 2. 17. 12:11 Network

FTP 명령어

1. FTP 서버에 접속하기
○ 방법 1 : ftp (도메인 네임) 혹은 (IP)를 입력한다.
Ex) ftp ftp1.netscape.com
○ 방법 2 : ftp 후에 프롬프트가 “ftp>”로 뜨면 “open (도메인 네임) 혹은 (IP주소)”
를 입력한다.
Ex) open ftp1.netscape.com
○ 프롬프트가 “ftp>”인 상태에서 여러 가지 명령을 입력할 수 있다.

2. 디렉토리(Directory) 보기와 바꾸기
○ FTP 서버에서 자료는 디렉토리 구조에 따라서 정리되어 있다. 따라서 사용자의
컴퓨터에서처럼 디렉토리의 내용을 보거나 원하는 디렉토리로 바꾸는 등의 작업이
필요하다. 이 작업들은 “ftp>” 프롬프트 상태에서 “ls”명령어로 확인하고, ”cd” 명령
어를 사용하여 바꿀 수 있다.
○ ls : list라는 의미로 FTP서버의 디렉토리 구조를 보여 준다.
Ex) ls -al (list all)
○ cd (디렉토리) : Change Directory의 약자로 원하는 디렉토리로 이동한다.
Ex) cd hnc

3. 전송 모드
○ FTP에는 아스키(ASCII)와 이진(Binary)라는 두 가지 전송 모드가 있다.
○ ASCII : 일반적인 텍스트 문서 전송
○ BINARY : 그림이나 실행파일 등 모든 형식 파일 지원
○ 모드 전환
: ascii : ASCII 전송 모드로 바뀜
: bin : 이진 모드로 바뀜. 일반적으로 이진 모드를 사용하는 것이 편리하다.

4. 파일 받기
파일 받기 명령은 get과 mget이 있다.
○ get 파일명 Ex) get test.doc
: 파일이름으로 지정된 파일을 전송 받으므로 정확한 이름(Full Name)을 저정한다.
○ mget 파일명 Ex) mget *.doc
: Multiple get의 뜻을 가지고 있으며 여러 개의 파일을 동시에 전송받을 때 사용한
다.
명령어. 파일이름 부분에서는 ‘*’, ’?’과 같은 만능문자(Wild Card)도 사용할 수 있
다.

5. 파일 보내기
○ 파일을 보내는 경우에는 받는 경우와 달리 계정이 필요한 경우가 많다. 일반적
으로 anonymous 계정은 특정한 디렉토리를 제외하고는 쓸 수가 없으며 이는 바이
러스 등의 침입을 막기위한 것이다. 파일을 전송할 때에는 put과 mput명령어를 사
용한다.
○ put 파일명 Ex) put test.doc
: 파일이름으로 지정된 파일을 전송하므로 정확한 이름(Full Name)을 입력한다.
< mput 파일명 Ex) mput *.doc
: Multipe put의 뜻을 가지고 있으며 여러 개의 파일을 동시에 전송할 때 사용하는
명령어이다. Mget처럼 파일이름 부분에서 ‘*’,’?’ 과 같은 만능문자 사용도 가능하
다.

6.도스 FTP명령어
○ ftp cim ⇒ k8317610 ⇒ 4751 ⇒ ftp> ⇒ ls -l ⇒ bin, asc ⇒ get 가져오기 ⇒
hash(파일전송 보여주기) ⇒ !dir a:( a드라이브 보기) ⇒ put a:money.html

--------------------------------------------------------------------------
quote : ftp 고유 명령어를 입력하기 위한 전치어
--------------------------------------------------------------------------
open(주소 또는 도메인) → ftp 서버에 연결
close : 해당ftp 접속종료
bye : ftp 프로그램 종료
ls : list, 목록보기
cd(디렉토리명) → 디렉토리 바꾸기
ascii : 텍스트 파일 전송모드 (자료를 내려받거나 올리기 이전에 작동시켜야 한다)
bin : 이진파일 전송 모드 (자료를 내려받거나 올리기 이전에 작동시켜야 한다)
get 파일명 : 하나의 파일 내려받기
mget 파일명 : 여러 개의 파일 내려받기, wildcard 문자 사용가능
put 파일명 : 하나의 파일 올리기
mput 파일명 : 여러 개의 파일 올리기, wildcard 문자 사용가능
pwd : 현재 경로보기
hash : 파일전송과정 보여주기(버터단위 ‘#” 표시 되며 자료올리거나 받기전에 명
령어를 줘야 한다)
? : 도움말
rstatus : remote 시스템의 상황 표시
status : 현재 연결된 ftp 세션 가지 모드에 대한 설정을 보여준다
dir : remote 시스템의 디렉토리 내용을 디스플레이
--------------------------------------------------------------------------

ftp> quit or bye or close
:ftp를 종료시킨다

ftp> get
:다른 사이트에 있는 파일을 현재 로그인된 ftp 사이트로 복사
Ex) ftp> get 다른사이트의파일명 현재사이트로복사될파일명
ps) → ftp>reget remote_file [local_file] local 디렉토리에 같은 이름의 파일이 있
으면 부분적으로 전송된 파일로 간주되어 이어받기

ftp>put
: 현재 로그인된 ftp 사이트의 파일을 다른 ftp사이트로 복사할 때

ftp>cd
: 상대방 사이트의 디렉토리를 이동시킬 때
Ex) ftp>cd 상대방사이트의 절대경로명이나 상대의 패스

ftp>lcd
: ftp하에서 현재로그인한 디렉토리를 이동시킬 때 사용
Ex)lcd 현재사이트의 절대경로명이나 상대경로명

ftp>type
: 파일을 전송하기전 전송하는 데이터의 단위를 선택하는 것으로 binary
와 문자(ASCII) 두 가지 방법으로 나뉜다. Binary일 경우는 전송단위가 2진법으로
실행파일이나 압축파일의 경우 사용되고 보통문자일경우는 ASCII로 전송한다
Ex) ftp>type binary , ftp>type ascii

ftp>mget
: 상대방 ftp 사이트에 있는 특정 디렉토리에서 여러 개의 파일을 동시에 가져오고
자 할 때 사용하는 것으로 파일명을 하나하나 입력할 필요가 없을 때 사용. 파일의
전송중 user에게 전송여부 확인메세지가 나타나는데 y 또는 n(no)를 응답
Ex) ftp>mget parameter
parametet -> 메타문자(혹은 wildcard문자)를 사용한 파일명으로 이들 문자는 특
정 문자열이 공통으로 들어갈 부분만 명시하고 나머지는 아스티링(astrik)를 처리함
으로써 같은 문자열을 찾아내기 위한 방법으로 사용한다. 즉 파일명이 cest, test1,
est, testtest, esttt는 *est*로 표시될수 있다.

ftp>mput
: mget의 반대로 현재의 로그인된 사이트에서 다른 사이트로 파일을 전송하고자 할
때 메타문자를 이용하여 여러 개의 파일을 전송할 수있다. 파일의 전송중 사용자에
게 전송여부를 확인하는 메시지가 나타나는데 전송여부에 따라 y 또는 n으로 응답
Ex) ftp>mput parameter
parameter -> 메타문자(wildcard문자)를 사용한 파일명

ftp>prompt
: 앞의 mget나 mput는 사용자로하여금 전송여부를 시스템이 확인하는데 이때 대량
의 파일을 주고받을 때 사용자는 일일이 이를 y나 n로 응답하는 불편함이 있다. 응
답을 주지않고 무조건 실행하려할 때 쓰이는 명령어
Ex) ftp>prompt parameter
parameter -> y일 경우는 응답에 따라 실행하라는 의미, n 일 경우 무조건 실행하라
는 뜻. 본래 prompt는 y 값을 가진다. ?pr 이라고 해도 됨

ftp>ls
: 현재 디렉토리의 파일 확인
Ex)ftp>ls parameter
parameter 에 ?l 을 주면 각 파일에 대해 파일명과 함께 부수적인 정보를 나열
parameter에 ?al을 주면 파일인지 디렉토리 인지의 여부 및 파일의 제반특성, 크기
등을 보여준다

ftp>pwd
: 현재 위치를 알아보는 명령어

ftp>mkdir
: 특정 디렉토리를 만드는 명령어, Ex) mkdir 디렉토리명

ftp>rmdir
: 특정 디렉토리를 제거하는 명령어, Ex)rmdir 디렉토리명

ftp>verbose -> ver 라고도 함
: ftp명령어 수행중 전송중에 발생하는 정보를 화면에
보여줄 것인지에 대한 여부를 결정하는 명령어(시간과 파일사이즈)
Ex) ftp>verbose parameter
parameter -> on 또는 off 로 on일 경우에 화면에 보여주고 off일 경우는
보여주지 않는다.

ftp> delete
: 파일을 지우는 명령어, ftp>delete 파일명

ftp>user
: 현재 ftp 사이트에서 다른 사용자명으로 전환하고자 할 때 사용. 동일 사이트의 다
른 계정으로 옮기고자 할 때 사용
Ex) ftp>user parameter
parameter -> 현재 사이트의 다른 계정의 사용자명

ftp>open
: 일반사용자가 ftp 명령어를 입력하고 return키를 누른다음 ftp>라는 프롬프트에서
도 연결시키는 경우가 있을수 있는데 이때 open 이라는 명령어를 사용
Ex) ftp>open parameter
parameter -> 호스트명, 호스트명.도메인명, IP Address

ftp> close
: 현재사이트 연결끊고 다른사이트로 연결

ftp>rename
: ftp로 특정 사이트를 연결시킨 후, 사용자가 현재사이트에있는 파일명을 바꿀 때
사용
Ex)rename 현재파일명 바꾼후의파일명

'Network' 카테고리의 다른 글

ncftp 사용법  (0) 2011.02.17
FTP Passive / Active 모드  (0) 2011.02.17
FTP 명령어  (0) 2011.02.17
[UDP] 홀 펀칭 (Hole Punching)  (0) 2009.11.19
[UDP] Reliable UDP  (0) 2009.11.06
서버 테스트 방법  (0) 2008.04.25
Posted by 엘키 엘키
 TAG ftp

댓글을 달아 주세요

홀 펀칭 (Hole Punching)
- 정확한 명칭은 STUN (Simple Traversal of User Datagram Protocol Through Network Address Translators)
 
공유기라는 녀석이 라우터의 특성도 함께 가지고 있어 Routing Table 을 작성하기 위해 P2P 통신을 목적으로,
사전에 상대방과 패킷을 주고받고 하여 각자의 공유기에 Routing Table 을 작성하는 것을 [홀 펀칭]이라고 한다.
 
Full Cone NAT
내부에 있는 호스트들의 모든 요청은, 모두 같은 외부 ip, port 로 맵핑된다.
더군다나 어떤 외부 호스트든 공인 IP가 맵핑된 패킷 보내기에 의해 내부 호스트로 패킷을 보낸다.
 
Restricted Cone
목적지의 주소에 따라 NAT에 맵핑되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP만 동일시하여 뚫어주면 목적지의 패킷을 받을 수 있다.
 
Port Restricted Cone
목적지의 주소에 따라 NAT에 맵핑되는 포트가 달라진다.
홀 펀칭을 위해서는 목적지의 IP포트를 동일시하여 뚫어주어야만 목적지의 패킷을 받을 수 있다.
 
Symmetric Cone
목적지의 주소와 포트에 따라 NAT에 맵핑되는 포트가 달라진다.
 
P2P로의 1:1 연결에서는 적어도 한 쪽이 Symmetric Cone NAT 가 아니거나 공인 아이피를 소유하고 있는 Peer 여야 한다.
 

홀펀칭 방식은 아래와 같다.
 
1. Full cone
-> PC에서 UDP 데이터를 공유기 밖으로 보낼 때 해당 PC의 IP와 포트 정보를 공유기가 기억하고 공유기의 포트와 맵핑을 해줌.
공유기의 해당 포트로 데이터가 오면 출발지 IP와 포트 정보를 상관하지 않고 해당 PC에 포워딩을 해줌.
 
2. Restricted Cone
-> PC에서 UDP 데이터를 공유기 밖으로 보낼 때 해당 PC의 IP와 포트 정보, 목적지 IP를 기억하고 공유기의 포트와 맵핑을 해줌.
공유기의 해당 포트로 데이터가 오면 출발지 IP정보를 비교하여 공유기에 기록된 목적지 IP와 같으면 해당 PC에 포워딩을 해줌.
 
3. Port Restricted Cone
-> PC에서 UDP 데이터를 공유기 밖으로 보낼 때 해당 PC의 IP와 포트 정보, 목적지 IP, Port 를 기억하고 공유기의 포트와 맵핑을 해줌.
공유기의 해당 포트로 데이터가 오면 출발지 IP 정보를 비교하여 공유기에 기록된 목적지 IP, Port 가 같으면 해당 PC에 포워딩을 해줌.
 
4. Symmetric NAT
-> PC에서 UDP 데이터를 공유기 밖으로 보낼 때 해당 PC의 IP와 포트 정보, 목적지 IP, Port 를 기억하고 공유기의 포트와 맵핑을 해줌.
만약 목적지 IP나 Port 번호가 바뀌면 새로운 포트로 맵핑해줌.
공유기의 해당 포트로 데이터가 오면 출발지 IP 정보를 비교하여 공유기에 기록된 목적지 IP, Port 가 같으면 해당 PC에 포워딩을 해줌.

구현 방법 
UDP 서버 (랑데뷰 피어)로 클라이언트가 UDP 패킷을 전송.
서버에 클라이언트의 IP와 Port 정보가 남는다.
이 정보를 바탕으로 현재 서버에 연결된 소켓에 접속할 IP와 포트 정보만 상대방 IP와 포트 정보를 넣고 상호간에 데이터 전송 시도하면,
Cone 방식은 UDP 홀펀칭이 성공한다.
 
간혹 Symmetric NAT 방식의 공유기가 있는데,
이 공유기 같은 경우에는 같은 소켓을 써도 UDP 데이터를 외부로 쏠 때, 목적지 IP나 포트 정보가 변경되면 공유기에서는 새로운 포트를 할당해 준다.
고로 나가는 것은 되나 들어오는 것이 안 됨.
한 쪽이 Symmetric NAT 방식이라면 상관 없는데 양쪽이 Symmetric NAT 방식이라면 낭패다.
UDP 릴레이 서버를 거치던지 다른 방법을 써야한다.
 
한쪽이 Symmetric NAT 방식이라면 반대쪽에서는 Symmetric NAT 쪽의 데이터를 받을 수 있다.
이 데이터를 받을 때 IP 와 포트 번호를 알아낼 수 있다.
알아낸 IP 와 포트 번호로 데이터 전송하면 됨.

'Network' 카테고리의 다른 글

FTP Passive / Active 모드  (0) 2011.02.17
FTP 명령어  (0) 2011.02.17
[UDP] 홀 펀칭 (Hole Punching)  (0) 2009.11.19
[UDP] Reliable UDP  (0) 2009.11.06
서버 테스트 방법  (0) 2008.04.25
TCPView  (1) 2008.02.26
Posted by 엘키 엘키

댓글을 달아 주세요

이전버튼 1 2 3 이전버튼

블로그 이미지
Software Engineer
엘키

공지사항

Yesterday31
Today27
Total1,605,481

달력

 « |  » 2020.8
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

글 보관함