포스팅 제목을 작성하려 하면 항상 어떻게 작성해야 할 지 고민되네요ㅋㅋ

이번 포스팅에서는 TCP/IP의 제 1계층인 물리계층에 대하여 좀 더 추가적으로 설명하는 방향으로 작성하려고 합니다.


OSI 7계층 중

1계층인 물리계층 , 2계층인 데이터 링크 계층은 알고보면 같은 하드웨어가 제어합니다.

보통 아직까진 전 세계적으로 이더넷 칩으로 많이 들어가 있습니다.

 처음에는 이더넷 보드로 많이 들어가 있었습니다. 하지만, 이더넷 보드가 점 점 줄어들고, 그냥 보드 속으로 들어가기 시작했습니다.

요즘에는 칩셋에 많이 들어가기도 합니다. 


TCP/IP가 막강한 이유는,

하위 계층( 물리계층, 데이터링크 계층)이 무엇이 오든 상관이 없습니다. 


만약 어느 회사에 신입사원으로 A,B라는 사람이 최종 면접까지 오게 되었습니다.

그런데 회사 면접에서, A라는 사람은 " 저는 제 아래에 누굴 붙혀주셔도 열심히 근무할 수 있습니다!" 라고 대답을 하였고,

B라는 사람은 "저는 아래에 꼭 붙힘성이 좋아야 되는 사람이 붙혀주셔야지 일할 수 있습니다."라고 이야기 했다.

그럼 당신이 사장이라면 누구를 뽑겠습니까?
아무것이나 올 수 있다는 것은 엄청난 것입니다. 즉, 미래에 아직 개발되지 않은 무언가가 개발이 된다면 "언제나 갖다 붙힐 수 있다"라는 엄청난 강점이 있다는 거죠. ( 모듈화 쨩..)

TCP/IP가 문제가 많은 프로토콜임에도 불구하고 지금까지 살아남을 수 있는 이유는 이러한 이유입니다..


그럼 하부에 무엇을 붙힐 수 있을까요?


1.LAN - Local Area Network ( ex wifi )

- 보통 AN은 Area Network의 줄임말 입니다. 그 지역을 커버하는 네트워크 라는 뜻입니다.

이 앞에있는 L은 네트워크의 크기를 말해주는 것입니다.

우리집 같은 경우도 로컬, 벤쳐도 로컬, 학교도 로컬 , 대기업속에서 사용하는 인터넷이 로컬단위입니다

2.MAN - Metropolitan Area Network (미국 NY 근처의 위성도시드를 Metropolitan 지역이라 말하죠! 우리나라로 따지면, 서울특별시 같은곳 이랄까..??ㅎㅎ ) 

- LA의 시장이나, 아니면 어디 주의 주지사가 자기의 마음을 먹고 그 동네에 통채로 네트워크를 설치하면 그것이 메트로 폴리탄 네트워크 입니다.

3.WAN - Wide Area Network - (LTE)

- 나라 전체를 커버하는 네트웍입니다. 우리나라같은 경우죠.

4. PAN - > Persnal Area Network  개인영역의 네트워크.

5. BAN -> Body Area Network.


1. 물리 계층과 데이터 링크 계층.

물리 계층 통신 형태.










와.. 그림 정말 직관적이죠?!ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 그리는데 진짜 힘드네여.. 댓글좀 꼭 달아주세요ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
bit으로 되어있는 스트림을 A에서 시작되고, B까지 보내는 것.

A에서 시작한 데이터는, 각 링크를 따라서 데이터가 전송이 됩니다. 물리 계층의 통신 형태로만 봤을 경우는 통신은 이렇게 진행됩니다.

TCP/IP는 물리 계층과 데이터링크 계층에서 특정 프로토콜을 규정하지 않고, 모든 표준과 기술적인 프로토콜을 지원합니다. 이 레벨에서 통신은 hop - to - hop / node - to - node 이거나, 컴퓨터 라우터 간의 통신입니다. 물론 통신 단위는 비트이며, 두 노드 간에 연결이 설정되면 비트 스트림이 연결에 따라 흘러가게 됩니다. 그렇지만 물리 계층은 각 비트를 개별적으로 처리합니다. 위에서 보신 그림은 노드간의 통신을 보여줍니다.

이 시점에서, 두 대의 컴퓨터 간의 서로 라우터 R1,R3,R4를 통하여 서로 통신하기 위한 가장 효율적인 방법을 알게 된다고 가정합시다.여기서 가장 큰 문제는, 효율적인 방법을 알아내는 것입니다.

만약 노드가 n개의 링크에 연결되어 있다고 하면, 각 링크 당 하나씩 n개의 물리 계층 프로토콜이 필요합니다. 

그림은 통신에 단지 하나의 물리 계층만 포함되어 있는것만으로 보여줍니다 각 컴퓨터는 단지 하나의 링크에 포함되어 있고, 각 라우터는 두 개의 링크에만 포함되어 있습니다. 그림에서의 컴퓨터 A,B간의 비트의 연결은 4개의 독립적이고 짧은 여행으로 이루어 집니다. 라우터 R1은 세 개의 물리 계층(두 개는 우리의 시나리오에서 보여준)을 갖습니다. 링크 1에 연결된 계층은 링크1에 사용되는 프로토콜 형식에 따라 비트를 받습니다. 링크3에 연결된 계층은 링크 3에서 사용되는 프로토콜 형식에 따라 비트를 보냅니다.. 포함되는 다른 두 개의 라우터도 같은 상황입니다.

물리 계층의 통신 단위는 비트이다.


여기에서 데이터 링크 계층의 통신 형태로 보면 조금 차이점이 있습니다.

데이터 링크 계층

먼저 그림 보고 갈게요..

데이터 링크 계층의 통신 형태








Datalink계층에서 데이터는 Datalink->physical -> physical -> Datalink  이런식으로 반복적으로 이동하게 됩니다. 


2계층이니 hop - to - hop으로 전송을 하게 됩니다.


TCP/UDP는 데이터링크 계층에 대해 특정 프로토콜을 규정하지 않습니다. 모든 표준과 프로토콜들은 이를 지원합니다. 이 레벨에서도 통신은 (두 홉 or 노드) 간의 통신입니다. 그렇지만 통신 단위는 프레임(Frame - 2계층의 봉투)이라는 패킷입니다. 프레임은 네트워크 계층으로부터 받은 데이터에 헤더가 더해지고 트레일러가 더해짐으로 캡슐화가 된 패킷입니다.

통신 정보 가운데 헤더는 프레임의 발신지와 목적지를 포함합니다. 목적지 주소는 노드들이 링크에 연결되어 있기 때문에, 프레임의 정확한 수신자를 규정하는 데 필요합니다. 발신지 주소는 프로토콜에 의해 요구될 수 있는 가능한 응답이나 확인응답을 위해 필요합니다.

컴퓨터 A 와 라우터 R1 간의 이동하는 프레임은 라우터 R1 과 R3 간에 이동하는 프레임과 다르다는 것을 주목해야 합니다.

프레임이 라우터 R1에 의해 수신될 때, 이 라우터는 왼쪽에 나타나있는 데이터 링크 프로토콜로 프레임을 전달합니다.(왼쪽 - Link1에서 사용하는 프로토콜로 전달 한다는 것) 프레임은 개방되고 데이터는 제거 됩니다. 그러면 데이터는 라우터 R3로 보내지는 새로운 프레임을 생성하기 위하여 오른쪽(Link2에서 사용하는 프로토콜을 사용하여 ) 에 나타나 있는 데이터링크 프로토콜로 보내집니다. 이유는 링크 1과 링크 3이 서로 다른 프로토콜을 사용하게되면 서로 다른 형식의 프레임이 요구됩니다. 또, 그림에는 프레임의 물리적인 이동은 보여주지 않았습니다. 물리적인 이동은 물리계층에서만 이루어 집니다. 두 노드는 데이터링크 계층에서 논리적으로 통신하는 것이지 물리적이 아닙니다. 

다시 말하면, 라우터 R1에 있는 데이터 링크 계층은 프레임을 컴퓨터 A에 있는 데이터링크 계층으로부터 직접 보낸 것으로 생각합니다.

A에서 R1으로 보내지는 것은 한 물리 계층에서 다른 물리 계층으로 가는 비트 스트림입니다. A에서 프레임은 비트 스트림으로 변환되어 지고, R1에서 비트들은 프레임으로 전환되는데, 이는 프레임이 교환되는 두 데이터링크 계층을 이해하는 데 도움을 줍니다.

데이터 링크 계층에서의 봉투 단위는 Frame입니다.




3계층으로 와봅시다.

네트워크 계층.


네트워크 계층의 통신 형태



2계층까지는 방금 그림처럼, 하드웨어로 제어가 됩니다. 근데 3계층은 1,2계층처럼 어렵진 않습니다. 

3계층의 TCP/IP는 인터넷 프로토콜(IP)를 지원합니다.

IP : Internet Protocol - TCP/IP 프로토콜에서 사용되는 전송 메커니즘.

- 인터넷은 수 없이 많은 프로토콜로 구성되어 있습니다. 그 중 프로토콜의 하나의 이름이 IP라는 놈이 있습니다. 막강한 놈이죠!!! 얘가 있기 때문에 지금까지 다른 프로토콜이 살아남을 수 있었던 겁니다!!!(이유는 나중에 한 포스팅으로 따로 분리하여 설명하도록 하겠습니다.)

(ARP,RARP,IP,ICMP,IGMP)

IP는 한 문장으로 말할 수 있습니다. "신뢰성 없는 비연결형 데이타그램 (Datagram) 프로토콜! "

한국 사람이 데이터그램을 "떠돌이"라고 정의를 했습니다. 인터넷이라는 바다가 있습니다. 우리가 구글에 패킷을 딱! 쏘면~ 패킷이 구글까지 가야되는데, 구글까지 가는동안 패킷이 바다를 둥둥~~ 떠다닙니다. 이러다가 어떻게든 구글에 도착하고, 구글이 응답을 하면 이 응답도 바다에 둥~둥 떠다니다가 우리에게 응답이 오게 됩니다.

떠돌이는 가족이 없습니다. 그렇기 때문에 이 세상에서 자기만 혼자이기 때문에 다른 사람과 연관이 없습니다. 이렇기 때문에 인터넷에 엄청난 수의 떠돌이들이 돌아다닙니다. 그러다가 중간에 죽기도 하고(손실) 도착도 하기도 합니다.

그리고, 중복될 수 있습니다. ( 죽었다 라고 생각됬지만, 알고보니 살아있던거죠ㅋㅋㅋ. 3계층에서 죽을 수 있었지만, 4계층이 신뢰성을 보장하기 때문에 재전송을 할 수 있습니다. - IP는 경로를 기록하지도 않고, 자신의 목적지에 도착하면 데이터그램을 재조정하는 기능을 가지고 있지 않습니다.)

이와 같이 에러가 발생할 수 있기 때문에 에러가 많은 프로토콜이라 생각합니다.( 다른 이유도 많죠.)

하지만 IP는 이렇게 말합니다  "나는 !! 최선을 다 했어!! -Best-Effort!!" - 하지만 오류검사나 추적을 제공하지 않습니다.

매우 안좋게 보이죠?

하지만 이것이 전 세계를 석권했습니다. 그 이유는. Internet를 관리하는 곳을 본 적이 있나요??

우리 학교 네트워크는 학교에서 관리하고, KT는 KT에서 관리하고, 이런 네트워크가 모여서 Internet이 됩니다.

하지만 이걸 다 묶어서 한번에 관리해 주는 사람이 없습니다. 그렇기 때문에 저희가 노트북으로 AP를 종료하고, 연결하고 할 때 따로 승인을 받거나 이러지 않아도 되는겁니다.(지금 이 순간에도 어느 네트워크는 부팅되고 있고, 어떤 네트워크는 종료되고 있다는게 그 증거죠.)

종료된 네트워크에는 도착할 수 없기 때문에, 전송된 데이터는 죽습니다. 그럼 이런 궁금증을 갖을 수 있죠.

종료된 네트워크에 무조건 도착을 해야한다면? -> 그렇다면 종료된 네트워크가 켜지기 전 까지 데이터를 기다려줄 저장공간은? 종료된 네트워크에 어떠한 요청이 올 줄 알고? 주소를 잘못 작성하여 잘못 요청이 왔다면? 어떻게 할겁니까? - Super Count Example!!! 훗훗훗훗훗 메롱~


IP에 대해서 설명이 조금 길어졌죠??ㅎㅎㅎ;;






ARP(Address Resolution Protocol)

->전화번호를 생각하면 쉽습니다. 전화번호에 우리가 이름을 넣으면 전화번호가 나옵니다.( ip주소를 넣어주면 물리주소로 알려준다)

그리고 전화번호가 생각나지만, 이름이 생각나지 않을 수 있습니다. 이럴경우를 대비해서

RARP(Reverse ARP)가 있습니다. (물리주소 - > IP주소로 변환)

->4월 말이나 5월 초에 포스팅 할꺼에여..

ICMP (Internet Control Message Protocol) - 문제점을 통지할 필요가 있을 경우, 문제점을 알려주는 프로토콜이다. 



A가 B에게 데이터를 전달 하려고 하면, R1,R3,R4를 걸쳐서 전달 되죠?  이 경로를 찾아주는 것이 3계층의 역활입니다.

경로가 결정 되면, A는 R1에게 전달 하라고 2계층에게 전달합니다. 그럼 R1에게 전달 되고, R1의 네트워크 계층이 다시 R3에게 가라고 2계층에게 명령을 하면, 전달되고 하는 방식으로 전달이 됩니다.


네트워크 계층에서의 통신과 데이터링크나 물리 계층에서의 통신 간에 주요 차이점이 있습니다. 네트워크 계층의 통신은 종단 대 종단인데 반하여 다른 두 계층 간의 통신은 노드 대 노드입니다. 컴퓨터 A에서 출발하는 데이터그램은 컴퓨터 B에게 도착하게 됩니다. 라우터의 네트워크 계층은 가장 최적의 경로를 찾기 위해 패킷의 발신지와 목적지를 조사할 수 있습니다. 그러나 이들은 패킷이 내용을 변경하는 것은 허용하지 않습니다. 물론, 통신은 논리적인 것이지 물리적인 것은 아닙니다. 

컴퓨터 A와 B의 네트워크 계층이 데이터그램을 보내고 받는 것으로 생각하지만 실제 통신은 물리 계층에서 이루어집니다.




전송계층

전송 계층의 통신 형태.


전송 계층과 네트워크 계층 사이에는 큰 차이점이 있습니다. 물론 네트워크에 있는 모든 노드들이 네트워크 계층을 갖는 것이 필요하지만 단지 두 컴퓨터만 전송 계층을 가질 필요가 있습니다. 네트워크 계층은 컴퓨터 A로부터 컴퓨터 B까지 개별적인 데이터그램을 보내는 책임을 갖지만, 전송 계층은 A에서 B까지 사용자 데이터그램, 패킷, 세그먼트라는 전체 메시지를 전달하는 책임이 있습니다. 세그먼트는 몇 개 또는 몇십 개의 데이터그램으로 이루어질 수 있습니다. 세그먼트는 데이터그램으로 나뉠 필요가 있고 각 데이터그램은 전송을 위해 네트워크 계층으로 전달되어져야 합니다. 인터넷은 각 데이터그램에 대해 서로 다른 경로를 지정하므로 데이터그램은 순서가 바뀌어 도착하거나 손실될 수도 있습니다. 컴퓨터 B에 있는 전송 계층은 모든 데이터그램이 도착되어, 조립되고, 세그먼트로 만들어질 때 까지 기다려야 합니다.

우리는 두 전송 계층이 서로 세그먼트를 이용하여 통신하는 것으로만 생각하지만 통신은 물리 계층에서 비트 교환을 통하여 이루어 집니다.


전통적으로, 전송 계층은 TCP/IP프로토콜에서 두 개의 프로토콜에 의해 표현됩니다.( 최근에 SCTP(Stream Transmission Protocol)라는 프로토콜이 발표되긴 했습니다.)



전송계층에는 2개의 프로토콜이 있습니다.

1. TCP/IP

2. UDP


UDP는!

우리가 소켓 프로그래밍 할 때 두개중 하나를 많이 선택합니다.

선택을 할 때, 이름을 주의깊게 보면 좋습니다. 그 중 UDP는 User Datagram Protocol 입니다. 이름 중 Datagram이 붙어 있으니, 떠돌이 입니다. 떠돌이들은 서로 연관관계가 없기 때문에 신뢰성이 없습니다. (전체적으로 신뢰성이 없는 프로토콜 입니다.) Datagram Protocol 입니다. Datagram이 포함되어 있지만, IP와 구분이 되기 어려워서 User가 붙었습니다. 그래서 IP위에 있다고 해서 User Datagram Protocol입니다.

특징.

- 데이터 그램의 상호 연관성 없이 단순 전달한다.

- 패킷의 손실, 중복 전달, 비 순서적 전달 발생 가능합니다.


TCP는!

Transmission Control Protocol 의 줄임말입니다.

제가 이전에 들었던 미쳐버린 파닭 사장님의 이야기와 비슷합니다.

제가 친구에게 1000원을 전달해 주라고 하면, 그 돈이 전달되었다고 하기 전 까지 1000원을 계속해서 전달해 주는겁니다.( 이터가 갈 때 까지 계속 전송한다. - 전송을 제어하는 프로토콜이라 말한다.)

특징.

- 연결 설정 후, 스트림(Stream) 형태로 데이터 전달.(우리가 전화를 하면, 계속적으로 연결되어 있다. 말을 안해도 주변 잡소리들도 다 전송이 된다. 그렇기 때문에 연결되어 있는 시간대로 요금이 청부된다.)

- 패킷들은 상호 연관성을 가짐

- > 즉,순서 정보를 가진다. 순서 정보를 가지고 있으면, 누가 없어졌는지 알 수 있다. 예로들면, 우리가 어릴 때 소풍을 가면 번호대로 많이 앉아 있다. 다른반 쌤들은 그 번호를 이용해서 누가 빠졌는지 확인할 수 있었다.

-> 빠져있는 데이터를 받을때 까지 재전송한다.

-> 하지만 전송 중, 빠졋다고 생각되는 데이터가 뒤늦게 도착 하여도, 수신자는 그 데이터를 무시한다( 버려버림!!) 


전송 계층의 통신 형태


전송계층은 통신을 하지 않는다. 전송계층은 end - to - end 통신이기 때문이다. 전송 계층은 중간 노드를 방문하지 않음. 그렇기 때문에 우리가 응용프로그램을 만들 때, end 와 end이 통신할 수 있도록 프로그램을 만들어야 합니다.




정의 인용 및 참고한 서적 : TCP/IP프로토콜 제4판(Behrouz A. Forouzan) - MccGraw-Hill Korea 출판사.


해당 포스팅은 알고리즘에 대한 첫 포스팅이므로 알고리즘에 대한 이론을 다루는 포스팅 입니다.

대학교 강의(단국대학교) 수업을 강의 한후 작성한 포스팅이고 ,해당 포스팅에선 예시코드를 제시하지 않았습니다.



Problems and solutions의 문제.

- a problem will normally have many usually infinitely many instances

 문제는 보통 많은 무한한 인스턴스(경우 문제 예)를 가지고 있다.


problem P f:D->R

P is solved if there is an algorithm to compute f

P is unsolved if there is no algorithm to compute f

P unsolvable if it how been proved that there can be no algorithm to compare f



what is an algorithm?


- must work correctly on every Instance of the problem

- a finite sequence of instructions such that.


1. each instruction is definite and effective

2.output is collect

3. an execution of the instructions should terminate.(매우 중요)


->이 3가지 조건을 만족해야 알고리즘이다.


Necessary conditions

1. inputt : 0 or more(1,2,3,4....etc)

2. output : 1 or more.

3. definiteness : deterministic , not ambiguous

4. firiteness - 당장 메모리도 무한이 아니니까.

5. effectiveness


*Steps involved in writing a program to solve a given problem.


1. problem formulation.

2. specification : mathmatic modeling (수학적 모델을 쓰는게 정답이지.. 보통 그림으로 설명을 많이 해서 쉽게 배우지만 응용이 안되는거죠)

3. design of the solution -> algorithm design

4. implementation - os,language,data structure

5. testing & debugging

6. documentation - 메뉴얼

7 evaluation of the solution(analysis) 평가



*Analyzing Algorithm (complexity of Algorithm)

-given a problem , once we have an algorithm


-how do we compare this algorithm with others?

=> the rate of growth of the time or space

required to solve larger and larger instance of the problem


the size of the problem - > input size(n)






the size of the problem - > input size ( size는 예를들어 웹 사이트에 접속하는 사람의 수.)


Algorithm A 는 꾸준한 성과를 보이는 알고리즘이다.

하지만 Algorithm B는 처음에는 성능이 좋지 않다가, 많은 input이 들어오는 상황에서는 좋은 퍼포먼스를 발휘한다.


대부분 기업이나 회사에서 , 요구사항에 맞춰 개발을 하다보면, 내가 개발한 프로그램에서, 사용자가 얼마나 접속할지는 잘 모르는 것이다.

하지만 보통 많은 테스트를 거치지 못하기 때문에, 배포 이후 패치를 진행하는 것이다.


* Complexity : 복잡도 - 복잡도가 제일 어려운 개념이다.


1. space complexity : A function that. maps problem size(x축의 size를 주면) into space(이론적의 메모리) required to solve the problem


2. time complexity : A function that maps problem size into time required to solve the problem.

e.g sorting problem - > 이것의 이해도가 Data structure를 얼마나 이해 했느냐를 알 수 있다.


Asymptotic Time Complexity (기사 시험 단골 문제) : 점근 시간 복잡도


limiting behavior of the complexity of size increases


입력 데이터 수를 n이라고 하고 시간 복잡도를 표현할 때 n이 무한히 큰 경우로 국한 시킨다. 입력 크기(n)를 무한히 크다고 가정한 후 함수 값을 비교해 보면 logn<n<nlogn<n²<n³<n!<2 이다. 따라서 logn의 복잡도를 가진 알고리즘이 다른 알고리즘에 비해 효율성이 좋다고 할 수 있다.

( Big Oh notation -빅오 표기법 / Ω(Omega) notation / Θ(theta) notation / little oh notation / ω(little omega) notation 이 있다.)

(참고자료 : http://daisuki_.blog.me/140099551701 )

 

하이시떼루여~~ 굿! 할뤼이데이 데쓰네여~~


어제는 OSI와 프로토콜에 대해서 간단히 포스팅을 했습니다.

지금부터 OSI 7 Layer(OSI 7 계층)에 대해서 공부하죠. ( 상남자 멋쪄잉ㅎ..ㅎ )

OSI 7 Layer는 통신 프로토콜을 코딩(작성)하기 위해서는 반드시 필요한 개념입니다.

저 또한 레시피 큐레이션 서비스(Flook)를 개발하고 소멤에 발표 준비를 할 당시, OSI모델에 대해서 공부를 했었어요!

OSI 모델은 쉽게 말하면 Pear - to  - Pear 통신이라 말 할수 있어요! 즉 7계층은 7계층끼리만 이야기 할 수 있고, 6계층은 6계층끼리, 이런식으로만 이야기 할 수 있기 때문에, 특정한 계층이 변경이 되어도 다른 계층에는 전혀 영향을 주지 않습니다.

OSI 7 Layer를 이해하기 위해서는 그림이 반드시 필요하다고 생각합니다 ( 저도 급해서 그림만 외운 기억이 있네요.)




인터넷에 떠돌아 다니는 그림이 많지만, 마음에 드는 그림이 없어서 직접 타이핑 했습니다.


아래서 위로 1계층~ 7계층 입니다.(물리,데이터링크,네트워크,전송,세션,표현,응용 계층이라 부릅니다)


7개의 계층은 3개의 그룹으로 나눌 수 있습니다. 

- 1,2,3계층은 물리계층,데이터링크 계층, 그리고 네트워크 계층으로 한 장치에서 다른 장치로 데이터를 전송할 때 필요한 물리적인 면(전기적인 규격,물리적인 연결,물리 주소,전송시간과 신뢰도) 을 처리합니다.


- 5,6,7계층인 세션계층,표현 계층, 응용 계층은 사용자 지원 계층으로 생각될 수 있습니다. 이들은 서로 관련이 없는 소프트웨어 시스템간의 상호 연동을 가능하게 합니다!.


- 4계층인 전송계층은 지금 설명한 두 그룹을 연결하고, 하위 계층에서 전송한 내용을 상위 게층이 사용할 수 있는 형태가 되도록 보장한다. OSI 모델의 상위 계층은 거의 대부분 소프트웨어로 구현된다. 하위 계층은 대부분 하드웨어로 구성되는 물리 계층만 제외하고 하드웨어와 소프트웨어의 조합으로 구성된다.



1계층 - 물리계층(Physical Layer)

해석을 먼저 조금 갈까요..? To transmit bits - bit 단위로 보낸다. over a medium 매체 위에서. to provide mechanical 한 기계의(기계적으로) and electrical specifications 전기 규격에 의해서. (물리계층 - > 물리계층으로 전송)

즉, 직역하면 물리 계층은 물리 매채를 통하여 비트 스트림을 전달하는 데 필요한 기능들을 조정한다. 여기서는 전송매체와 인터페이스의 기계적이고 전자적인 규격을 다룬다.


물리계층의 특징.

1. 인터페이스와 매체의 물리적인 특성.

- 물리 계층은 장치와 전송 매체 간에 인터페이스의 특성을 규정한다. 이는 또 전송 매체의 유형도 규정한다 (다음주 중 자세하게 포스팅 할 예정)


2.비트의 표현.

- 물리계층은 해석되지 않은 비트의 스트림(0과 1의 연속) 으로 구성되어 있다. 전송되기 위해서 비트는 신호로 부호화 되어야 한다. 물리 계층은 부호화(encoding)의 유형을 규정한다( 0과 1로 어떻게 바뀌는지.)


3. 데이터 전송률 

- 전송률(초당 보내지는 비트의 수)도 물리 계층에서 규정된다. 다시 말하면, 물리 계층은 비트가 얼마나 길게 유지되는 가인 비트의 주기를 규정한다.


4.비트의 동기화

- 송신자와 수신자는 같은 비트율을 사용할 뿐만 아니라 비트 레벨에서 동기화( 시간적으로 )되어야 합니다. 만약 송신자가 12시 0분에 전송을 했어도, 수신자가 12시가 아닌 12시 1분, 혹은 11시 59분부터 전송된 데이터를 받는다고 가정하면 데이터의 이질감이 생기기 때문입니다.


5.회선 구성.

- 물리 계층은 매체에 대한 장치들의 연결과 관련 있다.

점 - 대 - 점(point to point configuration) 에서 두 장치는 전용 링크를 토하여 연결된다.

( 여기에 자세한 설명이 나와 있어용~> http://blog.naver.com/ryungtek/40111437571 )

다 중 점 (multipoint configuration) 에서 링크는 여러 장치에 의해 공유된다.

다중점은 , 수업시간에 교수님과 학생들이 이야기 할 때, 강의실에 있는 모두가 같이 대화할 수 있는것을 다중점이라 한다.


6. 물리적 접속형태

- 물리적 접속 형태는 장치들이 네트워크를 만들기 위해 어떻게 연결 되는지를 규정한다. 종류들을 살펴보자.

1. 그물형 접속형태(mesh topology - 모든 장치는 다른 모든 장치들과 연결되어 있음.)  - 그물형 접속 형태는, 특정한 장치는 모든 장치랑과 연결이 되어 있기 때문에, 어느곳이나 한번에 갈 수 있다. 속도가 매우 빠르며 비용이 많이드는 접속형태이다. (완전 연결형이라 부르기도 한다. 슈퍼컴퓨터에서 사용.) -( 점 대 점 )

2. 성형 접속형태(star topology - 장치들은 중앙 장치를 통하여 연결) - 성형 접속 형태는 , 연결해 있는 중앙 장치가 있기 때문에 모든곳이 한번을 거쳐서 갈 수 있다. 하지만 중앙장치가 고장이 나면, 모든 곳의 통신이 두절된다. - 주로 가정의 공유기로 예를 들 수 있다. ( 점 대 점 )

3. 링형 접속형태 (ring topology - 각 장치는 링을 구성하도록 이웃하는 장치와 연결) - 한 장치는 2개의 연결상태를 가지며, 원형 큐 (Circular Queue)형태로 연결되어 있다. 한 장치가 고장이 나더라도, 고장나지 않은 방향으로 모든곳의 통신이 가능하다. 하지만 두 개 이상이 고장이 나면 통신이 두절된다. - 많이 사용하는 곳은 공장이다. 공장의 노드가 고장이 날 확률이 1%라고 하자. 그러면 두 개 이상 고장이 날 확률은 0.01%이기 때문에 공장에서 많이 사용한다. ( 점 대 점 )

4. 버스형 접속형태 (bus topology - 모든 장치가 공통 링크 상에 있음.)  - 모든 장치는 하나의 연결 통로를 공유하는 형태이다. 옛날 학교와 같은 곳에서 사용하던 방법이다. 이 연결이 제일 저렴하다.( 다중점 )


7. 전송 모드

-물리 계층은 두 장치사이의 전송 방향(단방향,반이중,전이중)도 규정한다. 

단방향 모드(simplex mode - 학교방송) 에서 어느 한 장치는 보내기만 할 수 있고 다른 장치는 받을 수만 있다. 단방향 모드는 한 방향 통신이다. ( 학교 방송 )

반이중 모드(half duplex mode-무전기) 에서 두 장치는 보내고 받을 수 있지만 같은 시간에는 안 된다. 양방향 통신이다.( 무전기 )

전이중 모드(full-duplex mode - 전화 )에서는 두 장치는 같은 시간에 보내고 받을 수 있다. 양방향 통신이다.( 전화기 )




1계층에 대해석 간략하게 설명 했는데요. 이 부분은 소프트웨어 개발자들이 필수적으로 알아야 할 사항보단, 전자과 학우들이 알아야 할 부분이라고 생각합니다. 하지만, 개발자들도 기초지식은 이정도는 알아야 한다는 부분을 작성했습니다.




2계층 - 데이터 링크 계층(Datalink Layer)

To organize bits into frame - bit를 frame 단위로 만든다(구성한다). 보통 2계층의 단위는 Frame이다. 하나의 봉투 혹은, 쌀 가마 라고 생각하면 쉬운데, 쌀 하나하나(bit)를 쌀 포대(Frame)에 담어서 윗 계층에게 주는 역할을 한다.

to provide hop-to-hop delivery - 홉 단위로 전해준다, 라는 의미이다. 여기에서 홉을 어떻게 설명해야 할까 고민을 많이 했었다. 그러던 도중 이어 달리기가 생각이 났다. 이어달리기는 출발점 부터 바통을 들고 먼저 결승점을 통과해야 하는 경기이다. 여기서 바통은, 첫 주자가 다음주자에게, 그 다음주자는 다다음 주자에게, 이렇게 전달이 된다. 이런식으로 전달이 되는것을 hop- to - hop이라 부른다.

(여기에서 데이터 링크가 물리 계층에게 포장되어 있는 쌀을 줄 때, 쌀을 한톨 한톨씩 주는 것이 아니라, 그 쌀 포대의 위치(포인터)를 준다.)



-> 물리계층의 있는 그대로의 전송 설비를 신뢰할 수 있는 링크로 변환한다. 이는 상위 계층인 네트워크 계층에게 오류 없는 물리 계층으로 보이도록 한다.

데이터 링크 계층에 대해서 자세히 보자.


우리가 매일 사용하는 데이터 링크 계층은 신뢰성이 있을까??

우리가 사용하고 있는 데이터 링크 계층은, 무선랜 , LTE , 이더넷이 있다.

이 중 무선랜과 이더넷은 재전송을 하지 않는다. 하지만 LTE 같은 경우는 신뢰성 있는 통신을 보장한다.(LTE는 우리가 돈을 내고 쓰는 비싼 자원이기 때문에 신뢰성을 보장한다.-2계층에서 재전송을 해줌.)

이더넷과 무선랜은, 4계층 행님께서 재전송을 책임져 주신다..^^;;다행이죠?

재전송을 하기 위해서는 헤더를 이용하는데, 여기에서 특이한 점이 있다면, 2계층은 트레일러(T)를 사용한다. 


1. 프레임 구성.

- 네트워크 계층으로부터 받은 비트 스트림을 프레임(frame)이라는 데이터 단위로 나눈다. : 사실 이 부분은 OS의 지식이 필요합니다. 실제로 3계층과 2계층은 따로따로 개발된 모듈입니다. 즉 그렇다는건, 3계층에서 실행되고 있는 프로세스와 2계층에서 실행되고 있는 프로세스끼리 통신을 해야 한다는 뜻이겠죠. 2계층과 3계층이 통신하는 방법을 알려면 OS의 대한 기초지식이 있어야 합니다. OS 지식을 활용하여, 두 계층간의 통신 방법은 두가지가 있습니다.  첫번째는, 메시지 패싱이 있고, 두번째는 쉐어드 메모리가 있습니다.

사실 쉐어드 메모리는 구현하긴 어렵지만 이론상으론 쉬우니까 쉐어드 메모리로 설명을 해보죠ㅎㅎ

쉐어드 메모리는, 메모리에 데이터를 씁니다.그리고, 3계층이 2계층에게 "야~ 데이터 써놨으니까 가져가라~~" 이런식으로 Signal을 보내고 / 호출을 합니다.

그리고 2계층은 그 메모리에 가서 데이터를 읽어옵니다.( 그 주소는 포인터겠죠!?- 이 부분을 모르면 자료구조를 알아야 해염.. )

- 2계층의 봉투의 이름은 Frame이다 - 이 봉투에 헤더를 작성해야 하는데, 그 내용은 물리주소 작성(받는 사람과 받는 사람의 주소)한다. 

- 물리주소는 가지고 있는 하드웨어의 갯수만큼 있으며, LTE,무선랜,블루투스 주소가 각각 존재한다.

- 주소는 16진수로 표기되며 MAC(Media Access Control)주소라고도 부른다.



2. 물리 주소 지정.

-프레임이 네트워크 상에 서로 다른 시스템에 분배되어진다면 데이터링크 계층은 프레임의 송신자 그리고/또는 수신자를 지정하기 위해 프레임에 헤더를 더한다(encapsulation) 만약 프레임이 송신자 네트워크가 아닌 다른 네트워크에 있는 시스템이라면, 수신자 주소는 다음 네트워크로 가도록 연결된 연결 장치의 주소가 된다.


3. 흐름 제어.

- 수신자에 의해 처리되는 데이터율이 송신자가 보낸 데이터율보다 낮으면 데이터링크 계층은 수신자가 흐름 제어 메커니즘이 수행된다.

-> 인강을 x2배속으로 하면 귀에 잘 들어올리가 없다. 즉, 모든 세계에 있는 모든 컴퓨터가 속도가 같을 순 없다. 속도는 cpu와 메모리에 따라서 많이 차이가 난다.

그럼, 한 컴퓨터가 다른 컴퓨터에게 데이터를 보낼 때, 성능 좋은놈이 성능 안좋은 놈한테 자기의 최고 속도에 맞춰서 데이터를 보내면, 속도가 느린놈이 데이터를 다 받아들이는 것은 아니죠.  그렇기 때문에, 느린놈(수신자)의 속도에 맞춰서 보냅니다.. -> 이러면 속도 차이에 의해서 없어지는 데이터는 없어진다. - 그렇기 때문에 어렸을떄 눈높이 학습지를 엄청나게 풀었죠!!!!!!!!!!!!!



4. 오류 제어.

- 데이터 링크 계층은 손상되고 손실된 프레임을 탐지하고 재전송(Trailer 사용)하는 매커니즘을 수행함으로써 물리 계층의 신뢰성을 더합니다. 이는 또 중복된 프레임을 인식하기 위한 매커니즘도 이용한다.

방금 말한 2계층에는 유일하게 트레일러가 있습니다. 헤더는 앞에 붙고, 뒤에 트레일러가 붙는거죠~

트레일러는 에러를 검출하기 위해서 사용합니다. 그럼 트레일러는 어떻게 에러 검출을 할까요? 흔히 우리가 발견할 수 있는 통신 에러는 손상,손실이 있습니다. 이 두 에러에 대해서 구별할 수 있으신가요?? 깨진 데이터가 손상이고, 데이터가 유실(잃어버린것)이 손실=입니다.

즉 , 도착을 안했거나, 아니면 도착을 했는데 깨졌거나 둘 중 하나일 것입니다.

신뢰성 통신을 하기 위해서는 보낸 데이터에 대해서 응답이 와야 합니다.

시간이 지나서 답이 오지 않으면, 손실로 생각을 하고 답을 오긴 했지만 데이터가 깨져서 왔으면 손상으로 생각합니다. 이런 검사들을 트레일러가 해주죠.

( 여기에서 트레일러의 역할이 중요한데요, 전송하는 데이터는 bit 단위로 날라갑니다. 트레일러는 bit의 갯수를 짝수개로 맞춰주는 역할을 합니다.

만약 0101의 데이터가 날라간다면, 트레일러는 0일테고, 0100의 데이터가 날라가면 트레일러는 1이라 맞춰져 있을 겁니다.)

-> bit의 1의 갯수가 짝수가 아니라면 손상 혹은 손실이다.


5. 접근 제어

- 둘 또는 그 이상의 장치가 같은 링크에 연결되어 있을 때 데이터링크 프로토콜은 어떤 주어진 시간에 어느 장치가 제어권을 갖는지 결정하는 것이 필요하다.

접근제어는 눈치게임을 생각하면 됩니다. 공기라는 매체에 소리를 내지만, 소리의 충돌이 발생시키지 않도록 하는 것이죠.(공기에 대한 접근을 제어한다.)




3계층 네트워크 계층(Network Layer)

To move Packet (패킷도 봉투의 하나라 생각하면 된다.) from source to destination.(원천지?소스?데이터?가 목적지로 가는데 있어서) 
다들 1계층 물리계층이 전송을 담당한다고 말했지만, 이 글을 읽으 시는 분들은 "물리계층이 보내는 목적지를 어디에서 정하는거지? "라는 의문이 들었기를 기대합니다ㅎㅎ!! 바로 여기! 그 목적지를! 네트워크 계층에서 결정합니다.

네트워크 계층은 네비게이션(어디 길을 통해서 목적지 까지 가는 길이 제일 빠른지 와 같은것)이라 생각하면 된다. 목적지를 결정 해야 Hop - to - Hop으로 전송을 하지 않겠는가? 

네트워크 계층은 다중 네트워크(링크)를 통하여 전달되는 발신지 대 목적지 전달을 책임집니다. 데이터링크 계층이 같은 네트워크(링크)상에서 두 시스템 간에 패킷을 전달을 책임지지만 네트워크 계층은 각 패킷이 발신 지점에서 최종 목적지까지 갈 수 있도록 보장합니다.

만약 두 시스템이 같은 링크에 연결되어 있다면, 항상 네트워크 계층이 필요는 없습니다. 그렇지만 두 시스템이 네트워크(링크)간에 연결 장치를 통하여 서로 다른 네트워크에 연결되어 있다면 발신지 대 목적지 전달을 위해 네트워크 계층이 필요하다. 그 밖의 네트워크 계층의 주요 기능을 살펴보자.


4계층이(신뢰성 있는 놈이) 보내라 하면, 봉투에 넣고 주소를 작성하고, 주소를 통하여 길을 찾습니다. 길을 찾은 후에는, 찾은 길에 대해서 다음 길로 이동하죠.

1. 논리 주소 지정.(ip)

- 데이터링크 계층에 의해 구현된 물리 주소지정은 내부적인 주소지정 문제를 처리합니다. 만약 패킷이 네트워크의 범위를 벗어난다면 발신지와 목적지를 구분하기 위한 또 다른 주소지정 시스템이 필요하다. 네트워크 계층은 상위 계층으로부터 오는 패킷에 송신자와 수신자의 논리 주소를 포함하는 헤더를 더한다.(자세한건 뒤 쪽에서 좀 더 상세하게 나온다.)

-> 물리적인 주소의 대응되는 주소이다.

2. 경로 지정.

-독립된 네트워크나 링크를 네트워크 간 연결 (internetworks) 또는 규모가 큰 네트워크를 만들기 위해 서로 연결하려고 하면 연결 장치(라우터 또는 스위치)는 패킷의 최종 목적지까지 경로지정이나 스위칭하게 된다.

즉 , 발신지로부터 목적지로부터 경로를 지정한다. 경로를 지정하게 되면, 모든 패킷은 그 경로로 지나간다 ( 경로 찾는것은 다음 포스팅에서 자세히 나온다.)

   




4계층 전송 계층.(Transport Layer)

To provide reliable (신뢰성을 제공한다.) process- to -process (프로세스 간의 -프로세스는 실행되고 있는 프로그램이다.) message delivery and error recovery (메세지 전달 중 에러가 발생하면 에러를 복구한다.)

이것은, 내가 미쳐버린 파닭집에 외상을 해서, 룸메에게 외상비를 대신 갖다 달라고 돈을 줬다. 하지만 룸메가 없어진 것. 미쳐버린 파닭 사장님도 도착했다는 말이 없다. 여기에서 룸메는 미쳐버린 파닭에 가는 중, 길이 막혀서 늦게 도착할 수 있지만, 우리는 룸메가 길이 막혀서 늦게 도착하는 것을 모를 수 있다.

여기에서는 이렇게 해야 한다.

내가 돈을 보내는 것을 사장님에게 미리 말을 한다(사장님!! 돈 보낼께용!!) - 이것을 연결을 맺는 것이다(connection setup)

그리고 돈을 보낸다! 그리고 여기서부터 시간을 잰다. 하지만, 왕복할 시간을 훨씬 더 많이 지난다. 이럴 경우, 전송계층은 reliable(신뢰)성 있어야 하기 때문에, 다시 외상비를 다른 친구한테 보낸다. 그러므로 신뢰성이 성립한다.

물론 이 예에서는 돈을 다시 보낸것은 엄청난 불 이익이 있을 수 있습니다. 하지만, 패킷을 재 전송하는 것에 대해서는 큰 손실이 없기 때문에 가능하다.

네트워크 계층이 패킷의 발신지 대 목적지 전달을 책임지지만, 이들 패킷간의 관계는 인식하지 않는다. 이는 각 패킷을 각 단편이 분리된 메시지에 속하는지 여부에 따라 독립적으로 처리한다. 다시 말하면, 전송계층은 발신지 대 목적지 레벨에서 오류 제어와 흐름 제어를 통하여 순서대로 도착하는 것을 보장( 쉽게 생각하면 Queue처럼.)한다. 

즉 , 인터넷은 보낸 순서대로 도착하지 않는다. 그래서 전송계층이 그것을 순서대로 붙혀준다.(UDP는 순서대로 붙혀주지 않고 그냥 다 받아버린다.)

데이터를 큰 조각을 내서 보내주고, 그 조각들을 맞춘다.

그 밖의 전송 계층의 책임은 다음과 같다.


1. 서비스 지점 주소지정.

- 컴퓨터는 같은 시간에 여러 개의 프로그램을 실행한다. 이러한 이유 때문에, 발신지 대 목적지 전달은 하나의 컴퓨터에서 다음 컴퓨터까지 전달하는 것뿐만 아니라 한 컴퓨터상에 특정 프로세스(실행 중인 프로그램)에서 다른 컴퓨터에 있는 특정 프로세스(실행 중인 프로그램)까지 전달을 의미한다. 그래서 전송 계층 헤더는 서비스지점(service-point) 주소(또는 포트 주소)라는 주소 유형을 포함한다. 네트워크 계층은 정확한 컴퓨터에 각 패킷을 갖게 하지만 전송 계층은 컴퓨터상의 정확한 프로세스에게 전체 메세지를 갖게 한다.

즉, 우리는 컴퓨터에 프로그램을 많이 실행시킨다. 하지만 이런것들이 다 멀티태스킹이 가능하지 않는가? 실제로 컴퓨터의 통신은 컴퓨터+프로세스 : 컴퓨터+프로세스 의 통신이다.

좀더 추가 설명을 하겠다.

우리가 컴퓨터에 IE를 2개를 실행시켰다. 그리고 한개는 daum, 하나는 naver를 지정해서 검색을 탕! 하면? 당연히 다음과 네이버가 나올 것 이다.

컴퓨터가 이것을 어떻게 정확히 실행시켜주는 것인가? 어떤것이 먼저 요청을 보내고 어떤것이 먼저 응답이 올 지 모르는데? 힝?

여기에서 통신은, 컴퓨터-컴퓨터 통신은 구별이 안된다. 우리의 컴퓨터는 공통적인 요소인데, 이것을 구분하기 위해서, IE브라우저 A가 네이버에 접속, IE브라우저가 B에 접속 하는것을, process에 번호를 붙혀서 그 프로그램을 구분한다. 이 번호를 서비스 지점 주소라 한다!

이것을 포트번호라 부르기도 한다.(포트번호 ~~ 쓰세요~ -> 서비스 지점 주소 ~을 적으세요~ ==같은 맥락이다.)


2.분할과 재조립

- 메시지는 각 세그먼트가 순서 번호가 들어있는 전송 가능한 세그먼트로 나눈다. 이 순서 번호는 전송 계층에 메시지가 목적지에 정확하게 도착하여 재조립되고 패킷이 전송 중에 손실되거나 교체된 것에 대한 식별이 가능하게 합니다. 여기에서 분할은 세그멘테이션. 리 어셈블리는 다시 합치는것이라 부릅니다.

음~~ 그니까 여기는~ 데이터를 보내기 위해서는 조각을 내고, 받으면 다시 합쳐야된다는거죠~

-> 이게 매우 큰 일이다.


3. 연결 제어.

- 전송 계층은 비연결형이거나 연결형일 수 있다. 비연결형 전송 계층은 각 세그먼트를 독립적인 패킷으로 처리하고 목적지 기계에 있는 전송 계층에 전달한다. 연결형 전송 계층은 패킷을 전달하기 전에 먼저 목적지 기계에 있는 전송 계층과 연결을 만든다. 모든 데이터가 전송된 후에 연결이 종료된다.

쉽게 설명하면,

4계층은 연결을 맺는놈, 연결을 맺지 않는놈으로 구분을 한다.

맺지 않는놈은 도착한 애들을 독립된 애들로 보는거고,

연결형은 순서가 마구잡이로 도착해도, 순서대로 나열해주는 것이다.

-> 이것을 UDP( 비연결형 ) , TCP(연결형) 이다.

UDP에서는 같은 놈이 계속 데이터를 보내도, 같은놈이 데이터를 보냈다고 생각하지 않는다. 

TCP에서는 여러명이 계속 데이터를 보내도, 각각의 사람들을 인식하여 사용자들이 보낸 데이터들을 사람별로 순서대로 받아들인다.

그럼 어떻게 순서대로 도착했는지 알까?

-> 포스팅 후 링크 이 자리에 작성해 두겠습니다 ㅎㅎ


4. 흐름 제어

- 데이터링크 계층처럼 전송 계층은 흐름 제어를 책임집니다. 그렇지만 이 계층에서 흐름 제어는 단일 링크라기보단 종단 대 종단에서 수행되죠.

흐름제어는 2계층에서도 할 수 있지만 4계층과 구분할 줄 알아야 합니다.

4계층의 흐름제어는 종단을 연결하는 경로의 상태에 따라서 전송률을 좌지우지 합니다.

만약 4개의 경로가 있다고 생각 해봅시다.

4개의 컴퓨터는 모두 속도가 다르고, 가장 빠른놈, 제일 느린놈이 존재하기 마련입니다.

그렇다면, 가장 빠른 속도의 컴퓨터가 자신의 속도에 맞춰서 데이터를 보내면?
가장 느린놈은 데이터를 다 받지 못하여 손실이 발생할 것이죠 ㅋ 갑질ㅋ

2계층은 내가 전송할 놈의 속도만 보면 되는데, 4계층은 통신할 상대방의 사이에 있는 사람 모두를 고려해야 합니다.

-> 종단 을 연결하는 경로의 상태에 따라 전송률을 결정한다. 

4개의 컴퓨터(A,B,C,D)가 있다고 가정하자.

컴퓨터 A에서 D까지 데이터를 보낼 때 어떤 속도에 맞춰야 하냐면.. 아! 속도는 A는 100개 B는 75개 C는 150개 D는 125개 이다.

속도는 A가 D에게 보낼 때, 그 경로에 있는 모든 컴퓨터의 속도를 신경써줘야 한다.

2계층의 흐름제어와 차이점을 꼭 알아두세요!





5. 오류 제어

4계층은 손상되거나 손실된 애들을 다 재전송 합니다. (정확한 것은 다음 포스팅에서 할꺼얌!!)

데이터링크 계층처럼 전송 계층은 오류 제어를 책임집니다. 이 계층은에서는 오류 제어는 단일 링크를 따라 수행되기보다 프로세스 대 프로세스로 수행합니다. 보내는 전송 계층은 전체 메시지가 수신측 전송 계층에 오류(손상,손실,중복)없이 도착하는 것을 보장합니다. 오류 교정은 항상 재전송을 통해 이루어 집니다.


사실 여기까지 하면 TCP/IP의 모든것을 배운거나 마찬가지 입니다.

5계층부터 7계층까지는 논리적인 모델로써, 개발자가 직접 코딩해야 하는 부분입니다.


5계층 세션계층 (Session Layer)

서론 .우리가 전화를 할 경우, 전화는 서로 연결이 계속 되어야 합니다(Connection). Session은~ 음~!! 화상 전화를 할 경우, 비디오와 오디오가 날아가야 할 두개의 Connection이 필요하죠? 그런 여러개의 연결이 합쳐져서 하나의 서비스가 되면, 그것을 세션이라 부릅니다. 쉽게 말하면, 전송계층에서 음성Connection이나 영상Connection만 연결을 해줄 수 있는데, 이것들을 유지하기 위해서는 Session이 필요합니다 ( 정보를 계속 남기는거죠). 보통 5계층 부터는, 소프트웨어 개발자가 코딩을 해야 하는 부분입니다


처음 네 계층( 물리, 데이터링크 , 네트워크 , 전송 계층) 에 의해 제공되는 서비스는 일부 프로세스에 대해 충분하지 않습니다.

세션 계층은(5계층 , session Layer)는 네트워크 대화 제어기(dialog controller)입니다. 이는 통신 시스템 간의 상호대화를 설정하고, 유지하고, 동기화 합니다. 세션 계층의 주요 책임은 다음과 같습니다.

1. 대화 제어.

- 세션 계층은 두 시스템이 대화하는 것을 허용합니다. (두 시스템 간의 대화 허용) 이는 두 프로세스 간에 반이중이나 전이중 모드로 통신하는 것을 책임집니다.

만약 사용자가 무전기 앱(혹은 웹 서비스 를)을 개발하려고 하면, 사용자가 대화 제어 기능을 직접 개발해서 넣어야 합니다( 어떤 사람이 말 할때 다른 사람이 말 못하게 하는 등.)

반이중 - > 우리가 인터넷에 주소를 입력하면, 우리가 입력한 주소가 서버로 날라가서 결과가 화면에 나옵니다.


2. 동기화

- 세션 계층은 데이터 스트림에 확인점(synchronization point)를 추가하는 것을 허용합니다. 예를 들면, 어떤 시스템이 3000페이지 파일을 보내려고 한다면, 100 페이지마다 각각의 확인점을 추가합니다. 이럴 경우, 파일을 전송하는 과정 중, 644번 페이지에서 끊기게 되면  601~644까지의 정보는 삭제한 뒤, 600번 부터 다시 재전송 하게 됩니다.

- 추가적으로 패턴을 이용하여 동기화를 하기도 합니다. 패턴을 주로 bit으로 많이 사용합니다. 예를 들면, 1이 8개가 오는 부분을 자르겠다고 패턴을 설정합니다.

그럼 전송하는 부분 중, 11111111 이런 패턴이 오면 데이터에 동기화를 걸어주는데, 이 쯤에서 이런 생각을 하실겁니다 

"그럼 원래 보낼려고 했던 데이터에 1이 연속적으로 8개가 오면 어떻하지????"

-> 그건, 원래 1이 8개가 오는 데이터는 11110000 / 00001111 이런식으로 나눠서 전송하게 되고, 이 부분을 합쳐주는 방식을 사용합니다.

주로 패턴을 이용한 동기화는 많이 사용하지 않고, 페이지 갯수(사이즈로) 많이 나눠서 사용합니다.



6계층 표현계층 (Presentation Layer)

데이터를 transelate(번역) 하고, encrypt and terimate 하는것. 표현계층을 볼 때는, Cpu 제조사의 bit 표현법이 생각납니다. 빅 엔디언과 리틀 엔디언의 bit을 count하는 방법은 서로 방향이 틀렸던 것 처럼!(이부분은 C과 매우 연관성이 있는데, 이 부분은 따로 포스팅 하나로 빼야하니 뭐 ㅠㅠㅠ..;;) 각 계층에는 봉투가 필요하다! 받는사람 ~~ 누구 보내는사람 ~~ 누구 이렇게. 그래서 데이터가 내려오면, 7계층 데이터가 보내면, 6계층은 자신만의 봉투에 넣고, 정보(헤더)를 적는다. 이건 러시아인형이랑 같다. (인형을 열면 인형이 나오고, 인형이 나오면 인형이 나오고) .


표현 계층은 두 시스템 간에 교환되는 정보의 구문(Syntax)과 의미와 관련이 있다.


1. 변환.

-두 시스템에 있는 프로세스(실행중인 프로그램)은 항상 문자 스트링,숫자 등의 형식으로 정보를 교환한다. 정보는 전송되기 전에 비트 스트림으로 변경되게 된다. 서로 다른 컴퓨터는 서로 다른 부호화 시스템을 사용하기 때문에 표현 계층은 서로 다른 부호화 방법간에 상호 운용성을 책임진다. 송신자의 표현 계층은 송신자의 의존 형식을 공통 형식으로 변경한다. 수신하는 기계의 표현 계층은 공통 형식을 수신자 의존 형식으로 변경한다.

옛날에 IBM,HP두개의 컴퓨터는 서로 통신이 되지 않았다. 이게 빅 엔디언과 리틀 엔디언의 차이이다. 이런 경우, 서로 통신을 할 때 다른 방향으로 해석을 하게된다.

2. 암호화.

중요한 정보를 전달하기 위해서 시스템은 프라이버시를 보장해야 한다. 암호화는 송신지가 원래의 정보를 다른 형식으로 변환하고 변환된 메시지를 네트워크를 통하여 보내는 것을 의미한다. 복호화는 메시지를 원래 형식으로 되돌릴 수 있도록 변환하는 반대과정이다.

3. 압축.

데이터 압축은 정보에 들어 있는 비트의 수를 줄여준다. 데이터 압축은 텍스트,오디오, 비디오와 같은 멀티미디어 전송에 매우 중요하다.


7계층 응용 계층(Application Layer)

응용 계층은 사용자가 네트워크에 접속하는 것을 가능하게 한다. 전자우편, 원격 파일 접속과 전송, 공유된 데이터베이스를 제공한다. 응용 계층에 의해 제공되는 특정 서비스는 다음과 같다.

1. 네트워크 가상 터미널

- 네트워크 가상 터미널은 사용자에게 원격 호스트에 로그온을 허용하는 물리적인 터미널의 소프트웨어 버전이다. 그렇게 하기 위해 응용은 원격 호스트에 이야기 하고, 교대로 호스트에게 이야기 하고 또는 그 반대로 이야기한다. 원격 호스트는 자신의 터미널 중 하나와 통신하는 것으로 믿고 로그온을 허용한다.

*터미널에는 input과 output만 있다.


2. 파일 전송,접근,관리(FTAM)

- FTAM(에프탐)은 OSI 7 Layer의 기준이다. 산업 기준으론 FTP라고 부른다. 이것은 사용자에게 로컬 컴퓨터에서 사용하기 위해, 원격 컴퓨터로부터 파일을 검색하기 위하여, 자체적으로 원격 컴퓨터에 있는 파일을 관리 하거나 제어하기 위하여 원격 호스트에 있는 파일 접근(데이터를 읽거나 변경하기 위하여)을 허용한다.

3.기타 서비스.

- 카톡의 메시지 전송 서비스, 전자우편 서비스, 디렉토리 서비스 등이 있다.




해당 포스팅은 McGraw-Hill Korea 출판사의 TCP/IP프로토콜(4판)의 많은 부분을 참고하여서 포스팅 했습니다.


감사합니다.

안녕하세요~ 벌써 주말이네요 ㅎㅎ 어제 포스팅 하려 했는데 늦어써~

앞으로 얼마동안 포스팅 할 주제는 OSI7계층과 TCP4계층 입니다.

오늘은 첫번째로 OSI와 프로토콜에 대해서 필요한 기본지식에 대하여 이야기 해보겠습니다.





다들 통신이 어렵다고 하는 이유는, 통신은 약어가 너무 많아서 어렵다고 생각하는 듯 싶습니다.

하지만 통신에 사용하는 약어들이 없다면, 전공자들이(혹은 실무자가) 통신에 대하여 이야기를 할 때면, 많은 어려움이 있지 않을까 생각됩니다.


그래서 통신 용어들에 대해서 알고 있어야 하는데, 혹시 표준화에 대해서 알고 있나요?


지금 일상생활에서 사용하는 표준은 여러가지가 있습니다. 예를들어 길이를 나타내는 cm, km 그리고 국제 표준언어의 5개 등등이 있죠 ㅎㅎ

표준화 된 것들은 많지만 표준화 되지 않은것들도 어럿 있습니다. 

전 그 중 표준화가 되어야 할 점은 아이폰과, 갤럭시의 충전 잭이 표준화가 되어야 된다고 생각합니다ㅋㅋㅋㅋ 다들 공감하시죠?

이와같이 표준이 되지 않아서 불편한 점이 많아유 ㅠ


(출처 : https://plus.google.com/u/0/+iso/posts)


그래서!!!!!! 이것들의 표준을 정해주는 곳이 있습니다. 

그 곳중 하나인 ISO(International Organization for Standardization-국제 표준화 기구)가 있죠 ㅋ

여기서 만든 표준이 여러개가 있는데, 그 표준중, 운이 좋게도 통신에 대한 표준은 ISO를 뒤집은 OSI(Open System Interconnection)입니다.


읽으시는 분은 분명 이렇게 생각하시겠지?ㅋ "명사들의 연속이긴 한데 무슨뜻이지? 연결을 열어주는 시스템? 개방되어 있는 시스템?" 이라고 다양한 생각을 하게찡?ㅋㅋㅋㅋ(귀염귀염)

이럴 때 OSI를 그냥 OSI라고 생각하지 말고, 방금 언급한 "연결"이냐 "개방"이냐 라는 것에 대해서 조금 고민해 보는것도 좋을 것 같습니다ㅎㅎ(전 개방되어 있는 시스템이 좀 더 가깝다 생각 합니다)


그건 그렇고 화제를 변경시켜 다음으로 넘어가죠.


Interconnection은 Inter + connection으로 이루어진 단어 입니다.

유사한 단어로 Internet이 있는데, 보통 여러분은 Internet 이 한 단어라고 생각하고 있었을것 같아요!(제가 그랬어요..늉늉

하지만 Internet은 Inter+network이 합쳐져서 만들어진 단어입니다.

inter(상호간의)+network(네트웤)= 네트워크와 네트워크가 서로 연결이 되서 큰 네트웤이 된 것이다. 이것이 인터넷입니다.( ㅋㅋㅋㅋ넘나 쉬운것?)

즉, 큰 네트워크 하나는 시스템과 시스템이 연결 된 것입니다.


System들 간이 interconnection이 되어 있는데(서로 연결되어 있는데) 이것들이 Open(개방)되어 있다는 것은, "나는 누구와도 연결될 수 있다"라는 뜻이 되죠.


이해를 돕기 위해 한 예제를 들어보겠습니다.


수업이 진행되고 있는 강의실에 교수님과 학생들이 있고, 그 학생들과 교수님을 각각의 하나의 시스템이라 생각해 봅시다.

학생들과 교수님은 (시스템과 시스템은) 서로 연결이 되어야 이야기가 가능합니다.

학생들은 교수님이 이야기 하시는 내용을 듣고(이해하고) 있다는 것은 연결이 되어 있기 때문에 가능하죠~!!?

이러한 연결이 Open되어 있고, 어떤 학생(시스템은) 강의실에 있는 누구와도 말할 수 있습니다.

이것은 교수님, 그리고 학생들 간의 이야기 방식이 표준화 되어 있기 때문에 가능합니다(시스템-시스템간의 통신 방법이 표준화 되어 있기 때문이죠.)


하지만 여기서 이런 생각을 하시는 분이 있을 것 같네요.

"만약 말레이시아 사람이나 혹은 중국사람과 같은 다른나라 사람들이 있어도 이야기 하는 방법이 표준화 되어 있다고 할 수 있는건가? 학생이 다른나라 사람일 수도 있잖아!!" 하면서.

그래, 이 부분에 대해서는 말하는 방식이 표준화 되어 있지 않기 때문에 OSI(Open System Interconnection)가 아닌 것이라고 말 할수 있겠네요. 우리는 강의실의 언어가 표준화 되어 있기 때문에 소통이 되고 있다고 하지 않았느냐!!!!!!!!!!!!!!!!!!!!!!!!!!!


그럼 OSI를 한 문장으로 요약해보면?

-> 시스템들이 네트워크로 서로 묶이기 위해서 오픈되어 있는 모델이다.



OSI의 목적 : 하드웨어가 소프트웨어 기반의 논리적인 변화에 대한 요구 없이, 서로 다른 시스템간의 통신을 원활하게 하는 것.


서로 다른 시스템 간의 통신을 해야 하는데, 두 기기간의 통신이 표준화 되어 있으면 아무 문제가 없죠. 하지만 표준화가 되어 있지 않는 경우가 많습니다. 앞서 말한 안드로이드와 아이폰의 충전 잭 처럼.

이런 경우는 보통 하드웨어를 변경해야 하죠.ㅜㅜㅜㅜ ( 아이폰 만쉐~~ )

하드웨어도 그렇고, 여러가지가 있죠~!!

아이폰과 안드로이드가 블루투스 통신을 한다면? 하드웨어를 변경 을 할 필요는 없지만, 블루투스를 이용하여 서로 전송하는 앱이 다르면(통신을 하는 앱이지만, 삼성은 삼성앱, 애플은 애플앱 서로 다른 앱을 깔았을 경우 통신이 안 될 확률이 높습니다 - 서로 협의가 안되었다면 )이 때 소프트웨어적인, 논리적인 변화를 요구한다. 앱을 바꾸라든가 이런 요구를 하겠죠??ㅋㅋ

이런거 요구 없이 통신을 하기 위해선 표준화가 필요합니다. 표준화를 준수하여 개발을 진행한다면, 방금 말한 것 처럼 서로 협의가 안 되어 있는 상황은 발생하지 않겠죠?

 


프로토콜.

프로토콜이 무엇인가요? 프로토콜은 한마디로 말하자면. 통신규약입니다.

개발자라 그런지, 평소에 선배나 친구들이랑 이야기 할 때 " 프로토콜 이렇게 정하자 " 라면서 이야기 많이 하는데, 여러분은 안그런가요??


프로토콜은 ~~ 이렇게 발생한 일은 ~~ 이렇게 처리하라 라고 약속을 하는 것 입니다.

조금 길게 설명하면, 두 사람 또는 두 장치 간에 이루어지는 통신의 일련의 프로토콜이 필요한데, 프로토콜은 통신을 주도하는 규칙들의 집합 이라고 말할 수 있습니다. 

ㅋㅋ 무슨 말 인지 모르겠죠?? 쉽게 설명해 드리겠습니다.

경찰도 프로토콜을 갖고 있고, 군대도 프로토콜을 갖고 있고, 특정한 기관들은 프로토콜을 가지고 있습니다.(불이나면 ~~이렇게 움직여라! 테러가 발생하면 ~이렇게 하라! 등등)

그럼 통신 규약은 무엇인가요?

우리의 핸드폰에 어떤 사람으로부터 전화가 온다면, 우리의 핸드폰은 진동(혹은 벨)이 울립니다. 그리고 우리는 전화를 받거나 거절을 합니다. 그리고 이 행위를 상대방에게 알려주는 것(전화가 연결되거나 뚜~~뚜~~ 하는것) 이것이 통신규약 입니다.


여기서!!! 잠깐!!

OSI모델은 이렇게 상세한 프로토콜은 아닙니다. 큰 틀에서 이렇게 따르어라! 하는 것이죠 ㅋ

이 시스템과 저 시스템이 통신하기 위해서는 이러한 모델을 가지고(기반하고) 구체적인 프로토콜을 만들어라! 그럼 전 세계의 모든 장비가 통신을 할 것이다.라는 뜻 입니다.

즉 , OSI는 모델이지 프로토콜이 아닙니다. OSI는 유연하고(면접볼 때 유연한 사람은 어떠한 상황에도 잘 대처하고) , 상호 연동 가능한(누구와도 이야기 할 수 있는) 모델입니다.





참고자료 : TCP/IP 프로토콜 4th Edition(McGraw-Hill Korea)

이번 포스팅은 특정한 시간이 되면 푸쉬 알람이 올 수 있도록 구현하는 방법입니다.



먼저 프로젝트를 하나 생성해야한다.


Application name은 Alarmtest라 작성했지만, 사용자가 편한 앱 이름을 설정해주면 된다.


다음은 Manifest이다.




<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.kwongyo.alarmtest" >
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Main2Activity"
android:label="@string/title_activity_main2"
android:theme="@style/AppTheme.NoActionBar" >
</activity>
<receiver android:name=".BroadcastD"></receiver>
</application>

</manifest>



<uses-permission android:name="android.permission.INTERNET"/>

은 안드로이드에서 서버가 있거나 테스트 할 경우 인터넷을 사용해야 한다. 인터넷 사용 환경에서 (인터넷을 사용하겠다는 권한을 주는것) 작성한다.

<uses-permission android:name="android.permission.VIBRATE"/>

노티피케이션을 사용할 때 진동을 줄지 안 줄지 설정하는 것이다. 해당 폰에서는 permission을 줬기 때문에 노티피케이션(푸쉬)가 올 때 알람이 진동이 발생한다.

특정하게 알람을 줄 때 안줄때를 Client에서 결정하게 할 작정이라면, Java코드에서 notification.defaults=Notification.DEFAULT_ALL 혹은 Notification.DEFAULT_VIBRATE를 직접 주면 됩니다. 


<uses-permission android:name="android.permission.WAKE_LOCK"/>

다음 권한은 안드로이드가 화면이 어두워져 있을 때 ( 잠금상태 일 때 ) 화면을 깨울때 주는 권한이다.



다음은 MainActivity입니다.



import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
private static int ONE_MINUTE = 5626;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AlarmHATT(getApplicationContext()).Alarm();

}
public class AlarmHATT {
private Context context;
public AlarmHATT(Context context) {
this.context=context;
}
public void Alarm() {
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, BroadcastD.class);

PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

Calendar calendar = Calendar.getInstance();
//알람시간 calendar에 set해주기

calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), 23, 12, 0);

//알람 예약
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
}
}

}



나중에 분리할 수 있는 코드로 작성하기 위해서 AlarmHATT와 MainActivity와 다른 클래스로 작성했습니다.( 실제로 개발한 HATT-스케쥴러 앱은 코드가 MVC패턴이 적용되어 분리되어 있습니다.)


AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

AlarmManager는 device에 미래에 대한 알림같은 행위를 등록할 때 사용합니다.

Intent intent = new Intent(MainActivity.this, BroadcastD.class);

알람이 발생했을 경우, BradcastD에게 방송을 해주기 위해서 명시적으로 알려줍니다.


PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
MainActivity.this => PendingIntent를 부르려는 컨텍스트
int requestCode =>Private request code 인데 현재는 사용하지 않아서 0으로
Intent intent => 앞으로 불려질 Intent
int flags => Intent에 대한 조건설정 플래그
   FLAG_ONE_SHOT : 한번만 사용하고 다음에 이 PendingIntent가 불려지면 fail 하겠다.
   FLAG_NO_CREATE : PendingIntent를 생성하지 않는다. PendingIntent가 실행중인것을 체크하기위함
   FLAG_CANCEL_CURRENT : 이미 실행중인 PendingIntent가 있다면 이를 취소하고 새로 만듬
   FLAG_UPDATE_CURRENT : 이미 실행중인 PendingIntent가 있다면 새로 만들지않고  extra data 만 교체하겠다.


calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE), 23, 12, 0);

calendar에 시간을 set 해주는데요, year,month,date를 다 set 하고, 당장 test할 시간에 푸쉬를 받을 미래의 시간(약 1분정도)를 기재해 줍니다.


am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

RTC_WAKEUP과 RTC가 있는데요.

AlarmManager.RTC - 실제 시간을 기준으로 합니다.

AlarmManager.RTC_WAKEUP - RTC와 동일하며, 대기 상태일 경우 단말기를 활성 상태로 전환한 후 작업을 수행합니다.


해당 코드는 RTC_WAKE을 줬습니다. 하지만 이 글을 읽으시는 분들은 이런 생각을 하겠지...("왜 퍼미션 줬는데 저렇게 코딩했지?")

답변->퍼미션을 줘서 RTC를 줘도 상관 없습니다.


BroadcastD.class



import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
* Created by GHKwon on 2016-02-17.
*/
public class BroadcastD extends BroadcastReceiver {
String INTENT_ACTION = Intent.ACTION_BOOT_COMPLETED;

@Override
public void onReceive(Context context, Intent intent) {//알람 시간이 되었을때 onReceive를 호출함
//NotificationManager 안드로이드 상태바에 메세지를 던지기위한 서비스 불러오고
NotificationManager notificationmanager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(context);
builder.setSmallIcon(R.drawable.on).setTicker("HETT").setWhen(System.currentTimeMillis())
.setNumber(1).setContentTitle("푸쉬 제목").setContentText("푸쉬내용")
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE).setContentIntent(pendingIntent).setAutoCancel(true);

notificationmanager.notify(1, builder.build());
}

}



해당 코드는 안드로이드 4.1버전 이상(젤리빈? 명칭이 헷갈리네요) 부터 사용이 가능합니다.


해당 코드는 이전에 작성한 포스팅을 참고하시면 될 것 같습니다.

http://kwongyo.tistory.com/4


감사합니다.




참고

http://westwoodforever.blogspot.kr/2013/06/android-javalangsecurityexception.html

http://www.androidside.com/bbs/board.php?bo_table=b49&wr_id=57389



앱에 푸쉬기능을 사용하기 위해서 자체적으로 푸쉬기능을 사용해야 했다.

그래서 GCM종류를 찾아보다가 , 기껏 GCM으로 기능을 구현을 다 해놓으니 , 우리팀에서 서버를 안쓰기로 결정한것...또르르....


그래서 Notification Push를 다시 찾아보게 되었다.


일단 Android Project를 생성하자.



하단에 나와있는

A non-empty directory already exists at the specified project location. Existing files may be overwritten. Procceed with caution.

이라는 경고문은 내가 이미 구현을 마쳐놓은 후에 포스팅을 하기 때문에 발생하는 에러이다.

뭐.. 이미 있으니까 덮어쓰기 주의 하라네요.


Manifest입니다.

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.kwongyo.notificationtest" >
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name="com.example.kwongyo.notificationtest.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>
<service android:name=".NotificationService"
android:enabled="true"/>
<receiver android:name=".NotificationReceiver"/>

</manifest>

<uses-permission android:name="android.permission.WAKE_LOCK/>

은 디바이스가 활성화 되지 않았을떄( 켜져있지 않았을 때) 화면을 활성화 시켜주는 옵션이다.

service android:name=".NotificationService"는 service를 등록해주는데, 서비스를 실행시킬 서비스 클래스를 호출한다.

android:enable="true"는 default값이 true이다. 화면의 컴포넌트가 인스턴스화 될 지 안될지 선택하는 속성값이다.

receiver android:name=".NotificationReceiver"/>는 NotificationReceiver (리시버를 받을)클래스를 클래스를 명시적으로 작성해준것이다.


여기에선 service와 receiver는 구현한 부분에 대해선 설명하지 않았다.

service와 receiver는 특정한 시간에 알람을 주거나 특정 행위를 해야 할 때 AlarmManager와 사용한다.
layout입니다.

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
android:orientation="vertical">

<TextView
android:id="@+id/textView"
android:text="Hello World!" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/alarmBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="alarmBtn"/>
</LinearLayout>


기능이 중요하니 심플하게 작성하고,


MainActivity입니다.


코드는 Layout에 맞춰서 Button을 클릭할 때 마다 알람이 올 수 있도록 작성했습니다.

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = (Button)findViewById(R.id.alarmBtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NotificationManager notificationManager= (NotificationManager)MainActivity.this.getSystemService(MainActivity.this.NOTIFICATION_SERVICE);
Intent intent1 = new Intent(MainActivity.this.getApplicationContext(),MainActivity.class); //인텐트 생성.



Notification.Builder builder = new Notification.Builder(getApplicationContext());
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);//현재 액티비티를 최상으로 올리고, 최상의 액티비티를 제외한 모든 액티비티를 

없앤다.

PendingIntent pendingNotificationIntent = PendingIntent.getActivity( MainActivity.this,0, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
//PendingIntent는 일회용 인텐트 같은 개념입니다.
FLAG_UPDATE_CURRENT - > 만일 이미 생성된 PendingIntent가 존재 한다면, 해당 Intent의 내용을 변경함.

FLAG_CANCEL_CURRENT - .이전에 생성한 PendingIntent를 취소하고 새롭게 하나 만든다.

FLAG_NO_CREATE -> 현재 생성된 PendingIntent를 반환합니다.

FLAG_ONE_SHOT - >이 플래그를 사용해 생성된 PendingIntent는 단 한번밖에 사용할 수 없습니다
builder.setSmallIcon(R.drawable.on).setTicker("HETT").setWhen(System.currentTimeMillis())
.setNumber(1).setContentTitle("푸쉬 제목").setContentText("푸쉬내용")
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE).setContentIntent(pendingNotificationIntent).setAutoCancel(true).setOngoing(true);
//해당 부분은 API 4.1버전부터 작동합니다.

//setSmallIcon - > 작은 아이콘 이미지

//setTicker - > 알람이 출력될 때 상단에 나오는 문구.

//setWhen -> 알림 출력 시간.

//setContentTitle-> 알림 제목

//setConentText->푸쉬내용

notificationManager.notify(1, builder.build()); // Notification send
}
});
}

다음과 같이 하면, 버튼을 클릭할 때마다 노티피케이션이 발생합니다.




포스팅을 하는 도중 냉장고에서 물이 새는 대 참사가 발생했다..
ㅠㅠ정신 없어서 급하게 적은 감이 없지않아 있다.
특정한 시간에 알람을 주기 위해선 AlarmManager를 이용하면 된다.
이 부분에 대해서는 다음 포스팅( 강의시간 등등..)을 이용해서 포스팅 해야겠다!

알람 매니저 사용할때는 상세히 적어야지

모두 개강 힘내요~
저는 26학점 듣습니다~!!



요즘 디자이너와 함께 하는 개발 연합동아리 NEXTERS에서 앱을 만드는데 OOM에 대해서 공부하게 되었다.

JVM이 메모리 관리를 해주는데도 불구하고 OOM이 발생한다는 것,

그래서 개발자 세션을 진행하는 nc소프트 행님에게 말했더니 직접 세션을 하면서 발표 해보라는거...


부들부들...


PPT를 만들면서, Tistory에 포스팅 해야 겠다 생각해서 포스팅 하고 있다ㅋㅋ

보통 OOM은 

프로그램이 메모리를 할당 후 해제하지 않아서 생기는것으로 C언어 동적할당(malloc)후 free를 하지 않았을 경우에 발생한다.

-> 단 한번의 예제(학습) 프로그램에서는 상관 없지만 , 서버나 계속 돌아가야 되는 프로그램에서 누적된 Memory의 Leak은 프로그램을 사망하게 한다.


GC는! 동작방식에 따라 다양한 종류가 있다.(Java , C# , 등등등) 이 GC들은 공통적으로 2가지 작업을 수행하는데,


1. 힙 내의 객체들 중에서 가비지를 찾아낸다.

2. 찾아낸 가비지를 처리해서 힙의 메모리를 회수한다.


GC는 참조카운트가 0이 되면 메모리를 회수하는 걸로도 유명하죠.



Java의 GC는 객체(이하 인스턴스)에 대해서 Reachability 개념을 사용합니다. 

인스턴스에 대해서 참조카운트가 0이 아니라면 Reachable. 참조카운트가 0이라면 unReachable.


GC는 참조 카운트가 0인 인스턴스들 즉, unReachable에 대한 객체에 대해서만 메모리를 회수합니다.


Java 1.2버전부터는 개발자들이 Reachable한 인스턴스와 unReachable한 객체에 대해서 컨트롤 할 수 있게 클래스를 제공해줬는데요.


그 클래스들은 StrongReference,SoftReference , WeakReference , PhantomReference입니다.


보통 PhantomReference는 많이 사용하지 않고 , 스트롱 레퍼런스, 윜 레퍼런스, 소프트 레퍼런스를 많이 사용하는데요(LRU 구현 등)


일단 클래스들 설명에 앞서, 코드 조금 보고 갈게요.



해당하는 코드는 저희 HATT앱의 MainActivity의 코드 일부분 입니다.


대충 어디서 메모리 릭이 발생하는지 감이 오시나요??ㅋㅋ



보통 Android를 개발하는 개발자들은 어쩔 수 없이 this를 보내주는 경우가 있죠.

이럴 경우 메모리 릭이 발생하여 나중가면 프로그램이 사망하는 경우가 생깁니다.


그 이유는, this를 보내주는 객체에선 Context객체를 필요로 하는 상황이 발생했는데 this를 보내줌으로써, Context와 함께 

해당하는 Activity에 있는 멤버필드에 있는 객체들과 여러 참조들을 같이 보내주게 됨으로써 메모리 릭이 발생하는 것입니다.


이해가 되나요?

말이 어려웠으면 댓글 달아주세요. 자세히 설명해 드리겠습니다.


WeakReference<Sample> obj = new WeakReference<Sample>(new Sample());

Sample ex = obj.get();

ex = null;

위와 같은 코드로

인스턴스를 생성 시, WeakReference에 전달인자로 넘겨주어 인스턴스를 생성합니다.

그런 후, WeakReference의 get()메소드를 이용하여 객체 잠조를 가져와 필요한 작업을 한 뒤, 객체 참조를 가지고 있는 변수에 null을 대입해 줍니다.


이해를 돕기 위하여 이미지를 통하여 설명하면,


 

위 그림은 

WeakReference<Sample> obj = new WeakReference<Sample>(new Sample());

Sample ex = obj.get();

까지 작성한 코드입니다.


SampleObject는 StrongReference와 WeakReferenceObject에 연결되어 있는데요, 이 경우는 StrongReference가 더 강력하여, GC는 StrongReference로 취급합니다.


하지만


ex=null을 하게 되면




다음과 같이 SampleObject는 Weakly reachable형태가 됩니다.


다음과 같이 되면, GC는 SampleObject를 unReachable 인스턴스로 취급하여 메모리 회수를 하게 됩니다.




이런 방식을 사용하여, this를 보내줄 때도, Activity가 이동하게 되어서, 인스턴스를 사용하지 않게 된다면,

StartActivity or StartActivityForResult 메소드를 호출하기 전에, null을 대입해 주는것입니다.



그럼 OOM을 막을 수 있겟죠.



오늘은 너무 늦어서 여기까지 작성하고 주말에 다른 API도 마저 작성하겠습니다.



출처


라이언 이모티콘 : 카카오톡 이모티콘.

해외 직구 어플인 Geek에서 저렴하게 구매했다!


그 금액은 무려..

9800원!

배송료까지 다 합쳐도 12000원 정도 하는 가격에 get했다!

무지 저렴하지 아니한가~!


2016년도 Macbook이 출시되면 구매할 생각이라 , 자료정리를 할 USB가 필요했었다ㅎㅎ 요긴하게 쓰일듯~



영어로 도배된 택배는 처음 받아본다.



싹뚝


뽁뽁이 보호막!



앞으로 요긴하게 쓰일 듯 하네요 ㅎㅎ

동영상 하나 넣어 테스트 해봤습니다.

보통 128G사면 128,-로 오는데, 131,-로 오네요.(신기

앞으로 프로젝트 파일들을 차곡차곡 쌓아봐야겠네요 ㅎㅎ


 



'일상' 카테고리의 다른 글

티스토리 정말 오랜만이네  (0) 2018.08.23
포스팅이 많이 늦어질 것 같네요.  (0) 2016.04.28
블로그를 시작했을 때와 지금은  (1) 2016.04.05

+ Recent posts