Live hot, Think cool

bash shell 이란

공부방2017. 1. 30. 20:16
"Hashbang" redirects here. For hashbangs in URLs, see Fragment identifier § Proposals.

In computing, a shebang is the character sequence consisting of the characters number sign and exclamation mark (#!) at the beginning of a script. It is also called sha-bang,[1][2] hashbang,[3][4] pound-bang,[5] or hash-pling.[6]

Under Unix-like operating systems, when a script with a shebang is run as a program, the program loader parses the rest of the script's initial line as an interpreter directive; the specified interpreter program is run instead, passing to it as an argument the path that was initially used when attempting to run the script.[7] For example, if a script is named with the path path/to/script, and it starts with the following line:


#!/bin/sh


then the program loader is instructed to run the program /bin/sh instead, passing path/to/script as the first argument.


#!를 shebang(샤방) 라인이라고 부른다.


*.sh 스크립트에 처음


#!/bin/bash

#!/usr/bin/env bash 등으로 사용하는데


이렇게 쓰면 /bin/sh를 로드하지 않고 대신 #!에 지정한 쉘을 interpreter directive(인터프리터 지시자)로 구분한다.

(https://en.wikipedia.org/wiki/Shebang_(Unix) - 발취)

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


bashBourne Again Shell 의 약자입니다. 가장 현대적이고 강력한* 셀입니다. Steven Bourne 이라는 사람이 만든 Bourne Shell (약칭: sh) 을, 개량한 것이 bash 이에요

* Korn shell 이라는 강력한 셀도 있지만, bash 와 달리 100% 무료는 아닙니다.


발표된 순으로 셀의 종류를 나열하자면 다음과 같습니다:

Bourne shell (sh) - 1979년에 발표

C shell (csh)

Korn shell (ksh)

Bourne Again shell (bash) - 1988에 처음 발표


(http://mwultong.blogspot.com/2006/07/shell-bash-shell.html - 발최)

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


리눅스에서 쓸 수 있는 모든 쉘들처럼, BASH(Bourne Again Shell)은 뛰어난 명령 라인 쉘이면서, 그 자체로도 하나의 스크립팅 언어이다. 당신은 쉘 스크립팅을 이용해서 쉘이 가진 능력을 충분히 활용할 수 있으며, 쉘 스크립팅이 아니었으면  수많은 명령을 필요로 했을 많은 일들을 자동적으로 처리할 수도 있다. 당신의 리눅스 박스에 놓여 있는 많은 프로그램들은 쉘 스크립트들이다. 만일 쉘 스크립트가 어떻게 작동하는지 배우고 싶거나 당신이 가지고 있는 쉘 스크립트를 수정하고 싶다면, bash 문법을 이해하는 것은 필수적이다. 게다가, bash 언어를 이해하면 정확히 당신이 원하는 방식으로 일을 하는 당신 자신의 프로그램을 작성할 수 있다. 


(http://coffeenix.net/doc/shell/introbashscript.htm - 발최)

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


Shell의 종류

bash ( Bourne-Again Shell )

프롬프트 : #

실행파일은 /bin/bash

Bourne again shell은 최초로 개발된 쉘인 Bourne shell의 변종이라 할 수 있습니다.
리눅스에서 가장 많이 사용되는 IEEE POSIX 호환이며 Borune shell과 호환되는 쉘로서 
GNU 프로젝트에 의해 만들어지고 배포되고 있습니다. 명령행 편집 기능을 제공합니다

 

sh ( Bourne Shell )

프롬프트 : $

본 쉘 보다는 개발된 C쉘이나 콘 쉘과 기능적인 면을 비교해 보면 본 쉘에 미흡한 점이 있다. 그 중 가장 큰 단점은 상호 대화형(Interactive)

방식을 취하고 있지 않다는 점이다. 이러한 상호 대화형 방식을 사용하고자 한다면 쉘을 바꿔서 작업하는 것이 좋을 것이다.

- Steven Bourne의 Bourne Shell, sh

- 쉘 명령 대본을 작성하는데 이용되는 쉘

- 강력한 명령 프로그래밍 언어 기능을 갖는 쉘

- 가장 오래 동안 모든 유닉스 시스템의 표준 구성 요소

 

csh ( C 프로그램 스타일의 Shell )

프롬프트 : %

버클리 캘리포니아 대학에서 개발된 프로그래머들에게 적합한 shell입니다. ( csh는 C쉘이며 sh는 본 쉘이다 )
대화형 사용법에서는 Bourne shell과 대부분 호환되지만 전혀 다른 프로그래밍 인터페이스를 가지고 있고, 히스토리 대체라는 복잡한

기능으로 대신하고 있지만 명령행 편집 기능은 제공하지 않습니다.

- Bill Joy의 C Shell, csh

- C언어와 유사한 언어를 사용

- 상호 대화형 방식으로 구성 

 

ksh ( Korn Shell )

프롬프트 : $

일반적으로 유닉스에서 가장 많이 사용되고 있는 shell이며 Bourne shell에 처음으로 현대적
인 shell 기능(C shell로부터 차용한 것이다.)을 도입한 shell 입니다. Bourne shell과 호환
되고, 명령행 편집 기능을 제공합니다.

 

zsh

프롬프트 : %

Korn Shell과 매우 유사한 셸이지만 Korn Shell보다 더 많고 유용한 기능 등을 추가하여 개선시킨 것이다.

 

tc Shell

프롬프트 : >

코넬 대학에서 C Shell 수정본에 Korn Shell의 기능을 포함하여 개발된 셸이다. 95%의 C Shell과 5%의 새로운 기능이 추가되어 만들어졌다.


(http://unabated.tistory.com/entry/LinuxUnix%EC%89%98-Shell-%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EC%A2%85%EB%A5%98 - 발최)

Bash 설치


1. windows + s 클릭후 "windows 업데이트 설정"을 검색후 개발자용 탭에서 "개발자 모드"를 선택 합니다.




2. "windows 기능 켜기/끄기"를 검색 후 "Linux용 Windows 하위시스템(베타)"를 선택 후 저장하고 재부팅해요 



3. 재부팅 완료 후 cmd창에서 bash 를 실행하면 설치여부를 물어보는데 "y"를 입력하고

계정을 추가하기위해 아이디와 비밀번호까지 입력해주세요



4. bash --version(Bash 버전) 과 lsb_release -a(리눅스버전) 를 입력해서 버전을 확인해보세요



5. 윈도우 cmd 창에서 리눅스 삭제, 설치, 업데이트를 할 수 있는데 명령어는 아래와 같아요.

설치를 이미 했으니, 업데이트만 해주면 되겠네요


- 리눅스 업데이트 명령어 : lxrun /update

- 리눅스 삭제 명령어 : lxrun /unintall /full

- 리눅스 설치 명령어 : lxrun /install


sudo su를 입력하면 root사용자로 전환되네요


 

'16년 9월 12일 20시경 경주일대에서 5.8강도의 지진이 발생했다.

 

자주보는 JTBC 뉴스룸에서도 모든 뉴스를 중단하고 지진에 대한 특보로 1시간 30분을 채웠고 MBC, KBS도 말할것 없이 지진관련 뉴스로 하루종일 기사화 했다.

 

나 또한 깜놀했고, 우리나라에서 내진대책이 얼마나 된건지 궁금해 좀 찾아보고 정리해보았다.

 

1. 우리나라 관련법규

 - 지진ㆍ화산재해대책법

 - 재난 및 안전관리 기본법

 

2. 지진관련 우리나라 주무 행정부서

 가. 국민안전처 중앙대책본부 : 지진관련 모든 총체적인 업무를 담당하는 곳

 나. 기상청 : 지진해일 등을 관측하는게 주 업무

 다. 방송통신설비 기준

   - 미래창조과학부 : 국립전파연구원 상위 행정기관

   - 국립전파연구원 : 내진인증 제품 인허가

 

3. 지진내진 설계기준

 가. 국민안전처 산하 국립재난안전연구원에서 발간한 지진에 대비한 내진설계

NIDP-1998-15-지진에 대비한 내진설계.PDF

 

 나. 건축법 제48조제3항, 건축물의 구조기준 등에 관한 규칙 제3조제2항

 다. 국토교통부 고시 제2016-317호 건축구조기준(파일크기 10MB이상)

 라. 국민안전처 소방시설의 내진설계 화재안전기준 해설서

소방시설의 내진설계 기준 해설서(2016).pdf

 

 마. 방송통신설비 기준

  - 국립전파연구원 공고 제2015-14호 전기통신설비의 내진 시험방법

방송통신설비의내진시험방법(국립전파연구원공고제2015-14호)_개정전문.hwp

 

 

  - 국립전파연구원 고시 제2016-5호 방송통신설비의 안정성·신뢰성 및 통신규약에 대한 기술기준

방송통신설비의안전성·신뢰성및통신규약에대한기술기준(국립전파연구원고시제2016-5호).hwp

 

4. 방송통신설비의 내진설계 기준이란?

 - 지진화산재해대책법 및 전기통신기본법에 따라 전기통신설비는 내진대책을 수립 실행해야 한다.

 - 단, 국립전파연구원 고시 방송통신설비의 안정성·신뢰성 및 통신규약에 대한 기술기준에 따라 사업용방송통신설비인 (기간통신설비, 별정통신설비, 부가통신설비 및 전송망설비-기간통신사업자, 별정통신사업자, 부가통신사업자)에 한한다.

 - 그 기준은 방송통신설비의 안정성·신뢰성 및 통신규약에 대한 기술기준을 따라야 하며 내진 시험방법에 따라 인증을 받아야 한다.

 - 시장에 나온 내진제품으로는 대부분 앙카와 면진보드를 설치하는 방식이며 건축법 및 국토교통부 고시 건축구조기준에 따라 건축 내진등급 이상의 진동 스펙트럼을 견뎌야 한다.

 - 구체적으로 설명하면 가속도 2m/s2(?) 으로 초당 1~35 Frequency로 흔들었을때 설계된 랙 하중무게에 버틸수 있는 구조이어야 한다.. 이때 가속도는 국립전파연구원 기준에 따라야 하는데 정확한건 읽어보면 알수 있다.

 

 

 

'공부방' 카테고리의 다른 글

bash shell 이란  (0) 2017.01.30
윈도우10에서 Bash 쉘 쓰기  (0) 2017.01.30
ActiveX 제거하기 그리고 HTML5  (0) 2016.09.13
리눅스 시스템 전체 부팅과정의 이해  (0) 2015.10.05
Linux Red Hat Enterprise Version 7 Study..  (0) 2015.09.16

얼마 전, 위로부터 문서가 내려왔다. 두둥

ActiveX 를 없애고 실적을 제출하라고~

(지금 진행중인 업무가 산재해 있는데 이렇게 너희들이 알아서 처리하고 실적 제출해 하는 아몰랑~ 식의 문서는 진짜 한대 때려주고 싶다.)

 

그래 나는 성실하게 회사에서 월급받고 일하는 한사람으로 시키면 해야죠

그 이상을 해야죠~ 암요 암요~(당연하다. 땅파서 돈나오는것도 아니고)

 

OK 알겠어, ActiveX를 없애는 방법은 다양하다.

 - exe파일로 대체하기, 자바애플릿이나 플래쉬로 대체하기, 브라우져 전용 플러그인 사용하기, script언어로 구현하기, ActiveX로 사용하는 기능을 없애기.. 등

 

모두다 ActiveX를 제거했다고 하며 실적으로 잡을수 있다.

(모두다 실적으로 잡는다는 부분에서 애초에 ActiveX를 제거해야만 하는 의미가 퇴색된다는 부분에서 아이러니 하긴 함....)

 

여기서 우린 왜?? ActiveX를 제거해야하는지 한번쯤 생각해봐야 한다.

그리고 어떻게?? 해야하는지도 살펴본다.

생각보다 이를 모르는 SW관련자가 많다.. 그래서 정리해본다.

 

1. 왜 ActiveX를 제거해야하는가??

 가. 보안에 엄청 취약하다.

 - ActiveX는 인터넷 익스플로러의 플러그인으로 윈도우상에서 OS에 접근할수 있는 언어이기도 하다. 그러므로 프로그램에 악의적으로 악성코드를 심었을때 보안에 취약하게 된다. 인터넷을 사용하며 의례적으로 ActiveX를 설치하겠습니까 뜨면 설치설치 클릭하며 사용하는 일반인 입장에서는 위험한 악성프로그램이 될 수 있다.

 

 나. ActiveX는 오로지 윈도우(IE)에서만 실행 가능하다.

 - 그런데 요즘 세상은 윈도우만 쓰는 세상이 아니다. 오히려 윈도우 사용량이 훨씬 적다. 한국인터넷진흥원에서 발간한 2015년 조사에 따르면 약 80%가 인터넷을 데스크톱이 아닌 스마트폰에서 접속하고 있다. 그런데 모바일의 OS중 단 0.5%만이 윈도우이고 나머지 98%가 다른 OS이다.(58%가 안드로이드 40%가 iOS) 단지,  아직까지 데스크탑 윈도우 사용률이 90%정도 되지만 스마트폰 환경에서 ActiveX를 계속 고집하다가는 그 회사는 망할 수 있다. 이런점 때문에 중국사람들이 천송이 가방을 사야하는데 ActiveX 때문에 못산다는 말도 나오고 하는거다. 실상은 국내 쇼핑몰에서 공인인증서로 인한 결제때문에 외국인들이 결제를 못한거지만.. 중요한점은 ActiveX는 대상 고객의 범위를 한정지게 된다.

 

2. 무엇으로 대체 해야하는가?

 - 위에 언급했듯이 방법은 여러가지가 있다. (exe파일로 대체하기, 자바애플릿이나 플래쉬로 대체하기, 브라우져 전용 플러그인 사용하기, ActiveX로 사용하는 기능을 없애기.. 등)

 - 그러나 위 방법 모두 ActiveX라는 암을 제거하고 당뇨병이라는 병을 다시 들여오는 느낌이다.(http://m.sisain.co.kr/?mod=news&act=articleView&idxno=23110)

 - 단지 script언어로 구현하는 것은 실효성이 있다. 이중 가장 대표적인게 웹브라우져 전용 클라이언트 사이드 스크립트인 자바스크립트이다. 스크립트 언어는 다양하다. 대표적으로 우리나라에서 많이 쓰는게 asp, php, jsp(java), 파이썬, javascript와 같은것이 있다. 이 중에서 asp, php, jsp, 파이썬 등과 같은것은 서버 사이드 스크립트이고 웹브라우져에서 동작하는 언어가 아니다. 웹전용 스크립트는 결국 javascript로 보면 된다.

 - 그리고 정말 중요한 웹문서인 HTML을 구현해야 한다.

 - 모든 웹브라우져를 통한 페이지는 결국 HTML을 표현하는 것이다. 이를 구현하기 위해 javascript와 css로 돕는 것이다.

 - 결국 동적으로 무언가를 보여준다던가 다양한 멀티미디어를 처리하는걸 가능하게끔 하여 모든 브라우져에서 호환 가능한 HTML을 구현하는데 이를 javascript, css와 같이 사용해야 한다. 그리고 이를 차세대 웹표준 언어 HTML5라 일컫는데 ActiveX를 대체하여 구현해야 하는 기술이 HTML5 인 셈이다.

 

3. HTML5로 어떻게 구현하는가?

(http://koreahtml5.kr/)

 - HTML5로 어떻게 ActiveX를 대체하는가, 한글(hwp) 파일뷰어를 웹페이지에서 보던걸 어떻게 없애지? 등의 문제가 나름 심각하다. 내 PC에서 엑셀파일을 웹페이지와 연동하던 것은 어떻하지.. 등의 고민이 많다.

 - 답은 서버에서 기술을 고도화 시켜야한다.

 - 한글파일이나 엑셀과 같은 것을 서버에서 업로드 받아 분석하여 다시 웹페이지에 어느정도 정돈된 html문서로 보여줄 수 있는 모듈을 만들어야 한다. 또는 그런 모듈을 수용해야 한다.

  - 이런게 기술이다~!!!

  - 이렇게 노하우와 기술을 강화시켜 구현해야하는데...

  - 이런걸 단기간 내에 실적을 제출하시오.. 와 같은 문서를 보내는 생각은.. 정말 한대 때려주고 싶은 것이다.

 

4. 개발자는 HTML5을 어떻게 배워야 하는가??

  - HTML5를 200% 활용하려면 html, javascript, css에만 익숙해서는 안된다. jsp나 asp와 같은 서버사이드 언어도 잘 알아야 한다. 더 나아가면 c++같은 고급 어셈블리어도 할 줄 알아야 한다. 그래야 보안적으로 완강하고 기능적으로도 화려한 서비스를 제공할 수 있을테니까 말이다.

  - 자 웹개발자여~ 웹개발에만 머무르지 말자.. 나도 그렇고 너도 그렇고.. 모두..

리눅스 부팅과정의 이해

 

1. 리눅스서버의 전원이 들어옵니다.

 

2. 메인보드에 있는 ROM-BIOS가 실행 됩니다.

 

3. ROM-BIOS에 의해 서버에 장착된 하드웨어가 인식됩니다. 이때 하드웨어(CPU, MEMORY등) 물리적 손상체크와 초기화가 병행됩니다.

 ※ ROM-BIOS는 넓은 의미로 컴퓨터에 탑재된 프로그램 중에서 하드웨어와 가장 낮은 수준에서 입출력을 담당하는 프로그램을 가리킨다. 펌웨어이고, ROM-BIOS는부트프로그램을 검색하여 부팅을 진행하게 된다.

 

4. 하드웨어의 체크 및 초기화가 끝나면 ROM-BIOS는 부팅매체(DISK, CD-ROM, FLOOPY 등)을 검색하게 됩니다.

 

5. 검색된 부팅매체의 0번 섹터(대부분 MBR이라고 부름) 에서 Boot Program을 읽어들여 메모리로 로드합니다.

 - 이 ROM-BIOS는 LILO(Linux Loader)를 메모리에 적재한 후에 모든 제어권을 LILO에 넘겨주게 됩니다.

 

6. LILO는 입력된 커널 이미지로 부팅을 시작하게 됩니다. 그리고 몇개의 커널이 존재하는 서버라면 /etc/lilo.conf 파일에 lilo설정이 되어 있을것입니다.

 

7. LILO는 커널이미지를 메모리로 불러들입니다.

 

8. LILO에 의해 pid 0번 프로세스(swapper)를 실행합니다.

 

9 다시 pid 1번 프로세스(init)를 불러들입니다.

 

10. init 프로세스는 /etc/inittab 파일을 불러들입니다.

 

11. 이후로 /etc/rc.d/rc.sysinit 과

 

12. /etc/rc.d/rc 0 ~6 중에서 실행레벨에 맞는 파일이 실행됩니다.

(부팅레벨이 0이면 /etc/rc.d/rc0.d

부팅레벨이 1이면 /etc/rc.d/rc1.d

부팅레벨이 2이면 /etc/rc.d/rc2.d

부팅레벨이 3이면 /etc/rc.d/rc3.d .....)

리눅스에서 실행되는 거의 모든 프로세스들은 init 프로세스들에 의해 실행(fork)되는 셈입니다.

 

13. /etc/rc.d/rc.local 스크립트 수행합니다. (사용자가 리눅스서버에 새로 설치한 툴이나 프로그램을 부팅할때마다 자동으로 실행되게끔 하려면 이파일의 맨 마지막에 실행명령을 넣어두면 됩니다.)

 

 

퍼온곳 : https://www.linux.co.kr/linux/tip/boot_sequence/

https://en.wikipedia.org/wiki/BIOS

 

리눅스 시스템 부팅과정 이해.pdf

 

위 파일은 www.superuser.co.kr에서 퍼온것입니다.

구글로 검색하면 구할수 있으며 저작권에 문제가 있을시 즉각 삭제할 예정입니다.

I learned RHEL7(Red Hat Enterprise Linux V7) for 7days.. I am summarizing and note what I learned on this writing.

 

Contents Will be

1. Linux KERNEL & Devices

2. Boot Process & Systemd

3. Software maintenance

4. Local Storage Manager

5. Logical Volume Manager

6. Remote Storage Administration

7. User/Group Administration

8. Security Administration

9. Log File Administration

10. Basic Networking

11. Advanced Networking

12. DNS Configuration

 

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

아래는 PPT파일로 간단히 명령어와 설명을 정리한 것입니다.

 

간략히 정리한만큼 리눅스구조, 명령어를 이해하는데 내용이 부족할것입니다.

 

하지만 자료에 적힌 키워드를 바탕으로 인터넷에서 자세한 내용을 참고해 공부할수 있을거라 생각합니다.

 

 

리눅스 공부.ppt

 

 

 

소켓프로그래밍은 응용프로그램을 만들기 위해 접해야할 네트워크 프로그래밍의 기본이다.

기본이라는 말은 네트워크를 하거나 응용프로그램을 하는 사람이라면 당연 알아야된다는 말이다.

(전에 여러번 다루었었지만, 요즘 공학 소울이 많이 무뎌진것같아서 이런글을 포스팅해본다.)

 

소켓은 세션으로 이해해도 무관하다.

TCP/IP, UDP/IP 프로토콜은 클라이언트/서버 모델을 사용하는데

물리적계층-데이터링크계층-네트워크계층-전송계층-세션계층-표현계층-응용프로그램계층 으로

OSI7계층이 나뉘고

물리적계층-데이터링크계층-네트워크계층-응용프로그램계층으로

네트워크 4계층이 나뉘는데

 

소켓프로그램은 세션계층으로 볼수있다.

 

전송계층은 TCP, UDP

네트워크계층은 대표적으로 IP 프로토콜, ARP

데이터링크계층은 대표적으로 이더넷 프로토콜

물리적계층은 시리얼통신(RS232)등 통신표준으로 볼수있다. 

 

여기에 응용계층으로 HTTP, TELNET, SNMP, DNS, XMPP, SSL, SSH, SMTP, RIP, FTP 등

ICT를 하는 사람이라면 무엇하나라도 접하고 다루었을만한 친숙한 응용프로그램들이 있다.

 

이 TCP, IP 뿐만 아니라 다양한 응용프로그램들을 다루기위한 네트워크의 시작이

 

소켓프로그래밍이라 할 수 있다.

 

(네트워크계층, 데이터링크계층을 다루려면 커널을 다루어보자.)

 

일단, 소켓프로그램의 구조는 서버/클라이언트 모델을 따르는데 구현은 아래의 사진과 같다.

 

 

 

 

다음은 C로 간단히 구현한 서버측 프로그램이다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
void error_handling(char *message);
int main(int argc, char **argv)
{
int i;
int serv_sock;
int clnt_sock;
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
int clnt_addr_size;
char message[256];
int ending = 0;
if(argc != 2)
{
printf("Usage : %s <port>₩n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_STREAM, 0); //서버 소켓 생성
if(serv_sock == -1)
error_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET; //Internet protocol

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //Ip address
serv_addr.sin_port = htons(atoi(argv[1])); //Port
if(bind(serv_sock, (struct socketaddr*) &serv_addr, sizeof(serv_addr)) == -1) // 소켓에 주소 할당
error_handling("bind() error");
if(listen(serv_sock, 5) == -1) //listen stat 돌입
error_handling("listen() error");
clnt_addr_size = sizeof(clnt_addr);
while(!ending)
{
clnt_sock=accept(serv_sock, (struct sockaddr*) &clnt_addr, &clnt_addr_size); //연결 요
청이 들어오면 수락
if(clnt_sock == -1)
error_handling("accept() error");
scanf("%s", message);
write(clnt_sock, message, sizeof(message)); //전송할 데이터 쓰기, 이곳에 클라이언트에 보낼 데이터를 넣으면된다.
if(message[0] == 0x1b) ending = 1;
}
close(clnt_sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('₩n', stderr);
exit(1);
}

 

 

다음은 클라이언트측 프로그램이다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
void error_handling(char *message);
int main(int argc, char **argv)
{
int sock;
struct sockaddr_in serv_addr;
char message[30];
int str_len;
int ending = 0;
if(argc!=3)
{
printf("Usage : %s <IP> <port>₩n", argv[0]);
exit(1);
}
while(!ending)
{
sock = socket(PF_INET, SOCK_STREAM, 0); //서버 접속을 위한 소켓 생성
if(sock == -1)
{
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr)); //메모리 초기화
serv_addr.sin_family = AF_INET; //인터넷 주소 체계 저장
serv_addr.sin_addr.s_addr = inet_addr(argv[1]); //
serv_addr.sin_port = htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) //서버로 연결
요청
error_handling("connect() error");
str_len = read(sock, message, sizeof(message) -1); //데이터 수신, 서버에서 받은메시지를 가지고 서비스를 제공한다.
if(str_len == -1)
error_handling("read() error!");
message[str_len] = 0;

printf("Message from server : %s ₩n", message);
if(message[0] == 0x1b) ending = 1;
close(sock); //연결 종료
}
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('₩n', stderr);
exit(1);
}

 

위 예제로 비쥬얼스튜디어나, 이클립스 등으로 컴파일링해서 구현해본다면..

당신은 진정한 프로그래머 소울을 가진 사람이라 생각된다.

 

 

위키피디아 영문버전을 주로 참고하면서 공부해본다.

 

이더넷은 LANs(Local Area Networks), MANs(Metropolitan Area Networks)를 위한 컴퓨터 네트워크 기술이다.

1980년에 소개되고 1983년에 IEEE 802.3으로 표준화된 기술로 token ring, FDDI, ARCNET과 같은 와이어(Wired) LAN 기술중 단연 널리쓰이는 기술이기도하다. 그리고 요즘 이더넷 대신에 쓰는 네트워크 기술중 1순위는 Wired LAN의 다른것이 아니라 Wrieless 방법인 IEEE 802.11의 와이파이(Wi-Fi) 기술이다.

 

이게 중요한게 아니라 정말 궁금했던 본론부터 말해야겠다.

(나는 네트워크 스위치 프로그래머도 아니고 이더넷프레임 해더가지고 프로그램을 하는 사람도 아니다. 프로그램을 하더라도 상용화되어 있는 공개소스를 참고하여 응용프로그램을 만들고 OS레이어 프로그램을 하지는 않을 것이므로 이해하는 정도로 넘어가자. 이는 네트워크 프로그래밍, OS프로그래밍이 어렵다는것을 말하는것이 아니라 프로그래밍도 고유의 영역이 있고 프로그래머로써 분야전문가가 되려면 그만큼의 노력이 필요하지만 나는 다른 할일이 충분히 많이 있기 때문에 다른곳에 더 힘써야하고 이해하는 수준에서 공부해본다.)

 

 

이더넷 프레임 Structure

 

Layer 

Preamble 

Start of Frame Delimiter 

MAC

destination 

 MAC

source

802.1Q tag(optional)

Ethertype(Ethernet 2) or length(IEEE802.3)

Payload 

 

Frame check sequence(32-bit CRC) 

interpacket gap

 

7 octets(bytes) 

1 octect 

6 octets 

6 octets  

(4 octets) 

 2 octets

 46(42) -1500 octets

 4 octets

 12

 Layer2 Ethernet frame

 

 

 <------    64 ~ 1518(1522) octets                                      -------->

 

 Layer1 Ethernet packet

 <------                                     72 ~ 1526(1530) octets                                      -------->

 

 

 

○ Preamble and start frame delimiter

 - 이더넷 프레임은 7 octets Preamble과 1 octet SFD(start frame delimiter)로 시작한다. Preamble은 56비트 패턴의 1과 0비트를 반복하는 패턴이며 네트워크상의 디바이스들이 쉽게 시간 동기화 할수 있게 해준다. 이더넷은 Symbol Rate(symbol data) 대신에 preamble과 SFD를 보내는데 1개 프레임에서 이들의 패턴은 10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011 같다. IEEE 802.3-2012 section 3.1.1. and 3.2에 따라 Hexa로 표현하면 0x55 0x55 0x55 0x55 0x55 0x55 0x55 0xD5 이다. SFD 이후에는 MAC Address가 바로 나온다.

 

○ Header

 - Header는 Mac addresses와 EtherType, IEEE 802.1Q 태그로 구성된다. EtherType 필드는 2 octets으로 1500 값 아래는 Payload octets의 크기를 나타내고 1536(0x0600) 이상의 크기는 EtherType  종류의 의미를 가지고 payload 크기를 결정한다.  IEEE 802.1Q 태그가 표시되어 있다면 VLAN임을 의미하고 IEEE 802.1p 을 우선으로 고려해야한다.

EtherType인 이더넷프레임이라면 프레임의 길이는 interpacket gap이나 FCS(frame check sequence)에 의해 결정된다.

 

○ Payload

 - 데이터이다. IP 프로토콜을 사용한다면 IP Address와 같은 헤더가 있고 어떤 데이터가 있을 것이다.

 

○ Frame check sequence

 - The frame check sequence (FCS) is a four-octet cyclic redundancy check (CRC) that allows detection of corrupted data within the entire frame as received on the receiver side. The FCS value is computed as a function of the protected MAC frame fields: source and destination address, length/type field, MAC client data and padding (that is, all fields except the FCS).

 

○ End of frame

 - The end of a frame is usually indicated by the end of data stream at the physical layer or by loss of the carrier signal; an example is 10BASE-T, where the receiving station detects the end of a transmitted frame by loss of the carrier.

 

○ Interpacket gap

 - Interpacket gap is idle time between packets. After a packet has been sent, transmitters are required to transmit a minimum of 96 bits (12 octets) of idle line state before transmitting the next packet.

 

Reference from

-site-

 이더넷프레임 : https://en.wikipedia.org/wiki/Ethernet_frame

                       https://en.wikipedia.org/wiki/Ethernet

                       http://ktword.co.kr/abbr_view.php?m_temp1=2965&id=852

- 이 글은 ARP와 IP 패킷의 구조, - L2 스위칭과 L3 라우팅 시 데이터 Header의 변화 등을 설명합니다.

 

- 이 글을 쓰는 이유? : L2스위치와 L3스위치로 사내 네트워크 설계를 하려고 했는데 어떻게 설계를 해야할지 헷갈렸다. L2스위치는 MAC Address를 기반으로 패킷을 주고받고 L3스위치는 IP를 기반으로 패킷을 주고받는다고 하는데

막상 사용하는 응용프로그램은 IP를 다 넣고 소켓연결로 프로그래밍되어 데이터를 주고 받게 되어있다.

모두 IP를 사용한다는 얘기인데??

여기서 질문..

 

Q. 아니 MAC address를 기반으로 패킷을 주고 받으면 패킷헤더에 MAC address를 넣고 통신을 하게끔 하고 IP 기반이면 IP를 넣고 통신을 하는 프로그램을 짜서 동작하게 만들어야하는것 아닌가? 그리고 스위치도 구성도 그래야 하는것 아닌가??

 

그 해답을 얻기위해 이리저리 서핑하며 공부를 하던 중 답을 얻을수 있는 블로그포스트들에서 내용을 가져와 정리해본다.

 

일단,

1. Broadcast 개념을 알아야 한다.(Unicast, Multicast개념도 있다.)

2. L1(더미허브,리피터), L2(스위칭허브,브릿지), L3, L4 스위치 개념을 알아야 한다.

3. 이더넷 프레임 구조를 이해해야 한다.

 

A. Q에 대한 답은 결론부터 말하자면

프로그램 작성은 (일단)MAC Address기반, IP기반 데이터 교환방법 모두 IP기반으로 프로그램을 짜고

(스위치에서 알아서 테이블에 MAC, IP를 등록하고 MAC과 IP를 참조한다.)

스위치 구성은 동일 IP대역에 있는 서버, 클라이언트는 L2스위치로 구성하고

라우팅(게이트웨이역할)하여 외부 IP대역에 있는 서버, 클라이언트를 연결하려면 L3스위치로 구성한다.

 

물론, 모두 L3스위치로 구성하면 아무래도 상관없겠지만

가격, 보안 등의 이유로 스위치는 프로그램 계층과 프로그램 효율관계를 따져 구성해야 하겠다.

 

이때!!!

스위치에서 알아서 테이블에 MAC, IP를 등록하고 참조하는 방법이 모호했다.

그래서 찾아보았다.

스위치에서 알아서 테이블에 MAC, IP를 등록하고 참조하는 방법을 이해하기 위해

아래사진을 자세히 봐보고 이해해보자.

이더넷프레임 그러니까 데이터 송수신을 위한 하나의 프레임헤더의 정보를 통해

데이터 프레임을 스위치를 통해 목적지까지 보내는 과정을 이해해보자.

(특히, 흐름에 따른 헤더의 MAC, IP주소, 포트번호를 보자.)

 

좌측그림은 동일 네트워크(LAN) 위치에 있는 경우의 패킷 중 주소부분 헤더의 구성을 나타낸다.

 ○ Ethernet Header

  - Destination MAC : m2, Source MAC : m1

 ○ IP Header

  - Destination IP : 1.1.1.20, Source MAC : 1.1.1.10

Ethernet Header와 IP Header의 목적지(Destination)이 동일한 Client(PC)를 가리키고 있다.

(MAC을 보고 경로를 찾아간다.)

 

우측그림은 다른 IP대역 네트워크(LAN) 위치에 있는 경우 패킷 전달시 주소부분 헤더의 구성을 나타낸다.

 ○ Ethernet Header

  - ⓐ. (Destination MAC : a1, Source MAC : m1) -> ⓑ. (Destination MAC : m3, Source MAC : a2)

 ○ IP Header

  - ⓐ. (Destination IP : 2.1.1.30, Source MAC : 1.1.1.10) -> ⓑ. (Destination IP : 2.1.1.30, Source MAC : 1.1.1.10)

Client(PC)에서 보내질때는 Ethernet Header의 목적지(Destination)은 라우터(a1)으로 IP Header의 목적지(Destination)는 목적PC(2.1.1.30)으로 되며, 라우터를 거치면서 Ethernet Header가 바뀌고 IP Header는 바뀌지 않는다.(IP를 보고 MAC을 바꾸면서 찾아간다. 곧, IP를 보고 찾아간다.)

 

좌측그림과 우측그림 차이의 핵심은 MAC을 기준으로 경로를 찾아가는지 IP를 기준으로 찾아가는지이다.

(결국 ARP에 의해 MAC Header를 보고 찾아가지만 말이다.)

 

아래의 사진은 SCR1에서 SVR2로 패킷을 전달할때 일어나는 ARP Routing Table, ARP Table, MAC Table의 흐름을 나타낸다.

 

처음에 SVR1, S1은 IP나 MAC 아무것도 모르는 상태입니다.

그래서 클라이언트(PC)와 스위치는 이를 배워서 익혀야합니다.

이를 위해 일단 SVR1 ARP Request를 외부에 보냅니다.

SVR1헤더의 정보에는 1.1.1.20으로 보내려고 하는데 MAC은 모르고 그래서 전체에 다 보내봐서 알아봐 하며 FF:FF:FF:FF:FF:FF라고 해서 보냅니다.

스위치도 처음에는 모르기때문에 1.1.1.20 IP를 가진 장치에게 MAC을 보내달라고 전체 랜포트로 Flooding을 합니다.

그래서 스위치도 SVR2의 MAC주소를 알게되고 이를 SVR1에게 전달(유니캐스팅) 하여 SVR1도 ARP Table에 기록하여 서로의 IP에 대한 MAC을 알게됩니다. 

 

 

이렇게 되면 이제 처음에 궁금했던 Q(질문)에 대한 명쾌한 답이 나왔습니다.

IP를 활용해 소켓전송 등 프로그래밍을 짜서 네트워크 전송을 하면

Ethernet스위칭(L2스위치)이든지 IP라우팅(L3스위치)이든지 상관없이 데이터를 목적지까지 잘보내 처리할수 있게 해주는 것입니다.!!!!!!!!

L2스위치와 L3스위치를 구성할때

IP대역의 정보보안과 L3스위치 수동 라우팅테이블 구성시 정보보안만 고려하여 네트워크 설계를 하면 됩니다.

 

네트워크를 잘아시는 분에게는 왠 당연한 소리를 대단한것을 발견한다는 듯이 이야기하느냐고 할 수 있지만

시스템 설계시 프로그램 설계와 네트워크 설계의 관계를 고려하는 초보감독자로서 고민이 있었는데

이를 해소해주는 내용이 되리라 생각합니다.

 

 

Reference from

-site-

스위칭과 라우팅 : Netmanias(http://www.netmanias.com/ko/post/blog/5501/bridging-ip-routing-arp/switching-and-routing-part-1-ethernet-switching)

브로드캐스트 : http://jin-jin.tistory.com/entry/%EB%B3%B8%EB%AC%B8%EC%8A%A4%ED%81%AC%EB%9E%A9-L1-L2-L3-%EC%9E%A5%EB%B9%84

이더넷프레임 : https://en.wikipedia.org/wiki/Ethernet_frame, http://ktword.co.kr/abbr_view.php?m_temp1=2965&id=852

 

-article-


*문형

 

 1문형

 -주어 + 동사(완전 자동사)

2문형

 -주어 + 동사(불완전 자동사) + 주격보어

 -2문형에서 주로 쓰이는 동사:

   be,look,seem,keep,remain,stay,become,feel,taste

3문형

 -주어 + 동사(완전 타동사) + 목적어

4문형

 -주어 + 동사(완전 타동사) + 간접목적어 + 직접 목적어

 -주로 4문형에 쓰이는 동사(수여동사):

   give,tell,show,send,teach,buy

5문형

 -주어+ 동사(불완전 타동사) + 목적어 + 목적보어

 

 

 

*셀 수 없는 명사(불가산 명사)

 

 a(n) 를 앞에 쓸 수 없고 복수를 나타내는 -e(s)도 불가능

 information,furniture,luggage,equipment,advice

 

 

*한정사

 명사 앞에 쓰여 그 대상을 명확히 해주는 것

 ex)a,the,this,his

 특징- 하나의 명사에는 하나의 한정사만 옴.

          - 형용사와 함께 쓰일 경우, 한정사는 형용사 앞 에 위치.

 this[that] + 셀수 있는 명사의 단수형

 these[that] + 셀 수 있는 명사의 복수형

 this[that] + 셀 수 없는 명사

 a few 몇몇의, few 거의 없는, a little 약간의, little 거의 없는

 

 

 

*재귀 대명사

 문장의 주어와 목적어가 같을때 목적어 자리에 쓴다.

 주어, 목적어, 보어의 행위나 상태를 강조하기 위해 쓴다.

 by oneself(홀로, 혼자힘으로), for oneself(혼자힘으로)

 

 

*한 문장 안에서 바로 앞에 나온 명사를 가리 킬때에는 지시 대명사 this를 쓰지 않고 반드시 that을 써야 한다. 가르키는 명사가 복수 일 경우에는 those를 쓴다.

 

 

*

 ●,●   :one, the other(다른하나)

 ●,●,● : one, another(다른하나), the other(나머지 하나)

 ●,○,●,○.... : one, another(다른 하나)

 ●,(●,●),○,..... : one, others(다른 몇개)

 ●,(●,●,●,●....) : one, the others(나머지 전부)

 

 

 

*to부정사

ⓐ 두가지 시제

   - to +동사원형: 본동사보다 동시 혹은 이후에 일어났을 경우

   - to have p.p : 본동사보다 이전 시점에 일어 났을 경우

 두가지의 태

   -의미상의 주어와의 관계에 따라 능동, 수동.

ⓒ 목적어로 to 부정사를 취하는 동사  (아래의 부터 적힌 동사가 꼭 그렇게 쓰이지 않는다는 사실은 알아두자. 하지만 그렇게 많이 쓰인다.)

   -wish, hope, decide, choose,plan,learn, agree, fail, refuse, promise.. + to do

ⓓ 목적보어로 to 부정사를 취하는 동사

   - tell, encourage, persuade, order, warn, advise, remind + 목적어 + to do

 help + (to) do ~하는 것을 돕다

    help + 목적어 + (to) do   목적어가 ~ 하는 것 을 돕다.

 

 

 

*동명사

 동명사가 주로 쓰이는 동사

   - finish,quit, give up, avoid, postpone[delay], deny, consider, suggest, recommend, enjoy

 동명사나 to 부정사가 쓰이는 동사

   - like[love], hate, prefer, begin[start], continue.

 -look forward to doing  ~하는 것을 고대하다.

    -object to doing  ~하는 것에 반대하다.

    -be used to doing(be accustomed to doing)  ~하는 것에 익숙하다.

    -devote oneself to doing  ~하는 것에 전념하다.

 -go doing ~하러가다

    -feel like doing  ~하고 싶어하다.

    -be worh doing ~할 가치가 있다.

    -spend time[money] doing ~하는데 시간[돈]을 쓰다.

    -there is no use doing ~하는 것은 불가능 하다.

    -have trouble[difficulty] doing ~하는데 어려움을 겪다.

    -it is no use doing ~해봐야 소용없다.

    -cannot help doing ~하지 않을 수 없다.

    -on doing ~하자마자

 

 

 

*시제

 주절의 시제가 과거일 경우 종속절의 시제는 과거나 과거완료 시제만 가능

 when, after, before, as soon as, until, if 등과 같은 시간, 조건의 접속사가 쓰인 부사절에서는 미래의 일을 의미하더래도 항상 현재시제 사용.

 

 

*태

- be involved in ~에 관련되다.

- be satisfied with ~에 만족하다

- be filled with ~로 가득차 있다.

- be surprised at ~에 놀라다

- be known to ~에게 알려져 있다.

- be made of ~로 만들어지다.

 

 

*

 복수처럼 보이지만 단수

 - news, means, politics, physics

 단수처럼 보이지만 복수

 - police, people, cattle

- the number of ~ +단수동사 (~의 수)

- a number of~ +복수동사 (많은 ~)

- most of the 단수명사+ 단수동사

- most of the 복수명사+복수동사

 

 

*가정법

 가정법 과거

 - If + 주어 + 동사의 과거형~, 주어 + would[could,might] + 동사원형

      ~한다면, ~ 할텐데(~할 수 있을텐데)

 가정법 과거완료

 - If + 주어 + had + p.p. ~, 주어 + would[could,might] + have + p.p.~

      ~했다면, ~했을텐데

 혼합가정법 : 현재까지 영향을 주는 과거 사실을 반대로가정

 - If + 주어 + had + p.p. ~,주어 + would[could,might] + 동사원형~.

      ~했다면, ~할 텐데 (~할 수 있을 텐데)

 'if+주어+should'가정법 : 실현 가느엉이 희박한 미래의 일 가정

 - If + 주어 + should + 동사원형~, 주어 + would[will] + 동사원형~.

      ~라면, ~할 텐데

 - If + 주어 + should + 동사원형~, 명령문

      ~라면, ~ 하도록 하세요.

 'I wish' 가정법: 현재나 과거의 일에 대한 소망

 - I wish + 주어 + 동사의 과거형~.

      ~하면 좋을텐데...

 - I wish + 주어 + would[could] + 동사원형~.

      ~하면 좋을텐데...

 - I wish + 주어 + had + p.p.~

      ~했다면 좋을텐데..

 

 

 

*

- hardly(scacely) ~ when ...    ,  no soonder ~ than ...

         ~하자마자 ...하다.

- 형용사와 부사의 형태가 같은단어 :

  fast, late, early, high, hard,near, long, daily, quarterly

- ly가 붙어 전혀다른 뜻이 생기는 경우

  highly(매우), lately(최근에), hardly(거의 ~ 않다.), nearly(거의)

-The + 비교급, the + 비교급 (~하면 할 수록, 더 ~하다.)

 

 

 

*분사

 감정을 유발하는 현재 분사, 감정을 느끼는 과거 분사

exciting 흥분시키는, excited 흥분한

interesting 흥미로운, interested 흥미를 느낀

satisfying 만족할 만한, satisfied 만족스러운

surprising 놀랄 만한, surprised 놀란

boring 지루하게 하는, bored 지루한

confusing 혼란스럽게 하는, confused 혼란스러운

embarrasing 난처하게 하는, embarrassed 난처한

disappointing 실망스러운, disappointed 실망한

 분사 구문의 다양한 의미

-시간 : ~할때, ~ 한 후에, ~하는 동안

-이유 : ~ 이기때문에, ~ 이므로

-동시상황 : ~하면서 동시에

-연속동작 : 그리고 ~하다.

관용적 분사구문

-generally speaking  일반적으로 말해서

-considering ~을 고려하면

-judging from ~로 판단하건데

-granted ~이 사실이라 해도

 

 

 

 

*전치사

 전치사는 한 단어에 여러 뜻이 담겨져 있어서 어려운 부분이 있지만 일단 외우는게 왕도이고 뉘앙스 파악을 중요하더라.

 시간을 나타내는 전치사

 - in : ~에, 비교적 긴 시간인 '연도,계절,월','morning,afternoon,evening'앞에 쓴다.

 - on : '날짜, 요일' Monday morning 처럼 '요일 + morning[afternoon,evening] 앞에 쓴다.

 - at : '시각'과 'noon,night,midnight' 앞에 쓴다.

 - from : ~부터(지금 상황은 모르는 상태)

 - since : ~부터(지금까지 계속됨이므로 주로 현재완료와 쓰임)

 - for : ~동안(구체적 기간, ex)for ten years, for three months)

 - during : ~동안 (ex) during the convention , during the last recession

 - by : ~까지 (ex) He will complete the inquiry by thursday.

 - until : ~까지 (ex) Our service ceter is open until 6 o'clock.

 - in : ~후에

 - wihin : ~이내에

 - over : ~동안

 - through : ~동안 내내

장소를 나타내는 전치사

 - in[inside] ~안에

 - into ~안으로 <-> out of ~밖으로

 - at (지점) ~에(서)

 - on ~위에(표면에)

 - by[beside,next to] ~옆에

 - in front of ~앞에 <-> behind ~뒤에

 - over ~바로 위에 걸쳐서 <-> under ~바로 아래

 - between (둘) ~사이에, among (셋 이상) 사이에

 - for[toward] ~을 향해

 - through ~을 통과하여

 - along ~을 따라

 - a cross ~을 가로질러

ex) in China, in the city, at the airport, at the hotel, on the platform, on the wall

 

 수단, 목적의 전치사

 - by + 명사(~에 의해)

 - by + doing(~함으로써)

 - with ~와 함께,(도구,수단)으로

 - through ~로 통해

 - for ~위해

 - on ~로

 

 원인 이유를 나타내는 전치사

 - for (ex) I couldn't purchase the book for lack of money

 - from (ex) He suffered from overwork.

 - at (ex) She was surprised at the price reduction.

 

관련 주제, 분야, 자격을 나타내는 전치사

 - about (ex) How do you feel about the advertisement?

 - on (ex) The policy on tabacco sales was published.

 - over (ex) They argued over the solution.

 - of (ex) He told me the news of the accident.

 - in (ex) We should observe changes in the market.

 - as (ex) As a manager, he suggested the solution.

 

 - because of[due to, owing to]~때문에

 - in case of, thanks to ~덕분에, on behalf of ~을 대신해서

 - in addition to ~외에도(besides)

 - in spite of ~에도 불구하고(despite)

 - according to ~에 따라서

 - regardless of ~에 상관없이

 - regarding ~관해

 - including ~를 포함해서

 - concerning ~에 관해

 - excluding ~를 제외하고

 

 

 

*접속사

등위 접속사

- and 그리고, yet 그러나, or 혹은, so 그래서, but 그러나

상관 접속사

- both A and B    A와 B 둘다

- either A or B     A나 B 둘 중 하나

- neither A nor B    A도 B도 둘 다 아닌

- not A but B   A가 아니라 B

- not only A but B     A뿐만 아니라 B도

- B as well as A      A뿐만 아니라 B도

명사절 접속사

- that ~이라는 것,  wheter,if   ~인지 아닌지

부사절 접속사

- 시간

when (~할때,~하면), since(~한 이래로), before(~하기 전에), as(~할때)

by the time(~할때 까지), untill[till](~할 때까지)

while(~하는 동안에), as soon as(~하자마자)

after(~한 후에)

- 조건

if(만일 ~라면), as long as(~하는 한), in case(that)  (~한 경우에)

once(일단 ~ 하면), unless(만약 ~이 아니라면), provided(that) (~한다면)

- 이유

because (~이기 때문에), since(~이기 때문에)

as(~이기 때문에), now(that) (~이기때문에)

- 양보

though(비록 ~ 이지만), even though(비록 ~이지만),although(비록 ~이지만)

even if(비록 ~이지만)

- 방식

 as (~대로,~처럼)

- 목적

 so that (~하기 위해서), in order that(~하기 위해서)

 

 

 

*관계대명사

ⓐ 선행사의 격에 따른 관계 대명사의 종류

                     사람                     사물,동물

주격          who, that                   which, that

소유격       whose                       whose, of which

목적격       whom,who,that           which, that

관계대명사의 생략

-주격+be동사 & 목적격 생략 가능

ex) Members (who were) involved in the strike were fired.

      This was the capital (which) we expected to have.

-주격 & 소유격은 생략 불가

ex) We expanded the market which focuses on teenagers.

      The goods whose prices are cheap are exported.

 

관계대명사 that은 소유격으로 쓰이지 않고 전치사 뒤에 올 수 없다는 점을 제외하고는,

선행사의 종류와 격에 상관없이 모두 가능.

관계부사

-선행사의종류에 따라 구분되며 격에 따른 구분은 없다.

where,when,why,how

한정적 용법/계속적 용법

-한정적 용법의 관계사절은 불명확한 선행사를 수식해 의미를 구체화 하는 역할을 하고, 계속적 용법의 관계사절은 선행사가 이미 명확하므로 추가적으로 정보를 제공하는 역할을 한다.

ex) I work for a firm which has good prospects. (한정적용법)

     I work for Intel. Inc., which has good prospects. (계속적 용법)