학습자료/tools 2013. 4. 17. 15:40

 

m/s one Note를 쓰다가

 

펜으로 작성한 노트를 블로그로 포팅도 할수 있다는 것을 알게되었다.

그 외에도 word, pdf, html? 등 여러가지 포맷으로 포팅가능하다.

 

하는 방법은 아래 링크를 따라서..

 

1. 티스토리 api 설정 : http://blog.kinesis.kr/38

2. 네이버 블로그 api 설정 : http://onnuri114.blog.me/70151436747

3. m/s word에서 블로그로 포팅하기 : http://notice.tistory.com/114

 

 

[결과]


 

  • m/s one note에 적은 내용

 

 

  • 위 내용을 블로그로 포팅 한 내용

manual

작성 임해야해

쟈성국해야애

   

test page.

window of platform.

 

잘돼는군요..

 

 

 

 


글씨 인식률이 좋군요. 

대단한 마이크로 소프트. 조금만 더 가다듬으면 note쪽에선 에버노트, 네이버 노트, 삼성 s노트 중에서 가장 좋을듯.

개인적으론 지금도 가장 좋은것 같음.

posted by cozyboy
:
학습자료/리눅스 2013. 4. 15. 19:59
  • dd란?

dd 커맨드의 설명은 다음과 같다.

 

dd copies a file (from standard input to standard output, by default) with a changeable I/O block size, while optionally performing conversions on it

dd는 가변적인 I/O block size의(디폴트로는 표준입력부터 표준출력까지) 파일의 변환을 수행하는 동안 카피한다.

 

 

  • 디스크 속도 측정하기 (or  Disk IO 부하주기)

예)

dd if=/dev/zero of=/disk1/t1 bs=65536 count=2000 oflag=direct
while true;do sudo dd if=/dev/zero of=testfile bs=10M count=100;done

결과)

2000+0 records in

2000+0 records out

131072000 byte (131 MB) copied, 0.658386 s, 199 MB/s

원래는 카피용으로 쓰는 커맨드인데, 카피 시간과 속도가 함께나와 디스크 속도 측정으로도 많이 쓰는것 같다.

 

초당 199 MB를 읽고 쓸수 있다.  설명은 아래 옵션 설명 이용.

 

  • 옵션 설명

if=file  : 표준입력 대신에 지정한 file을 입력 대상으로 한다.

of=file : 표준출력 대신에 지정한 file을 출력 대상으로 한다.

bs=byte : 한번에 bytes 씩 읽고 쓴다.  (ibs, obs 값 무시)

count=blocks : 출력 시작에서 bolcks 단위 만큼 ibs 크기를 건너띈다.

oflag=flag : 표준출력 파일에 사용되는  flag 옵션

(flag가 direct 시, output 파일에 buffer cache를 사용하지 않고 다이랙트로 I/O를 한다)

 

direct flag 옵션 원문

Use direct I/O for data, avoiding the buffer cache. Note that the kernel may impose restrictions on read or write buffer sizes. For example, with an ext4 destination file system and a linux-based kernel, using ‘oflag=direct’ will cause writes to fail with EINVAL if the output buffer size is not a multiple of 512.

 

 

 

 

  • 간단 추가 설명

ibs=bytes : 한번에 bytes 바이트씩 읽는다.

obs=bytes : 한번에 bytes 바이트씩 쓴다.

bs=bytes : 한번에 bytes 바이트씩 읽고 쓴다.

cbs=bytes : 한번에 bytes 바이트씩 변환한다.

 

위와같이 옵션에 따라 다양하게 결과값을 낼수 있다.



  • disk io 부하주기
dd if=/dev/zero of=testfile bs=1M

 


 

  • 참고 내용 :

1. 옵션 별 설명 : http://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html

 

2. man 페이지 보셔도 나옴니다.

 

 

 * (심심하면, )dd & hdparm 사용법 설명 : http://zzara.tistory.com/12



 

 

 

 

 

posted by cozyboy
:
학습자료/리눅스 2013. 4. 12. 16:36

~/.bash_profile를 열면 아래와 같은 것이 써있을 것이다.

PATH=$PATH:$HOME/bin

 

 

  • path 등록

PATH에 필요폴더를 추가 하면 굳이 해당폴더 이동필요 없이,

tab으로 그위치의 파일에 접근할 수있다.

PATH=$PATH:$HOME/bin:[원하는 폴더 위치] 

 

  • 적용

source ~/.bash_profile

 

 

 

'학습자료 > 리눅스' 카테고리의 다른 글

[linux] xfs 간단 설명, 장단점, 사용하기  (0) 2013.04.22
[linux] disk 속도 측정(dd)  (0) 2013.04.15
extend a partition  (0) 2013.02.01
rpm 명령어  (0) 2013.02.01
[리눅스] /proc 파일 시스템 - 링크  (0) 2012.11.13
posted by cozyboy
:
학습자료/tools 2013. 4. 11. 10:24

http://www.eclipse.org/cdt/downloads.php 에서 자신의 버전에 맞는 cdt 주소를 찾아야 한다.

juno는 다음과 같은 url이다.

http://download.eclipse.org/tools/cdt/releases/juno

posted by cozyboy
:
학습자료/tools 2013. 4. 10. 09:32
  • redmine 활용

redmine은 ALM, 프로젝트 관리, 품질관리 등을 통합적으로 하는 툴이다.

CI라고도 하며 형상관리라고도 한다.

플러그인 형태로 기능을 추가 할수 있다.

 

웹에서 svn, 프로젝트 일정관리, 일감관리, 이슈관리, 소스검증(동적/정적) 등.. 을 할수 있다.

 

 


 

  • 설치 환경

OS : fedora 16 64bit (developer용 설치), virual box 가상운영

redmine : 2.3 (최신)

 


 

 

페도라는 centos와 달리 리눅스의 실험적인 것들이 많이 들어가서, 사용법 정리가 안되있는것이 많다.

 

1.x 버전과 2.x 버전은 설치 시 조금씩 다른점이 있다.

대부분 1.x 버전의 정리가 대부분이라, 에러와 이슈트래커를 찾으며 정리 함.

 

중간에 몇개 빠뜨리고 안적었을수도 있음.

 

 


  • 설치법 간단 정리

 

1. yum install ruby
2. yum install rubygems
3. yum install ruby-devel
4. gem install rails

5. redmine 다운
http://rubyforge.org/frs/?group_id=1850


 

6. mysql  설정

yum install mysql-devel
gem install mysql

 

CREATE DATABASE redmine CHARACTER SET utf8;GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY 'passwordf'

 

7. redmine config 설정(아래부터 redmine 설치 폴더에서 실행)

mv config/database.yml.example config/database.yml

 

vim production (설정 변경)


production:  adapter: mysql  database: redmine  host: localhost  username: redmine  password: password

 

8. redmine 필요 패키지 다운


bundle install    (루비의 연관패키지 다운)

yum install php-gd glib glib2 libpng libjpeg libtiff ghostscript freetype   (ImageMagick을 yum으로 받으려면 이것들이 전부 설치되어야 한다)

 
yum install ImageMagick ImageMagick-devel

gem install rmagick             (devel까지 설치하지 않으면 에러)
bundle install   

 

   ☞ 여기까지 bundle install 할때, 에러가 없어야 한다. 만약 부족한 부분이 더 있다면 완료해야 레드마인을 실행할 수 있다.

 

 

9. 관리자 계정생성

rake generate_secret_token
rake db:migrate RAILS_ENV=production

 

10. 언어 설정
rake redmine:load_default_data RAILS_ENV=production
ko

 

11. 아파치 웹서버의 쓰기 권한이 가능하도록 권한 설정

chmod -R 755 files log tmp public/plugin_assets

 

12. 실행

ruby script/rails server webrick -e production

 

13. 접속 (default port == 3000)

localhost:3000

posted by cozyboy
:
학습자료/tools 2013. 4. 9. 10:54

c, c++, java, script? 각종언어에 대해 함수 연관도를 그려준다.

javadoc 처럼 document도 나온다.

흠. 한마디로 소스 분석툴.

 

 

모듈 연관도 그림을 그릴필요가 있을때, doxygen을 사용하면 편하게 작성할수 있다.

 

  • 설치

yum install doxygen

yum install graphviz    -> 연관도 등 그래픽 관련 내용을 보고 싶으면 깔아야 함.

yum install doxygen-doxywizard  -> doxygen gui 유틸

 

 

 

  • 실행(간단하게만 정리)

doxywizard

 

 1. 프로젝트(이름, 문서화 할 코드 폴더, 결과물 남길 폴더 설정)

 

2. 문서 추출방식, 언어 선택

 

3. 출력 문서 형식 설정(LaTeX는 off 해도 됨)

 

4. 아까 설치한 GraphViz를 사용(함수간 관계를 그래프로 보기위해)

 

5. doxy 문서 만들기(Run doxygen 클릭후, show HTML output 선택)

 

6. 모듈 관계도

 

위와 같은 내용 외에도

javadoc 처럼 각 함수에 대해 문서가 나온다.

 

직접 소스보기도 가능하며, struct 구조같은 내용도 나온다.

 

 

 

 

posted by cozyboy
:
학습자료/Java 2013. 3. 19. 17:26

OS : 리눅스

IDE: 이클립스


  • 에러 이유

자바 라이브러리(.jar)를 추가하였는데도 java.library.path 에러가 난다.

이유는 내가 추가한 external 자바 라이브러리가 네이티브 라이브러리를 사용하기 때문이다.


예를 들면, 자바 라이브러리가 윈도우에서는 .dll 파일을 이용하는것이고, 리눅스에서는 .so 를 내부적으로 사용한다.



  • 해결방법

방법1. 이클립스에서

LD_LIBRARY_PATH 에 네이티브 라이브러리 경로를 추가해야 한다.


프로젝트 좌클릭 -> Run as -> Run Configuration -> Enviroment TAB
에서


Name과 value에 LD_LIBRARY_PATH, /usr/local/lib(네이티브라이브러리가 존재하는 경로) 를 추가해 주면 된다.



방법2. 리눅스에서

  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib


위와 같이 리눅스상에 경로를 등록하여도 이클립스는 못알아 먹는다..

그래서 방법 1로 해결.


posted by cozyboy
:
학습자료/tools 2013. 2. 27. 17:46

1. 마켓에서 maven plugin install


2. 프로젝트를 Maven project로 변경


3. pom.xml을 작성

README나 사이트에 보면 pom.xml에 추가하라는 부분이 있다. 그것을 pom.xml에 추가하면 


4. 결과 (필요한 jar파일들이 주르르르륵. )


5. messagepack-RPC for java  Quick Start  :

http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+Java#QuickStartforJava-MessagePackRPCforJava


예제소스를 돌려보면 추르르륵~



'학습자료 > tools' 카테고리의 다른 글

[tolls]redmine 2.x (fedora 16) 설치법  (0) 2013.04.10
doxygen linux(소스 분석 툴)  (0) 2013.04.09
Amazon Simple Storage Service(Amazon S3) 사용  (0) 2013.02.18
rrdtool  (0) 2012.10.31
[tools]Nagios 설치(모니터링)  (2) 2012.10.17
posted by cozyboy
:
학습자료/네트워크 2013. 2. 27. 14:55

디스크 <-> 커널 메모리 <-> 유저 메모리 <-> NIC 사이에는 많은 데이타 copy와 context switching(커널 <-> 유저)이 발생한다. 이러한 문제를 해결하고자 나온것이 바로 zero-copy 개념이며, zero-copy를 구현한 것이 바로 sendfile() 이라는 함수라고 할 수 있겠다.

그렇다면 얼마나 많은 copy와 context switching이 발생하길래...zero-copy라는 개념이 등장했는지...

example 1) file에서 data를 read하고, network세상으로 write하는 과정을 아래에서 확인해 보자.

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

( Zero Copy I: User-Mode Perspective By Dragan Stancevic 에서 가져옴 )

4번의 context switching이 발생하고, 4번의 data copy(디스크->커널메모리->유저메모리->커널메모리->NIC)가 발생한다.

그렇다면, zero-copy를 구현해놨다는 sendfile()을 호출할 경우에는 몇번의 context switching과 copy가 발생할까?

example 2) file에서 data를 read하고, network세상으로 write하는 과정을 아래에서 확인해 보자.

sendfile(socket, file, len);


( Zero Copy I: User-Mode Perspective By Dragan Stancevic 에서 가져옴 )

2번의 context switching과 2번의 data copy(디스크->커널메모리->NIC)가 발생함을 확인할 수 있다.

단, zero-copy를 사용하기 위해서는 NIC에 특별한 하드웨어 기능(scatter-gather DMA)이 지원되어야만 동작할 수 있다는 것을 기억하도록 하자.

이외에 "Zero Copy I: User-Mode Perspective By Dragan Stancevic"의 글에서는 mmap을 이용하여 context switching과 data copy의 횟수를 줄이는 방법도 소개하고있다. (시그널 처리에 대한 것도 눈여겨 보고 기억해두어야 할 것!!)

zero-copy에 대해서 짧게 정리해 보았다. 개인적으로 나와 같은 개발자는 이정도만 알아 두어도 어디가서 창피당하지는 않을듯하다..^^

그렇다면 모 회사에 면접을 보러갔을때 나의 상황에 맞추어 다시 한번 생각해보면...

기본적으로 zero-copy는 file - to - file 또는 file - to - socket 사이의 data 전송을 위해 만들어 졌으므로 내가 개발했던 게이트웨이 데몬 처럼 socket - to - socket 사이의 data 전송을 주로 사용하는 환경에서 zero-copy기능은 의미가 없을것으로 판단된다.

고로 면접관의 생각 역시 오류가 있었다고 판단된다.

그렇다면 나의 답변은...

나는 커널레벨에서 데몬을 작성하여 read 또는 write 할 경우 유저 레벨에서 동작하는 데몬보다는 copy가 덜 발생 할 것이라고 생각했다.

즉, socket buffer <-> 커널 메모리 ("123456789" 라는 data를 socket buffer에서 -> 커널로 read)

그러나 유저 레벨에서는 socket buffer <-> 커널 메모리 <-> 유저 메모리("123456789"라는 data를 socket buffer에서 -> 커널로 , 그리고 다시 유저로)

하지만... 커널에서 역시 read 또는 write를 호출하며, 유저에서 호출하는 read 또는 write와 동일한 것으로(유저의 read를 추적해 보면 마지막에는 결국 커널에서 호출하는 read와 동일 함)보이며,

이것은 read하여 data를 저장하는 영역(유저 메모리 공간인지 커널 메모리 공간인지의 차이) 차이만이 두개 사이에 존재(커널데몬<->유저데몬)할 지도 모른다는 생각이며, 성능향상은 매우 적을 것(오히려 더 안좋아 질 수도 있다는..)이라고 판단 된다.

T-T 추측성 발언....

PS: 위 사진과 내용은 http://www.linuxjournal.com/article/6345에서 가져왔음을 다시 한번 알려드립니다.

 


무복사 기법을 통한 효율적인 데이터 전송 -

http://www.ibm.com/developerworks/kr/library/j-zerocopy/index.html

 

자바(java)와 리눅스(linux)의 zero copy 기법 - http://knight76.tistory.com/1417

'학습자료 > 네트워크' 카테고리의 다른 글

vlan 설정(ubuntu)  (0) 2013.11.06
MTU, MSS [펌]  (0) 2013.06.17
netstat 명령어 사용법 - 펌  (0) 2013.02.13
zero configuration networking  (1) 2013.02.12
네트워크 클래스 서브넷 마스크  (0) 2012.01.17
posted by cozyboy
:
학습자료/Java 2013. 2. 27. 13:26

messagePack - JSON,  BSON, Thrift, Protocol Buffer와 같이 데이터 형태이다. 클래스나 데이터를 시리얼라이재이션(직렬화) 하는 라이브러리로 사용되는데 그곳에서 rpc도 구현해둔게 있다.


RPC (remote procedure call) : 원격 프로시져 콜 이란..

간단하게 말해서 클라이언트에서 서버쪽 함수를 로컬에서 실행시킨다. 아니 시키는 것처럼 동작되는 것이다.

 

msgpack에서 제공하는 rpc구현언어는 c++, ruby, java, phython, php ... 등 여러가지가 존재한다.

 

라이브러리를 보면 자바 네트워크프레임워크 중 netty를 사용한다.

 

quick start의 예제 소스를보면 이해하기 쉬움.


[Web Site] (http://msgpack.org/)

[Wiki](http://wiki.msgpack.org/display/MSGPACK/Home)
[Sources](https://github.com/msgpack)
[Issues](http://jira.msgpack.org/browse/MSGPACK)


1. messagepack wiki home :

http://wiki.msgpack.org/display/MSGPACK/Home

 

2 . msgpack-rpc 저장소 :

https://github.com/msgpack/msgpack-rpc

 

3. messagepack-RPC for java  Quick Start  :

http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+Java#QuickStartforJava-MessagePackRPCforJava


msgpack -java 저장소

https://github.com/msgpack/msgpack-java

 



 

posted by cozyboy
:
학습자료/Java 2013. 2. 26. 17:40

그냥 마켓에서 jadclipse 써도 나온다.


jadClipse 주소

http://sourceforge.net/projects/jadclipse/



설치는 아래 방법으로 했으나 마켓으로 해도 걍 되지 않을까..


 

1. 첨부파일 다운 받습니다

2. eclipse 가 있는 폴더안에 plugins 폴더안에 net.sf.jadclipse_3.3.0.jar파일 삽입

3. 이클립스 재시작

4. Window > Preferences > Java > JadClipse 에서 Path to decompiler 항목은 첨부파일을 받은 jad.exe 로 path를 잡아준다

ex) F:\springsource\sts-3.1.0.RELEASE\util\jad\jad.exe

Directory for temporay files 는 적당한 위치에 잡아준다

ex) F:\springsource\sts-3.1.0.RELEASE\util\.net.sf.jadclipse

5. Window > Preferences > Java > JadClipse > Mise 에서 Convert Unicode strings into ANSI strings 체크(한글깨짐방지)

6. Window > Preferences > General > Editors > File Associations 에서 *.class , *.class without source 두개다 default를 JadClipse Class File Viewer로 선택 후 ok 완료


 

http://blog.naver.com/youzang7/70152882826

posted by cozyboy
:
학습자료/Java 2013. 2. 26. 16:54

이희승 | Twitter 소프트웨어 엔지니어가 2012 deview에서 한 내용인듯.

http://deview.kr/2012/xe/index.php?document_srl=379&dummy=1&mid=track



Mina와 Netty는 둘다 이희승이라는 한국인이 만든 프레임워크다..
Mina는 Apache, Netty는 JBOSS.. 

Netty나 Mina를 하고선 느낀것은 참으로 삽질을 많이 줄여준다라는것이다.
소켓통신을 공부한후 Netty를 공부하면 참으로 좋을듯하다.
하지만 유일한 단점이.. 한국인이 만들었지만.. 한국어로된 문서가 상당히 부족하다..
이건머 다.. 영어다.... 못읽는건 아니지만 한글보다 느린건 어쩔수 없지...


라고 한다. - http://withoutwing.tistory.com/5




Netty

1. 네티 공식 사이트  - http://netty.io/

2. netty - 한글 사용자 가이드 첨부 - http://withoutwing.tistory.com/5

3. netty  한국인 사용자 그룹 -  http://groups.google.co.kr/group/netty-ko?hl=ko


netty 사용에 관한 몇가지 tip - 

http://blog.pointbre.com/351/netty-%EC%82%AC%EC%9A%A9%EC%97%90-%EA%B4%80%ED%95%9C-%EB%AA%87%EA%B0%80%EC%A7%80-tip.html


잡다 

네티란? - http://blog.naver.com/PostList.nhn?blogId=kjs077&from=postList&categoryNo=56


netty 사용법1(server) -  http://shonm.tistory.com/entry/JAVA-netty-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B0%A9%EC%8B%9D-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EC%82%AC%EC%9A%A9%EB%B2%95-1-server

 

netty zerocopy 파일 전송 - http://clotho95.blog.me/140117229649

Apache MINA

1. 공식 사이트 - http://mina.apache.org/


아래주소는 그냥 위의 공식사이트에 나오는 링크이다.

- javadoc : http://mina.apache.org/mina-project/apidocs/index.html

- 특징 : http://mina.apache.org/mina-project/features.html

- quick start : http://mina.apache.org/mina-project/quick-start-guide.html

- MINA에 대한 사람들의 말들 : http://mina.apache.org/mina-project/testimonials.html

- download : http://mina.apache.org/mina-project/downloads.html


 예전 글이지만 netty 개발자가 소개글로 올린 : http://www.javaservice.co.kr/~java/bbs/read.cgi?b=news&c=r_p&m=resource&n=1104313609&p=13&s=t (2004년)



Netty vs Apache MINA stackoverflow - 

http://stackoverflow.com/questions/1637752/netty-vs-apache-mina


외..

Neuropu(java neural Network Framework)???

http://neuroph.sourceforge.net/

posted by cozyboy
:
학습자료/tools 2013. 2. 18. 11:19

한마디로 네이버의 Ndrive 같은 것이다.

대신 아마존에서 제공한 것이며, 사용 용량과 트래픽 숫자에 따라 결제가 된다.


대신 값이 매우 싸며, 현재 초기 어느정도는 무료이다. 

또한 sdk까지 제공하므로, 관련개발이 손쉬워졌다.




aws(amazon web service) s3 페이지 : http://aws.amazon.com/ko/s3/#getting-started

 

1. 웹 클라이언트 AWS management Confsole 이용:

http://aws.amazon.com/ko/console/

 

 

2. 오픈소스 데스크탑 어플리케이션 cyberduck 이용방법 :

http://aws.amazon.com/ko/s3/#getting-started 에서

My Account(내계정) > Security Credentials(보안 자격 증명) > 이동

Access Key ID와 Secret Access Key를  사이버덕에 기입

 

 

3. 윈도우에 네트워크 드라이브로 이용 :

http://gladinet.blogspot.kr/2011/06/amazon-s3-as-network-drive.html

http://tntdrive.com/

 

 

Amazon sdk (with 이클립스)

마켓에서 amazon 검색 -> AWS Toolkit for Eclipse 을 install. 

sdk와 s3브라우저 플러그인이 깔린다. 

http://aws.amazon.com/eclipse

http://aws.amazon.com/articles/3586?_encoding=UTF8&jiveRedirect=1

sdk 다운 경로 : http://aws.amazon.com/ko/sdkforjava/

 

amazon sdk javadoc -

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html

 

 

 

'학습자료 > tools' 카테고리의 다른 글

[tolls]redmine 2.x (fedora 16) 설치법  (0) 2013.04.10
doxygen linux(소스 분석 툴)  (0) 2013.04.09
[Java] eclipse로 maven 사용(msgpackRPC 사용법)  (0) 2013.02.27
rrdtool  (0) 2012.10.31
[tools]Nagios 설치(모니터링)  (2) 2012.10.17
posted by cozyboy
:
학습자료/네트워크 2013. 2. 13. 14:59

 

netstat 네트워크 포트(TCP,UDP)상태를 확인함으로써 바이러스나 해킹여부를 진단할 있다.

명령어 : netstat [-a] [-e] [-n] [-s] [-r] [-p proto] [interval]

▶ netstat명령어 옵션 내용

옵션

-a

컴퓨터에서 수신되어 활성화 되어 있는 모든 TCP 및 UDP 포트를 표시

-r

라우팅 테이블 확인 및 Connection 되어 있는 포트번호 확인
(
컴퓨터 이름및 도메인이름으로 화면출력)

-n

현재 다른 PC 연결(Established)되어 있는 포트번호 확인(IP 주소로 화면출력)

-e

랜카드에서 송수신한 패킷의 용량및 종류 확인, -s와 같이 사용

-s

IP, ICMP, TCP, UDP 프로토콜의 상태

Active Connections Display State표시 내용

State

LISTEN

서버의 데몬이 떠서 접속 요청을 기다리는 상태

SYS-SENT

로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태

SYN_RECEIVED

서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답을 하였지만 아직 클라이언트에게 확인 메시지는 받지 않은 상태

ESTABLISHED

3 Way-Handshaking 완료된 서로 연결된 상태

FIN-WAIT1
CLOSE-WAIT
FIN-WAIT2

서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태.

CLOSING

흔하지 않지만 주로 확인 메시지가 전송도중 분실된 상태

TIME-WAIT

연결은 종료되었지만 분실되었을지 모를 느린 세그먼트를 위해 당분간 소켓을 열어놓은 상태

CLOSED

완전히 종료된 상태

 

'학습자료 > 네트워크' 카테고리의 다른 글

MTU, MSS [펌]  (0) 2013.06.17
zero-copy[펌]  (0) 2013.02.27
zero configuration networking  (1) 2013.02.12
네트워크 클래스 서브넷 마스크  (0) 2012.01.17
SSL(Secure Sockets Layer)  (0) 2012.01.16
posted by cozyboy
:
학습자료/Java 2013. 2. 13. 14:52

zeroconf 간단 요약 -

http://cozyboy.tistory.com/entry/zero-configuration-networking

 

추가.

Bonjour browser download site

http://hobbyistsoftware.com/bonjourbrowser

이 프로그램을 사용하면 어떠한 장비들이 있는지 간단하게 볼수 있다.

굳이 검색할 장비를 세팅하지 않아도 나도모르게 내 컴퓨터엔, 혹은 주위에 이미 존재 하고 있을수도 있다.

아래 소스로 프로그램후, 위의 서비스 타입([ex] : _adisk._tcp)을 이용하여 검색해보자. 표시가 잘 된다면 기본은 성공이다.

 

 


목차는

- 환경

- avahi(검색할 리모트 네트워크 장비) conf file 내용

- 테스트 코드

- 결과

- 간략 설명

- 오픈소스 JBonjourBrowser 스샷 및 다운로드 위치 


 

 

  • 환경

zeroconf 구현물인 avahi는 리눅스에서 running 상태이고,

 

애플의 bonjour sdk에 있는 dnssd.jar를 이용하여

윈도우에서 리눅스 장비를 탐지 할 수 있다.

 

avahi는 왠만하면 OS설치시 깔려있다. 깔려있지 않을 시, 설치 및 구동 시켜야 한다.

 

avahi-dnsconfd 는 추가로 설치함.(아마 avahi service conf가 바뀌면 실시간으로 모니터링 하는 데몬인것 같다. 테스트 할시 용의하므로 추가 설치)

 

/etc/avahi/service/* 가 service config다

 

  • avahi service conf의 min.service파일 내용.

<?xml version='1.0' standalone='no'?><!--*-nxml-*--> <!DOCTYPE service-group SYSTEM 'avahi-service.dtd'> <service-group> <name>UCS-1078d23f2fbb</name> <service> <type>_cozy._tcp</type> <port>22</port> <txt-record>ID=cozy--</txt-record> <txt-record>NAME=min</txt-record> <txt-record>AGE=26</txt-record> <txt-record>COR=Gluesys</txt-record> </service> </service-group>


 

  • [테스트 코드]

bonjour sdk for window 다운 : https://developer.apple.com/bonjour/

- 아이디 만들고 다운받으면 된다. 분명 아이디 안만들고 어디선가 받았는데 못 찾겠음.

 

package test.dns;

/*
 * Browse -> Resolve(a single SRV record and a single TXT record에 적합하다) -> Query listen(txt record가 여러라인일때 쓴다.)
 * */

import com.apple.dnssd.BrowseListener;
import com.apple.dnssd.DNSSD;
import com.apple.dnssd.DNSSDException;
import com.apple.dnssd.DNSSDService;
import com.apple.dnssd.QueryListener;
import com.apple.dnssd.ResolveListener;
import com.apple.dnssd.TXTRecord;

public class Main implements BrowseListener, QueryListener, ResolveListener{

 private DNSSDService monitorQ = null;
 
 public static void browse() throws DNSSDException, InterruptedException{
  System.out.println("TestBrowse Starting");

  DNSSDService b = DNSSD.browse("_min._tcp", new Main());
  
  System.out.println("TestBrowse Running");
  Thread.sleep(500);
  System.out.println("TestBrowse Stopping");
  b.stop();
 }

 
 public void TestResolveWithMonitoring(String serviceName, String regType,  String domain)
   throws DNSSDException, InterruptedException {
  System.out.println("TestResolve Starting==================================");
  DNSSDService r = DNSSD.resolve(0, DNSSD.ALL_INTERFACES, serviceName, regType, domain, this);
  System.out.println("TestResolve Running");
   
  /*시간이 너무 짧을시, txt-record가  갯수만큼 안나온다.*/
  try {
   Thread.sleep(500);                  
  } catch (Exception e) {
   e.printStackTrace();
   System.exit(-1);
  }
  System.out.println("TestResolve Stopping===================================");
  if (monitorQ == null)
   r.stop();
  else
   monitorQ.stop();
  
 }
 
 
 public static void main(String[] args) {
  try { browse(); }
  catch (Exception e) {
   e.printStackTrace();
   System.exit(-1);
  }
 }

 /** Browser listener`s  */
 @Override
 public void serviceFound( DNSSDService browser,  int flags, int iflndex,
    String serviceName, String regType, String domain) {
  // TODO Auto-generated method stub
  System.out.print("\t(Browsing) Service Found : ");
  System.out.println("browser:" + browser + ", flags:" + flags
    + ", iflndex:" + iflndex + ", serviceName:" + serviceName+ ", regType:" + regType+ ", domain:" + domain);
 
  try {
   
   TestResolveWithMonitoring(serviceName, regType, domain);
   
  } catch (DNSSDException | InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 @Override
 public void serviceLost(DNSSDService arg0, int arg1, int arg2, String arg3,
   String arg4, String arg5) {
  // TODO Auto-generated method stub
  System.out.println("Add flags:" + arg0 + ", ifIndex:" + arg1
    + ", Name:" + arg2 + ", Type:" + arg3 + ", Type4:" + arg4
    + ", Type5:" + arg5);
 }

 


 /** Query listener`s  */
 public void queryAnswered(DNSSDService query, int flags, int ifIndex,
   String fullName, int rrtype, int rrclass, byte[] rdata, int ttl) {
   TXTRecord txtRecord = new TXTRecord(rdata);
   System.out.println("\n+++txtRecord Size is :"+txtRecord.size()+"\n");
   System.out.println("\t(Query) txtRecord is : ");
   for (int i = 0; i < txtRecord.size(); i++) {
    String key = txtRecord.getKey(i);
    String value = txtRecord.getValueAsString(i);
    if (key.length() > 0) {
     
     System.out.println("\t\t" + key + "=" + value);
    }
   }
 }

 
 /** Resolve listener`s  */
 public void serviceResolved(DNSSDService resolver, int flags, int ifIndex,
   String fullName, String hostName, int port, TXTRecord txtRecord) {
  System.out.print("\t(Resolve)Service Resolved: " + hostName + ":" + port);
  System.out.println(" Flags: " + flags + ", ifIndex: " + ifIndex + ", FQDN: " + fullName);

  // Now that we've got a resolve result,
  // start monitoring the TXT record and stop the resolve call.
  try {
   monitorQ = DNSSD.queryRecord(0, ifIndex, fullName, 16, 1, this);
  } catch (Exception e) {
   e.printStackTrace();
   System.exit(-1);
  }
 
  /*try {
   Thread.sleep(1);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }*/
  
  resolver.stop();
 }
 
 /** all listener`s  */
 @Override
 public void operationFailed(DNSSDService service, int errorCode) {
  System.out.println("listener failed " + errorCode);
  System.exit(-1);
 }

}

 

 

  • [결과] 

TestBrowse Starting
TestBrowse Running
 (Browsing) Service Found : browser:com.apple.dnssd.AppleBrowser@31731334, flags:2, iflndex:11, serviceName:min_test, regType:_min._tcp., domain:local.
TestResolve Starting==================================
TestResolve Running
 (Resolve)Service Resolved: min.local.:22 Flags: 0, ifIndex: 11, FQDN: min_test._min._tcp.local.

+++txtRecord Size is :4

 (Query) txtRecord is :
  ID=cozy--
  NAME=min
  AGE=26
  COR=Gluesys
TestBrowse Stopping
TestResolve Stopping===================================

 

 


 

  • 간략 설명

BrowseListener,  ResolveListener, QueryListener 가 구현되어있다.

 

BrowseListener로는  (serviceFound )

browser:com.apple.dnssd.AppleBrowser@31731334, flags:2, iflndex:11, serviceName:min_test, regType:_min._tcp., domain:local.

를 얻는다.

 

ResolveListener로는 (serviceResolved)

(Resolve)Service Resolved: min.local.:22 Flags: 0, ifIndex: 11, FQDN: min_test._min._tcp.local.

 

☞ QueryListener는 단일 txtRecord를 얻는데 사용된다. 멀티라인의 txtRecord를 얻기위해선 QueryListener를 사용해야 한다. 위의 소스는 단지 Query에 이용되는 fullname(serviceName+regType+domain = min_test._min._tcp.local.)인자가 무엇인지 확인한다.

를 얻는다

 

 

멀티라인의 txtRecord를 얻기위해

QueryListener를  (queryAnswered ) 사용하여 아래값을 얻는다.

 ID=cozy--
NAME=min
AGE=26
COR=Gluesys

 

 

자세한 내용은 javadoc을 참고 한다.

 

 

 

  • 오픈소스 JBonjourBrowser 스샷

 

다운 로드 : https://wiki.cs.columbia.edu/display/res/JBonjourBrowser

BonjourBrowser와 다르게 service Type으로 묶어서 표시한다.

 



[참고]

avahi service type 확인

http://linux.die.net/man/5/avahi.service

 

DNSSD javadoc

https://developer.apple.com/library/mac/documentation/Java/Reference/DNSServiceDiscovery_JavaRef/com/apple/dnssd/DNSSD.html

 

Bonjour browser download

http://hobbyistsoftware.com/bonjourbrowser

 


posted by cozyboy
:
학습자료/네트워크 2013. 2. 12. 19:48

Zero configuration networking

http://en.wikipedia.org/wiki/Zero_configuration_networking#Service_discovery

 

 

dnssd java library를 이용한 테스트 코드와 결과 -

http://cozyboy.tistory.com/entry/네트워크-장비-검색

 


Zeorconf 란?

 

Zero Confiuration Networking으로 DNS 서버 설정이나 IP를 이용하지 않은 networking 즉 DHCP 환경이 없는 네트워크에서 peer to peer 연결이나 Wireless 환경에서 수동설정없이 자동으로 네트워킹 할수 있는 환경을 만들어주는것.

위와 같은 일을 하기위해선 네트워크 장치검색 프로토콜이 필요하다.

 

  • Apple

Apple에서 만든 Zero Configuration Networking 프로토콜로써 IP 네트워크 상에서 컴퓨터, 주변기기 및 서비스를 자동으로 검색하는 서비스로 Bonjour(데스크탑 어플리케이션)가 있다. Bonjour는 DNS based Service Discovery(DNS-SD) 프로토콜을 사용한다.

 

  • windows

windows에선 upnp이 존재한다. 윈도우7의 윈도우 미디어가 DLNA를 적용하였으며, DLNA는 upnp 프로토콜의 SSDP(Simple Service Discovery Protocol) 사용한다.

 

몇년전부터 스마트 티비 대부분 DLNA를 지원했다.

 

 

avahi는 bonjour와 같이 dns-sd이며, 단지 리눅스용으로 만들어졌다. 그래서 bonjour sdk로 avahi를 검색할 수 있다. bonjour로 upnp검색은 불가능하다.

 

avahi(linux), bonjour(apple), upnp(window) 등이 Zeroconf를 구현한 것들로써

위와 관련된 library를 이용하면 네트워크 장치 검색이 가능하다.

 

 

 

 


Bonjour 와 Zeroconf

http://qnibus.com/webtonz/2011/06/24/bonjour-%EC%99%80-zeroconf/

 

DNS Service Discovery http://pic.dhe.ibm.com/infocenter/sprotect/v2r8m0/index.jsp?topic=%2Fcom.ibm.ips.doc%2Fconcepts%2Fgx_gv_zero_configuration.htm

 

 

com.apple.dnssd JavaDoc

https://developer.apple.com/library/mac/documentation/Java/Reference/DNSServiceDiscovery_JavaRef/com/apple/dnssd/DNSSD.html

 

avahi wiki

http://en.wikipedia.org/wiki/Avahi_(software)

 

bonjour wiki

http://en.wikipedia.org/wiki/Bonjour_(software)


DNS-SD From java library 간략 정리

http://elliotth.blogspot.kr/2009/03/registering-service-with-dns-sd-from.html

 

dns-sd 사이트

http://www.dns-sd.org/

'학습자료 > 네트워크' 카테고리의 다른 글

MTU, MSS [펌]  (0) 2013.06.17
zero-copy[펌]  (0) 2013.02.27
netstat 명령어 사용법 - 펌  (0) 2013.02.13
네트워크 클래스 서브넷 마스크  (0) 2012.01.17
SSL(Secure Sockets Layer)  (0) 2012.01.16
posted by cozyboy
:
학습자료/리눅스 2013. 2. 1. 17:53

만약 LVM 을 통해 기존에 있던 Logical volume 을 lvresize 나 lvextend 혹은 lvreduce 를 통해 크기를 변경했을 때

lvdisplay 로 확인했을 때는 크기가 확장되거나 줄었는데 실제 mount (df) 를 통해 보면 이전하고 크기가 바뀌지 않았을 경우가 있다.

루트(/) 쪽을 물리 볼륨확장 하였으나,

lvdisplay 에는 확장되었다고 나오고

df로는 적용이 되지 않은 량이 표시되었다.

 

그때

resize2fs extends the filesystem to the partition's size로 해결

 

 

http://en.positon.org/post/Resize-an-ext3-ext4-partition

 

posted by cozyboy
:
학습자료/리눅스 2013. 2. 1. 14:01

명령어 : rpm


1) 패키지가 설치 되어 있는지 확인

rpm -qa | grep <package name>

-qa 명령어만 사용하면 전체 설치 리스트를 가지고 오는데 여기에서 특정 이름만 추출하기 위해서 사용합니다.

rpm -qa | grep tftp-server // tftp-server 라는 패키지가 설치되어 있는지 확인


2) 패키지 제거하기

rpm -e tftp-server // tftp-server 패키지 제거

의존성 무시하고 강제 삭제를 원하는 경우

--nodeps 옵션을 추가하면 됩니다.


3) 패키지 설치 및 업그레이드

-i : 설치

-U : 업그레이드

-v : 설치 진행 상황 보여주기

--------------------------------------------------

질의 옵션 (-q 또는 --query 옵션과 함께 사용):
-c, --configfiles 모든 설정 파일을 나열합니다
-d, --docfiles 모든 문서 파일을 나열합니다
--dump 기본 파일 정보를 보여줍니다
-l, --list 패키지 안의 파일을 나열합니다
--queryformat=QUERYFORMAT 다음의 질의 형식을 사용하십시요
-s, --state 나열된 파일의 상태(state)를 보여줍니다
-a, --all 모든 패키지에 대해 질의/검증합니다
-f, --file 파일이 들어있는 패키지에 대해 질의/검증 합니다
-g, --group 그룹 안의 패키지를 질의/검증 합니다
-p, --package query/verify a package file
--specfile spec 파일에 대해 질의합니다
--whatrequires 의존성을 필요로 하는 패키지에 대해 질의/검증 합니다
--whatprovides 의존성을 제공하는 패키지에 대해 질의/검증 합니다


검증 옵션 (-V 또는 --verify 옵션과 함께 사용):
--nomd5 파일의 MD5 축약(digest)을 검사하지 않습니다
--nofiles 패키지 안의 파일을 검사하지 않습니다
--nodeps 패키지의 의존성을 검사하지 않습니다
--noscript don't execute verify script(s)
-a, --all 모든 패키지에 대해 질의/검증합니다
-f, --file 파일이 들어있는 패키지에 대해 질의/검증 합니다
-g, --group 그룹 안의 패키지를 질의/검증 합니다
-p, --package query/verify a package file
--specfile spec 파일에 대해 질의합니다
--whatrequires 의존성을 필요로 하는 패키지에 대해 질의/검증 합니다
--whatprovides 의존성을 제공하는 패키지에 대해 질의/검증 합니다


서명 옵션:
--addsign sign package(s) (identical to --resign)
-K, --checksig verify package signature(s)
--import import an armored public key
--resign sign package(s) (identical to --addsign)
--nodigest don't verify package digest(s)
--nosignature don't verify package signature(s)


데이터베이스 옵션:
--initdb 데이터베이스를 초기화 합니다
--rebuilddb 설치된 패키지 헤더에서 상반된 목록(inverted lists)의 데이터베이스를 재구축 합니다


설치/업그레이드/삭제 옵션:
--aid add suggested packages to transaction
--allfiles 특정 파일을 생략하기 위한 설정이 적용된
경우에도, 패키지 안의 모든 파일을 설치합니다
--allmatches <패키지> 이름과 일치하는 패키지는 모두
제거합니다 (<패키지>에 여러개의 패키지를 동시에

지정할 경우에는 오류가 발생합니다)
--badreloc relocate files in non-relocatable package
-e, --erase=<패키지>+ 패키지를 (제거) 삭제합니다
--excludedocs 패키지에 포함된 문서 파일을 설치하지 않습니다
--excludepath=<경로> <경로>로 시작되는 파일은 설치하지 않습니다
--fileconflicts detect file conflicts between packages
--force --replacepkgs 와 --replacefiles 옵션을 동시에 사용합니다
-F, --freshen=<패키지파일>+ 기존에 설치된 패키지를 업그레이드 합니다
-h, --hash 패키지 설치를 해시마크(#)로 표시합니다 (-v 옵션과 함께 사용하는 것이 좋습니다)
--ignorearch 패키지의 아키텍쳐를 검사하지 않습니다
--ignoreos 패키지의 운영체제를 검사하지 않습니다
--ignoresize 패키지를 설치하기 전에 디스크 공간을 검사하지 않습니다
-i, --install install package(s)
--justdb 파일시스템을 변경하지 않고, 데이터베이스를 갱신합니다
--nodeps 패키지의 의존성을 검사하지 않습니다
--nomd5 파일의 MD5 축약(digest)을 검사하지 않습니다
--noorder 의존성이 있는 패키지를 설치하도록 재요구하지 않습니다
--nosuggest do not suggest missing dependency resolution(s)
--noscripts 패키지 스크립틀릿(scriptlet)을 실행하지 않습니다
--notriggers 이 패키지에 의해 생성되는(triggered) 어떠한 스크립틀릿(scriptlet)도 실행하지 않습니다
--oldpackage 이전 버전의 패키지로 다운그레이드 합니다
(--force 옵션을 사용시에는 이 옵션이 자동으로 적용됩니다)
--percent 패키지 설치를 퍼센트(%)로 표시합니다
--prefix=<디렉토리> 재배치 기능이 있는 패키지의 경우, 지정한<디렉토리>로 재배치하여 설치합니다
--relocate=<이전경로>=<새로운경로> <이전경로>에서 <새로운경로>로 파일을 재배치 합니다
--repackage 재패키징(repackaging)으로 인해 삭제되는 패키지 파일을 저장합니다
--replacefiles ignore file conflicts between packages
--replacepkgs 패키지가 이미 설치되어 있는 경우에도 설치합니다
--test 패키지를 설치하지 않고, 제대로 설치되는지만 확인합니다
-U, --upgrade=<패키지파일>+ 패키지를 업그레이드 합니다


모든 rpm 모드에서의 일반적인 옵션:
-D, --define='MACRO EXPR' define MACRO with value EXPR
-E, --eval='EXPR' print macro expansion of EXPR
--macros=<FILE:...> read <FILE:...> instead of default file(s)
--nodigest don't verify package digest(s)
--nosignature don't verify package signature(s)
--rcfile=<FILE:...> read <FILE:...> instead of default file(s)
-r, --root=ROOT use ROOT as top level directory (default: "/")
--querytags 질의 태그를 보여줍니다
--showrc 현재 설정되어 있는 rpmrc의 내용과 매크로를 보여줍니다
--quiet 자세한 출력을 제공합니다
-v, --verbose 아주 상세한 출력을 제공합니다
--version 현재 사용되고 있는 rpm 버전을 표시합니다


Options implemented via popt alias/exec:
--scripts list install/erase scriptlets from package(s)
--setperms set permissions of files in a package
--setugids set user/group ownership of files in a package
--conflicts list capabilities this package conflicts with
--obsoletes list other packages removed by installing this package
--provides list capabilities that this package provides
--requires list capabilities required by package(s)
--info list descriptive information from package(s)
--changelog list change logs for this package
--triggers list trigger scriptlets from package(s)
--last list package(s) by install time, most recent first
--filesbypkg list all files from each package
--fileclass list file names with classes
--filecolor list file names with colors
--fileprovide list file names with provides
--filerequire list file names with requires
--redhatprovides find package name that contains a provided
capability (needs rpmdb-redhat package installed)
--redhatrequires find package name that contains a required
capability (needs rpmdb-redhat package installed)
--buildpolicy=<policy> set buildroot <policy> (e.g. compress man pages)
--with=<option> enable configure <option> for build
--without=<option> disable configure <option> for build


Help options:
-?, --help Show this help message
--usage Display brief usage message

[출처] rpm 사용 옵션|작성자 해안선

--------------------------------------------------

 

posted by cozyboy
:
학습자료/보안 2012. 12. 7. 09:49

방법1.

익스 플로러 주소창에 다음과 같이 쓰면 된다.

javascript:set=prompt("변경할 쿠키값을 입력하세요.","변경할 값 디폴트"); document.cookie="user_lv="+set+"; "; alert(document.cookie); allCookies=document.cookie.split(';'); alert("변경된 쿠키값\n\n:"+ allCookies[allCookies.length-1]);

set=prompt("변경할 쿠키값을 입력하세요.","변경할 값 디폴트"); 

--> 변경할 값을 텍스트 박스로 입력 받음

 

document.cookie="user_lv="+set+"; ";

--> 쿠키값에 "user_lv="+set+"; " 대입    (set은 위에서 입력한 값)

 

alert(document.cookie);

--> 알림창에 쿠키값을 보인다.

 

alert("변경된 쿠키값\n\n:"+ allCookies[allCookies.length-1]);

--> 정확히 따지면 변경된 쿠키값은 아니다.

 

-------------------------------------------------------------------

방법2.

익스 플로러일시, F12키(개발자 도구)를 누른다.

좌상단에 스크립트를 클릭

우상단 콘솔이 존재한다. -> 우하단에 document.cookie 를 입력한다.

 

위의 방법은 javascript를 해석할수 있는 브라우저라면 모두 된다. 왠만하면 다 될것이지만 익스플로어 라면 개발자 도구를 쓰는게 훨씬 더 편할 수 있다.

-------------------------------------------------------------------

 

예전엔 쿠키에 아이디 비번이 적혀있어서 악용 될때가 있었다고도 한다.

현재는 장바구니에 많이 쓰임. 쿠키를 지우면 장바구니가 사라져 있을 것이다.

 

 

 

 

http://www.tutorialspoint.com/

에서 자바스크립트 간단히 배울 수 있음.

'학습자료 > 보안' 카테고리의 다른 글

Base 64 [펌]  (0) 2012.12.06
posted by cozyboy
:
학습자료/보안 2012. 12. 6. 10:16

 

요약 정리

2의 6승(64), 6bit 씩이라는 의미 인듯하다.

3개의 문자(8bit x 3 = 24bit)를 6bit로 잘라 4개의 문자로 만든다.  뒷부분의 0은 '='로 치환된다.

그래서 가끔 해킹 배우는 사이트에서 뜬금없는 문자 끝에 '='이 붙어있고 이것을 디코드 하라고 하면 base64를 의심 해보자.

 

===========================================================================

 

Base64

: 바이너리나 압축파일과 같은 8비트 이진 데이터를 문자코드에 영향을 받지않는 공통 ASCII문자들로만 이루어진 문자열로 바꾸는 인코딩 방식을 말한다.

64가지의 문자를 이용하여 바이너리 데이터를 ASCII텍스트 데이터로 표현하게 된다.


즉, 64진법으로 인코딩하는 방식인데, 이는 64진법이 ASCII문자를 나타내기에 가장 적합한 숫자이기 때문이다.


기본적으로는 A~Z (26개) + a~z (26개) + 0~9 (10개) = 총 62개의 문자로 구성되며, 나머지 2개에 어떤 기호를 사용하는지에 따라 base64의 종류가 결정된다. 대부분의 경우 +와 /가 쓰인다.


8bit의 바이너리 데이터를 6bit의 크기를 단위로 표현하게 된다!

즉, input은 1개의 문자크기인 8bit를 단위로 3개의 문자를 기본으로 하며 이것을 6bit단위로 표현하게 되므로 그에따른 output은 4개의 문자를 얻게된다는 것이다.

따라서 24bit를 단위로 3개의 문자를 인코딩하면 4개의 문자를 얻게된다!


그렇다면 만약 8bit의 데이터(문자 하나)를 input으로 base64암호화를 시킨다면 output은 어떻게될까?

64진수수가 하나(6bit)가 출력되고 나머지 2bit는 padding문자로 채워지게된다.

padding문자는 base64 table에 존재하지 않는 기호인 '='이다.


위에서 언급했다시피, '='는 bit수를 맞춰주기위해 0으로 채워주는 padding이다.

문자의 갯수가 3n+1개 일 때에는 '='이 2개로 채워질 것이고, 3n+2개 일 때에는 '='이 1개로 채워질것을 알 수 있다.


간단하게 인코딩 방식을 그림으로 설명해보겠다.


위에서 계속적으로 언급한대로 8비트의 문자세개를 6비트단위로 쪼갠 문자네개로 변환하는 것이다!

기본 포맷이 24비트이므로 a를 input하면 첫글자 부분에 8bit인 01100001가 들어가고

나머지 두글자 부분에는 0으로 채워지게 되며 이것을 6비트씩 잘라서 아스키부호로 표시하게 된다.

뒷부분의 0들은 인코딩시 padding부호 '='로 나타나게된다.



실제로 문자 a를 base64로 인코딩 해보았다.






툴은 SND Reverser Tool을 사용하였다.

위와 같이 1개(3n)의 문자열을 인코딩하면 padding문자가 2개 들어가는 것을 알 수 있다.


다음은 ab를 인코딩해보았다.





위와 같이 2개(3n+2)의 문자열을 인코딩하면 padding문자가 1개 들어가는 것을 알 수 있다.


다음은 abc를 인코딩해보았다.




3개(3n)이므로 padding문자 없이 모두 ASCII문자로 변환되는것을 알 수 있다.


[Base64 문자표]

문자

문자

문자

문자

0

A

16

Q

32

g

48

w

1

B

17

R

33

h

49

x

2

C

18

S

34

i

50

y

3

D

19

T

35

j

51

z

4

E

20

U

36

k

52

0

5

F

21

V

37

l

53

1

6

G

22

W

38

m

54

2

7

H

23

X

39

n

55

3

8

I

24

Y

40

o

56

4

9

J

25

Z

41

p

57

5

10

K

26

a

42

q

58

6

11

L

27

b

43

r

59

7

12

M

28

c

44

s

60

8

13

N

29

d

45

t

61

9

14

O

30

e

46

u

62

+

15

P

31

f

47

v

63

/




참고 사이트 : http://bbolmin.tistory.com/46

http://blog.nextcube.pe.kr/204

 

펌 : http://syung1104.blog.me/161866114

 

'학습자료 > 보안' 카테고리의 다른 글

쿠키 변경(익스플로러 사용)  (0) 2012.12.07
posted by cozyboy
: