2018년 10월 29일 월요일

Network 중간정리,

지금까지 살펴본 네트워크에 대해서 중간정리를 해보자.


1. OSI7계층
: 서로다른 단말기간의 데이터를 네트워크 상에서 송/수신 하기위해 표준화된 통신 규약에 해당하는 각 영역별로 정리된 계층이다.

 ↓ 아래로 갈 수록 하위 계층
 7) Application Layer
 6) Presentation Layer
 5) Session Layer
 4) Transport Layer
 3) Network Layer
 2) DataLink Layer                                       
 1) Physical Layer           

위에 설명된 것들이 해당 영역의 계층들이며, 데이터가 송신될때, 해당 데이터 패킷이 각계층을 거쳐 캡슐화 된 후 네트워크를 통해 전달되어 분리되서 다시 해당 계층을 역순으로 데이터가 전송된다.

위의 OSI7계층을 다음과 같이 4계층으로 표현하기도한다.
 4) Application (OSI 7계층의 Application / Presentation / Session Layer가 해당됨.)
 : 사용자와 가장 인접한 계층이며, 네트워크를 응용프로그램(Telnet, FTP, SMTP)으로 이용한다.

 3) Transport (OSI 7계층의 Transport Layer가 해당됨.)
 : 데이터를 전송하는 역할을 담당한다. 각 시스템을 연결하여 TCP프로토콜을 사용해서 데이터를 전송한다.

 2) Internet (OSI 7계층의 Network Layer가 해당됨.)
 : 데이터를 올바른 목적지까지 전송하기 위해 패킷들을 경로를 지정한다.
IP프로토콜을 사용해서 라우팅을 역할을 한다.

 1) Network Interface (OSI 7계층의 DataLink / Physical Layer가 해당됨.)
 : 이더넷 카드 같은 하드웨어 장치를 뜻한다. 두 단말기간에 데이터를 어떤형태로 주고 받을지 데이터 전송방식을 정한다.  (아날로그신호 → 디지털신호로 / 디지털신호 → 아날로그)




2. ICMP
 Network Layer에 해당하는 프로토콜이며, ICMP헤더를 통해서 패킷들의 정보를 파악할 수 있다.

 - 고정된 4byte + 가변길이 4byte를 갖고있다.

 - 헤더 형태
  • Type (8bit)
  • Code (8bit)
  • CheckSum (16bit)
  • 가변 길이 (32bit)
  • Type : 메시지 유형을 정의한다. 보통 ping의 Echo사용시 - 메시지 유형 8번에 해당 됨.(패킷이 도달하지 못했을 경우 3으로 표시)
  • Code : Type에 대한 부가적인 설명을 한다. 이상이 없을 경우 보통 0번에 해당하는 값을 표시.
  • CheckSum : ICMP헤더의 패킷 손상여부를 체크. (네트워크를 통해 전송된 패킷이 변경여부(무결성)를 파악 할 수 있다.)
- CheckSum 방법
 1) ICMP헤더 패킷을 2바이트씩 16비트워드로 표현한다.
 2) 해당 값들을 전부 다 더한다. (기존 checksum에 해당하는 값들에 대해서는 0만들어서 계산하거나 무시하고 계산해야한다.) 이때, 캐리가 발생하였다면 더해주면된다.
 3) 해당 값들을 1의 보수로 표현하고 16진수로 바꿔준 뒤 기존의 CheckSum값과 비교하기. 기존 CheckSum값과 같을경우 패킷의 무결성을 인증한다.




3. RFC

 - Time Protocol
 : 각 독립된 사이트를 컴퓨터로 읽을 수 있는 날짜와 시간을 제공해준다.
   (1900년 1월 자정 이래로 초 단위로 시간을 보낸다.)

 - Daytime Protocol
 : 이 서비스는 입력된 값에 관계없이 현재 날짜와 시간을 문자열로 보내준다.





4. Encoding 

 - Encoding
(Encoding)인코딩은 문자를 컴퓨터로 저장하거나 불러오기 위해서 컴퓨터가 이해할 수 있도록 문자를 바이트로 표현하는 방법이다.
보통 컴퓨터에 사람이 사용하는 언어의 데이터로 저장하기 위해서 사용됨.

 - Encoding Type
  • ASCII : 영문/숫자/기호로 이루어진 영문키보드에 해당된 모든 값들을 1바이트로 표현한다. 0~127개 즉, 128개의 부호로 표현하며, 2byte이상의 값들은 표현할 수 없다.
  • Unicode : 전 세계의 문자를 2byte로 표현하며, 문자, 숫자가 각각 1:1매핑이 되어있다.
  • UTF-8 : ANSI(영어포함)문자를 1byte, 아시아 문자(한글 / 한문)는 3byte로 가변표기하는 방식이다.
  • MS-949 : 한글확장 완성형 방식이다. euc-kr이 표현할 수 없는 똠방각하를 표현할 수 있다.

5. Thread

 - Thread
 하나의 프로세스내에서 프로그램을 실행하는 작업 단위이다. 해당 프로세스 내에서 동작을 독립적으로 수행할 수 있다.

예를들어, 하나의 프로그램에 2개 이상의 작업을 수행할때, 기존에는 하나의 작업이 완료된 직후 다음작업을 실행하였다면, 쓰레드를 사용한다면, 하나의 작업을 하는동안에 다른작업도 같이 독립적으로 수행할 수 있는것이다.

하지만, Thread는 꼭 독립적인 작업을 할 필요는 없다.

 - synchronized (동기화)
 예를들어 A(), B(), C()의 작업 3가지가 존재할경우, A()와 B()는 각각 동시에 수행해도 되는 작업이며, C()의 작업은 동시에 접근할 수 없도록 하기위해서 synchronized를 이용한다.
그러면 1번 이라는 쓰레드가 C()에 접근하고 있는 상태면, 다른 쓰레드들은 1번 쓰레드가 종료될 때 까지 접근할 수 없고 기다려야 한다.

 - wait()
 wait은 작업중인 쓰레드에 대해서 대기상태로 만들어버린다. 즉 누군가 깨워야만 작업이 진행된다. notify()를 통해 해당 쓰레드를 깨울 수 있다.

 - notify()
 notifty는 대기상태인 쓰레드에 대해서 runnable상태로 바꿔준다. 즉, 대기하는 상태에서 실행할 수 있도록 만들어 준다.

 - join() 
 wait()과 비슷한 작업을 하지만 조금 다르다. join()이 하나의 메소드안에 사용되었을경우, 다른Thread들에게는 wait()상태를 준다. 즉 해당된 쓰레드가 끝나야만 다른 쓰레드들이 실행할 수 있도록 하는것이다.
 예를들어 main에서 Thread를 생성 하면 Thread는 main()에 대해서 독립적인 작업을 할 것이다. 또한 main도 마찬가지다. 이때 main이 해당 Thread작업이 끝나고 종료되기를 원할때, Thread 객체.join()을 하면 마치 synchronized같은 작업이 되는 것이다. (Thread객체의 작업수행이 종료 될 때까지 main이 종료되지 않고 기다리기 때문이다.)

- wait(), notify() : synchronized 블록안에서 사용되어야 한다.


하지만 Thread를 사용하는 동안에 위험적인 상황이 발생한다.
바로, Deadlock이라는 것인데, 아래에서 살펴보자.

 - Deadlock
Deadlock은 임계구역이며, 두 가지 작업을 쓰레드들이 하는데 서로 작업이 끝날때까지만을 기다리면서 무한 대기하게 되는 상태를 말한다.

이러한 Deadlock을 방지하는 방법에 대해 살펴보자.

 - Deadlock 최소화
1) 같은 순서로 객체에 접근 할 수 있도록 한다.
객체에 접근하는 순서가 같을 경우 교착상태가 덜 발생한다.

2) 교착상태가 발생하면 서로 깨워주도록 한다.
if 조건문으로 교착상태가 발생하면, 해당 Thread의 wait()상태를 notify()로 깨워주거나 해당 코드를 벗어나도록 코드를 작성 해야한다.


댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...