# 네트워크 프로그래밍 강의 대본.

<<<1주 대면>>>

자바는 객체지향 언어이다. 클래스가 중요한 게 아니고 객체를 다루기 위해 그 틀로써 클래스를 만드는 것 뿐이고, 

객체지향언어는 전기밥솥처럼 압력, 온도를 내가 직접 관여하여 관리하지 않아도 밥을 알아서 만들 수 있는 "객체"들을 만들어 문제를 해결해 나가는 언어이다. 

같은 맥락으로 네트워크 프로그램을 짤때 네트워크 영역을 일일이 로우레벨에서 코딩할 필요가 없다. 

소켓 클래스로 만들 수 있는 소켓!!! 이라는 객체가 있기 때문이다. 정확히는 소켓 클래스가 이미 있는것이다.  

소켓 객체는 네트워크 통신을 담당하는 객체로, 자바에는 소켓이 이미 만들어져 있기 때문에 이 객체를 통해 내 프로그램의 네트워크 통신을 처리해주면 된다.


이 세가지 공부를 명품자바 강의를 보고 다시 공부해와야 한다. 
1. 스윙을 이용한 gui 프로그래밍
2. 멀티스레드 프로그래밍
3. 입출력 스트림 사용
-> 명품자바에 마지막 에 있는 네트워크 프로그래밍 단원이 있다. 거기를 복습하고 오면 좋다. 

10/23에 중간고사 본다. 중간고사 이후에 조별 프로그램을 할 것이다. 
10주차 이후에 2인1조!! 조별 프로젝트를 진행하게 된다. 
3주, 6주차는 공휴일이라 온라인 보강 예정되어있다. 

수업은 이번주차 강의를 모두 학습하고 와라. 무조건. 화요일 자정까지 듣고 와라.
온라인 강의는 1배속으로 꼭 들어라. 매주 출석 파란색이 떴는지 꼭 꼭 확인해라.
들으면서 2-3분정도 시간동안 물어볼 수 있는것들을 준비해와라.

**** 대면강의는 6시 정각에 무조건 스마트 출결을 한다!!!!!!! 1초 늦으면 무조건 지각처리다!!!! 미리 미리 와라 무조건 !!!!! ******

출석 10 / 과제 20 / 중간 40 / 기말 30 (팀플20,퀴즈10)

중간고사는 수업만 잘 듣고 고민하며 공부해왔다면 잘 풀 수 있는 평이한 문제로 낼 것이다.

기말은 프로젝트 20 / 중간 이후에 온라인강의 안듣는 애들 많아서 온라인강의에서 내는 퀴즈 2회 10점으로 점수산정을 했다.

과제는 의미도 모른채로 내지 마라. 설명할 수 있는, 내것으로 만든 코드만 제출을 해라. 
챗지피티 돌려서 얻은 결과 보다는 교수님이 가르쳐준 방식으로 해서 내는 것이 좋을거다. 질문 한두번 해보면 금방들통난다. 

학습내용질문은 eclass 강의 QnA 게시판 에다가만 한다. 

공부도 잘해져야 재밌다. 게임도 잘해야 재밌듯이 지속적인 노력과 지속적인 관심(흥미)을 쏟는다면 언젠가 재미있어지는 순간이 올 것이다. 
그때가 오기 시작하면 이 분야에 자신감을 갖게 될 것이고 졸업 시 튼튼한 자산이 되어줄 것이다. 

====================================================================
<<<1주 온라인#1 데이터 통신의 개념>>>

통신이란 무엇인가. 
신호로 소통을 하는 것이 통신인데 수신호, 봉화, 문자, 그림 등 우리는 오랫동안 통신을 해왔다. 

최근에는 전기통신, 광통신 같은 현대의 통신들을 하기도 한다.

통신에는 어떤것이 있어야 하나. 

<정보>, <전달할 매개체>가 있어야 통신이 가능하다. 

즉 <정보>와 <전달수단>. 이 두가지의 개념이 있어야 통신이다. 

-> 예를 들면 음성 정보와 그것을 전달할 수 있는 전화망. / 편지와 그것을 전달할 수있는 우편망이 있다.

<데이터>는 '정보'인데, 사용자간에 합의된, 임의의 형태로 표현되어있는 정보이다

그렇다면 <데이터통신>은 뭘까?

사용자간 합의된 임의 형태의 정보(=데이터)를 적절한 전달 수단으로 주고받는것일 것.

-> 정확히, <데이터 통신>은 특정 형태의 전송매체를 통한 두 장치간의 데이터 교환이다. 

그러면, <디지털 통신>은 또 뭘까?

모든 정보를 <디지털화>하여 송수신하는것이다. 

<디지털화>는? --> 정보를 <이진데이터>로 표현한 것을 디지털화 했다고 한다. 0101010011......

<디지털>은 물질·시스템 등의 상태를 이산적인 숫자 신호로 표현하는 일. // 반의어:아날로그(analogue).

최근에는, <디지털데이터>의 통신수단도 디지털기기와, 디지털 망을 이용하는데,

내가 가진 아날로그 정보를 적절히 이진데이터 비트(디지털화)로 변환을 하고, 그 비트열들을 디지털방식으로 주고받는 일이 일어난다. 

(디지털방식이란, 디지털데이터를 디지털기기와 디지털 망을 이용하여 송수신하는 방식일 것.)

그러면 오늘날 우리 대부분이 사용하는 <디지털 통신>의 장점이 뭘까? 

아날로그통신에 비해서 <이산적인 상태값>을 갖고, <이산적인 관측시간>에 송수신하면 되기 때문에 송신 중 잡음이나 왜곡 현상이 발생해도 <오류식별과 복원>!!!!!!!!이 쉽다!!!.

또, 다양한 음성, 이미지, 영상 등의 정보를 모두 동일하게 이진데이터로 변환하므로 <통신망의 공유>가 가능하다. 

무슨말이냐면, 옛날 전화기로 동영상을 주고받을 수 없지만 오늘날 스마트폰으로는 음성도, 영상도 주고받을 수 있다는 것. 

반도체기술을 적용해서 <통신장치 소형화>를 할 수 있고, 통신장치의 <전력 소모량이 적으며>, <높은 신뢰도의 통신>을 할 수 있는 시대이기 때문에 소통은 <디지털통신>이 짱먹었다.


<데이터통신 시스템의 기본특성>은 DELIVERY, ACCURACY, TIMELINESS 세가지이다. <DAT>

<전달성> / <DELIVERY> : <정확한 목적지>에 데이터를 전달해야 하고

<정확성> / <ACCURACY> : <전송중 변형없이 정확히> 데이터를 전달해야하고

<적시성> / <TIMELINESS> : <적정시간내>에 데이터를 전송해야 한다. 
->순서대로, 과도지연 없이 말이다. 
일정시간내에 인증번호를 전송하지 못하면 타임아웃으로 전송이 실패되었다는 오류가 뜬다.


====================================================================
<<<1주 온라인#2 컴퓨터 네트워크>>>

<컴퓨터 네트워크>는 "통신링크로 서로 연결된 장치들의 모임"이다.

<통신링크>란 데이터를 보낼 수 있는 물리적인 매체. 전송매체다.

예로 유선통신이면 전선이나 광케이블이 통신링크이고, 무선통신이면 공기가 통신링크이다.

통신에 필요한, 통신링크들로 연결된 다수의 장치들의 모임(망)을 <컴퓨터네트워크>라고 한다.

정보전송장치, 수신장치, 그 가운데 통신에 관여하는 장치(라우터,허브,스위치)등이 컴퓨터네트워크를 이룬다.
 

네트워크는 분산처리에 사용된다. 
분산처리가 필요없다면, 1대1 통신만 해도되므로 망을 구성하지도 않았을것. 

<컴퓨터 네트워크의 5가지 구성요소>***********
-> 송신기(정보전송) : 네트워크에 연결되어있는 노드 중 정보를 전송하는 노드.
-> 수신기(정보수신) : 네트워크에 연결되어있는 노드 중 송신기로부터 정보를 수신하는 노드.
-> 메시지 : <송신기>는 <수신기>에게 데이터를 직접 보내는 것이 아니라 <메세지>를 보내게 된다 .(데이터를 패킹한 것이 메세지이다.) 
실제 필요한 것은 데이터이지만 송신기는 그 데이터를 효율적으로 멀리있는 수신기에게 보낼 수 있도록 메세지로 <패킹>을 해서 보낸다.
-> 전송매체(통신링크) : 송신기가 수신기에게 메세지를 보낼 때 <메세지가 이동하는 유/무선의 물리경로>를 전송매체라고 부른다.
-> 프로토콜 : 송신기와 수신기 사이에 어떻게 메시지를 보내고받을건지, 보낸 메시지를 언제 어떻게 받아들이고 어떻게 해석할 것인지에 대한 "규약"이다.
정확히말하면 <통신규칙의 집합>을 프로토콜이라 한다. <통신장치들 사이의 상호합의된 규약>이다. 

원 데이터가 아날로그일지라도, 컴퓨터시스템 내부에서 처리하기 위해서는 모두 디지털화/이진화된 정보로 변환되어야 한다.

컴퓨터 시스템 내부에서 각 데이터는 일정한 형태의 비트열로 표현되는데,

각각의(문자, 숫자, 이미지, 오디오, 영상 등) 데이터들은 그 데이터를 어떻게 표현하는 것이 효율적이냐에 따라 
(표현하고자 하는 비트열의 길이나 코드화 되어지는 방법 등) 표현방법들이 다 다르다. 

예로, 문자는 호환성을 높여서 다른 시스템 간에도 호환되도록 문자를 표현하기 위한 비트 패턴들의 집합을 사용한다. 

수는 호환성보다 현 시스템내에 빠르고 효율적인 산술연산을 하기위한 비트패턴 사용,  오디오는.... 영상은..... 어떻게 하여튼 모두 비트열 표현방식이 다르다.

** 중요한 개념으로, 데이터를 패킹한 <메세지> 또한 비트열로 이루어져 있다. 

이 비트열 메세지를 어떻게 전송하고 수신할까?
->>메시지는 전송매체를 통해 송수신하기 적합한 형태의 <전자기 신호>로 변환되어야 한다. 
->>>송신측은 메세지를 신호로 부호화(인코딩)하고, 수신측은 신호를 메세지로 복호화(디코딩)하는 것이다. 


아날로그 vs 디지털 (관측신호 // 관측시점의 상태값 (이 연속적인가? 이산적인가?))

아날로그는 연속적인 상태값을 가지고 있다. 정확히는 "연속된" 관측시간 동안에 가질 수 있는 값들의 범위가 "연속값(무한)"이다.

디지털은 신호를 관측하는 관측시간도 "이산적인" 간격을 가지고 있고(1초에 한번, 0.01초에 한번 관측), 관측되는 값의 범위도 "이산적"이다. (몇가지의 값중 하나가 관측된다.)

내 목소리는 아날로그다. 연속된 관측시간동안 연속적인 값을 가질 수 있기 때문에.
그런데 목소리를 컴퓨터로 녹음을 했다면 온전히 무한하고 연속적인 데이터로 디지털화되지 않는다.
내 목소리는 무한하고 디지털은 유한하기 때문에, 내 목소리를 온전히 모두 디지털화한다는 것은 애초에 말이 안된다.  

현실에선 내 목소리를 적절히 샘플링하여 이산적인 상태값을 갖고있는 임의의 비트열로 만들어놓음으로써 디지털데이터로 변환하는 것이다. 

** 중요
<데이터 자체>가 아날로그와 디지털 두가지로 구분될 수 있는것과 "별개로", 
이 데이터를 전송하기 위한 <신호> 역시 아날로그신호일 수 있고 디지털 신호일 수 있다. 
내가 전송매체를 통해 전달하는 신호가 아날로그 신호이면 전송하고자 하는 데이터가 디지털데이터라 할지라도 아날로그방식으로 전송할 수 있는 것이다. 

<GPT>
디지털 음악 파일(MP3 파일)을 예로 들어보겠습니다. 이 파일은 디지털 데이터로 구성되어 있지만, 이를 전통적인 라디오 방송을 통해 송출할 때 아날로그 신호로 변환하여 전송합니다. 즉, 디지털 데이터를 아날로그 방식으로 전송하는 것이죠. 라디오 수신기는 이 아날로그 신호를 받아 음악을 재생하게 됩니다.
이처럼 전송하려는 데이터가 디지털이더라도, 전송 매체(라디오 주파수 등)에 맞게 아날로그 신호로 변환하여 보낼 수 있다는 뜻입니다.


아날로그 전송 vs 디지털 전송

아날로그전송 : 훼손된 신호가 왔다고 하면 이 신호가 훼손된건지 원신호 그대로인지 알 수가 없다. 

<GPT의 예시 - 라디오 신호 훼손 시 수신측에서 왜곡여부 알기 힘듦>
만약 라디오 수신기(아날로그 신호받음)와 방송국 사이에 전파 방해가 일어나거나, 신호가 약해져서 제대로 수신되지 않는 경우, 수신된 신호는 잡음이 섞이거나 왜곡될 수 있습니다.
이 때, 수신기에서 들리는 소리가 원래 방송국에서 보낸 소리와 정확히 일치하는지 아니면 잡음이 섞인 손상된 신호인지를 수신자 입장에서는 구분하기 어렵습니다.
왜냐하면, 아날로그 신호는 연속적인 값을 가지기 때문에, 신호가 조금 변형되어도 그 차이가 명확하게 드러나지 않습니다. 
예를 들어, 소리의 음높이나 음량이 약간 왜곡되어도 사람 귀로 듣기에 그 차이가 미세하다면 원래 신호인지, 아니면 손상된 신호인지를 명확히 구분할 수 없습니다.
디지털 신호는 0과 1로만 이루어져 있어 손상이 발생하면 이를 감지하고 수정하기가 상대적으로 쉬운데, 아날로그 신호는 이러한 명확한 경계가 없기 때문에 손상된 부분을 알아채기가 어려운 것이 특징입니다.
따라서 라디오처럼 아날로그 신호가 훼손되었을 때, 원래 신호에서 얼마나 왜곡이 발생했는지, 또는 그 왜곡이 단순한 전파 방해인지 여부를 확인하기가 어렵습니다.


또 아날로그신호는 원거리 전송에 용이 하지만, 원거리일수록 신호의 세기가 감쇠하기 때문에 수신측에서 증폭을 해야하는데 이때 잡음 노이즈까지 증폭되기 때문에 오류확률도 커진다.

디지털 전송 : 디지털신호는 이산적인 상태정보를 전송하다보니까 상대적으로 오류 식별하고 복원하는 것이 아날로그전송보다 쉽다.
또 연속적인 상태정보를 갖고 있는 것이 아니다보니까 전송 대역폭을 좀더 효율적으로 사용해서 더 많은 용량의 전송들을 가능하게 한다.
기술발전으로 장비 소형화 가능하다, 상대적으로 가격이 저렴하다. 또 암호화가 용이하다.



====================================================================
<<<1주 온라인#3 네트워크 분류 및 프로토콜>>>
====================================================================
컴퓨터 네트워크를 몇가지 기준에 따라 분류해보려 한다. 

<운영 형태에 의한 분류>

세가지가 있는데, 먼저 가장 우리에게 친숙한 클라이언트-서버 모델이 있다. 
서버가 있고 다수의 클라이언트들이 하나의 서버에 접속해서 서버로부터 필요한 정보들을 얻어가는 것이다. 

두번째 "P2P", "Peer to Peer 모델" 인데, 컴퓨터의 역할이 서버나 클라이언트같은 고정역할이 아니라,
현재 네트워크에 참여하고 있는 컴퓨터들이 서버의 역할도, 클라이언트의 역할도 될 수 있는 것을 의미한다. 

좀 더 어렵게는 서버 기능을 하는 컴퓨터 없이 망을 구성하는 것이다. 

예로는 토렌트가 있다. 토렌트같은 파일 공유 서비스를 보면 하나의 서버에 접속해서 그 서버에서 제공하고 있는 파일들을 얻어가는 게 아니라 내가 가지고 있는 파일을 공유하면서 동시에 다른 사람들의 공유 파일을 전달받을 수 있는 그런 모델이다. 

세번째, 애드혹(Ad-Hoc) 네트워크 모델은 센서와 주변 센서들이 서로 통신하며 정보를 전파하는 새로운 개념이다.



<데이터 전송방식에 따라 컴 네트워크를 분류>

첫번째. "회선스위칭" 방식이 있다. 옛날 아날로그 방식이고, 전화통신 같은곳에서 사용하는 데이터 전송 방법이다. 
전송하기 전에 시작점과 도착점 사이의 회선을 물리적으로 구성한 뒤에 데이터를 보내게 되는데, 설정된 회선으로 외부 간섭 없이 안정적으로 통신이 가능하다.
하지만 회선이 구성되면 회선을 유지하기 때문에 비효율적이다. 또 통신량이 많지 않을 경우에 효율적으로 사용할 수 있는 방법이다. 

예를 들어 오늘날 컴퓨터 통신은 거의 24시간 통신해야할 경우도 생기는데 이런 경우 통신량이 많다. 나 뿐만 아니라 모든 사용자들이 그렇게 많은 통신량을 유지한다고 한다면 그렇게 수시로 발생하는 통신때문에 계에속 회선을 연결해놓고 있으면 사실 효율적으로 통신하기 어렵다.

두번째. 그래서 컴퓨터 네트워크는 오늘날 "패킷 스위칭"이라는 기법을 사용해서 통신을 한다. 데이터를 연속적인 회선을 통해서 통신하기 보다, 하나의 메세지를 패킷이라는 작은 정보단위로 분리하고, 나뉘어진 각 패킷들을 가장 효율적인 경로를 찾아서 목적지까지 전달해주는 방법이다. 
회선스위칭과 달리 한 메세지가 같은 경로를 통해서 전달되어질 필요가 없다. 패킷별로 다 다른경로로 전달되어도 된다. 대신 패킷을 받는 쪽에서 다시 순서대로 배치할 수 있어야 한다.



<서비스 범위에 따른 컴퓨터 네트워크 분류>

개인영역 통신망, 근거리 통신망, 원거리 통신망이 있다. 

개인영역 통신망(PAN : Personal Area Network)은 수 미터 이내에서 동작하는 컴 네트워크이다. 
USB같은 유선통신도 있고 블루투스같은 무선통신도 있다. 

근거리 통신망은(LAN : Local Area Network) 집이나 학교건물같은 소규모 지역단위 컴 네트워크. 
유선 LAN은 Ethernet, 무선 LAN은 WIFI가 있다. 
10Mbps ~ 10Gbps 혹은 그 이상까지 통신할 수 있음.

원거리 통신망은(WAN : Wide Area Network) 시,도,국가 단위 연결하는 컴 네트워크다.

근거리통신망보다 원거리통신망이 호스트와 호스트 통신 시 그 네트워크에 참여하게 되는 호스트의 개수가 기하급수적으로 많아진다. 
또 거리가 멀어짐에 따라 신호를 멀리까지 보내는 데 제약이 있을수밖에 없다.  



<연결방식에 따른 정보통신망(컴_네트워크) 분류>

유선망 : Ethernet. 이더넷이 뭐냐하면 유선 네트워크 프로토콜 중 짱먹은 놈. 랜선으로 공유기와 본체를 연결해도 이더넷 프로토콜 방식으로 소통한다. 
유선망은 동축케이블이나 트위스트페어케이블 같은 구리선 케이블(전기신호로 통신)도 있고 광섬유케이블로 빛으로 통신하는 방법도 있다. 


무선망 : 전자기장 신호를 공기중으로 전달하며 소통함. 케이블처럼 기기 to 다음 기기 이렇게 소통하지 않기 때문에 전달되는 데이터의 충돌이 잦을 수 있고, 해킹 등에 쉽게 노출될 수 있다.

AP라는 무선 중계기(안테나)를 통해 호스트와 호스트간의 통신이 계속 이루어진다. 집의 무선공유기가 AP역할을 하는 것이다.
AP는 유선으로 인터넷망과 연결되어 있다. AP의 안테나를 이용해서 근처에 있는 다수의 장치들과 무선신호를 주고받을 수 있는 것이다. 
즉 하나의 AP근처의 장치들이 이 AP를 통해서 인터넷 망에 간접적으로 연결이 되어서 통신하는 것이다. 
만약 근처 장치가 AP와 점점 멀어지면 어느순간 AP가 커버할 수 있는 범위를 넘어서서 인터넷 연결이 뚝 끊기게 된다. 
AP와 신호를 더이상 주고받을 수 없게 되어서 인터넷이 끊긴거다. 


모바일망 : AP역할을 할수있는 가까운 기지국(셀 타워)에 연결되어져서 인터넷을 사용하다가 기지국(셀 타워)이 커버할 수 있는 영역을 벗어나면 다시 가까운 기지국 셀타워와 연결을 하여, 인터넷유선연결이 되어있는 기지국을 계속 바꿔가며 통신하는 것이다. 이 과정이 고속 장거리 이동 중에는 자동으로 되어진다. 
핸드폰에서 사용되는 LTE나 5G 등이 대표적인 모바일망이 된다. 각 통신사에서 별도의 과금체제를 가지고 제공을 하는 서비스이다. 


<프로토콜이란?>
프로토콜은 데이터 송신자와 수신자 간에 정보를 원활히 주고받기 위해 정해진 규약이다. 
중요한 것은 하나의 통신 프로토콜은 통신을 하기 위한 모든 규칙들을 한데 모아놓은 것이 아니라, 각계층에서 각각 어떻게 통신해야 하는지 그 각각의 프로토콜들이 있는 것이다. 

무엇을, 언제, 어떻게 통신할 것인지를 정의한다. 

하드웨어 레벨에서의 규약 - 물리적인 레벨에서 어떻게 신호형태로 정보를 변환할것인지, 
데이터를 패킷으로 포멧하는 규약 - 데이터를 어떻게 패킷이라는 형태로 포멧팅할것인지에대한 규약
전달을 효율적으로 하기위한 규약 - 다수의 장치들이 동시에 물려있는 네트워크상에서 어떻게 효율적으로 목적지까지 패킷전달을 할것인지에대한 규약
데이터 오류 발생시 처리규약 등이 있다. 


====================================================================
<<<1주 온라인#4 네트워크 모델>>>
====================================================================

네트워크 모델이란? 네트워크 통신에 대한 표준이다. 
기본적인 하드웨어, 소프트웨어 변경 없이 다른 시스템 사이의 원활한 통신을 하기 위해 네트웤 통신의 표준이 있는 것이다. 

네트워크 모델은 알다시피 계층으로 이루어져있다. 
서로 연관된 계층으로 구성되어있고, 각 계층에서는 그 계층에서의 task를 수행할 수 있도록 처리되고 있다.
각 계층은, 다른 계층의 기능과 구분되는 기능의 집합으로 정의된다. 

전체적인 데이터 전송과정을 정리하고, 근본적인 역할 개요(뼈대)를 만들고 그것을 계층으로 정리한 후, 전체 과정을 계층으로 분류했다고 생각하면 된다. 

중요한 것은! 각 <계층>은 처리할 고유기능과, <다른 시스템의 동일계층과 통신하는데 필요한 기능> 을 담당한다. 

시스템마다 하드웨어 소프트웨어가 다르기 때문에 통신 시 정확히는 계층간 통신을 한다. 각각의 네트워크장치들은 각각의 계층마다 표준 프로토콜만 지키고 따른다면 이종(다른) 시스템과도 정상적으로 통신할 수 있다. 

따라서 특정 계층에서 통신하는 각 장치의 프로세스들을 <대등 대 대등 프로세스>라고 부르기도 한다. 
한 장치에서 각각의 계층은 그 아래 계층에서 제공하는 서비스를 요구하고 있는 것이고, 그 요구사항을 위해 현재 계층에서 일을 처리하는것.

(예로 편지쓰고 우표 붙이고 우체통에 넣는 것까지가 나라는 계층이 할 일이다. 다음 계층에서 그 편지를 어떻게 목적 우체통까지 전달하는지는 우체국계층의 일이고, 그다음 온 편지를 우체통에서 꺼내 받아보는 것은 또 받는사람의 계층에서 할 일이다. )

이어서 말하면, 따라서 각각의 계층은 <프로토콜>이라는 그 계층에서 수행되어질 기능들에 대한 합의된 규약에 근거해서 처리가 되어진다.
이 프로토콜 내용들은 각 계층에서 처리하고있는 메시지의 헤더부분에 기록이 되어져있다.

논리상으로는 두 호스트 간의 각각의 계층끼리 통신을 하는 것으로 간주하지만, 실제적으로는 내 시스템의 인접 계층과 통신을 하는 것이다. 
따라서 각 계층은 인접한 계층과 적절하게 인터페이싱 되어야 할 것이다.  

예를 들어, 내가 물리층이다 라고하면 실제 전송매체에 대해서 어떻게 신호의 형태로 변환해서 정보를 전달할지, 또 전달되어진 신호를 어떻게 비트열로 보관할지와 같은 정보들을 담고있을 것이다. 

내가 동축케이블이나 트위스트 페어케이블같은 케이블로 전기신호를 보냈었는데 광케이블로 바꾸면 현재 계층에서 내가가진 패킷들을 어떻게 신호의 형태로 변환하는지, 또 변환된 신호가 어떻게 다시 원래 비트열로 복원되어질 것인지만 담당하며, 그 정보를 상위 계층으로 전달만 잘 해준다면 실제 현재 레벨에서 처리하는 내용이 완전히 바뀌겠지만, 다음계층에 지장이 없이 원활히 통신이 이루어지게 된다. 

네트워크 모델 중에 가장기본인 <OSI 모델>이 있다. "Open System Interconnection" 인데, 직역하면 "개방 시스템의 상호연결"이 된다.
-> ISO라는 국제표준기구에서 만들어진, 서로다른 시스템간 통신을 허용하는 네트워크 시스템을 설계하기 위한 목적으로 만든 모델이다. 
-> 실제 통신에 사용되는 프로토콜이 아니고! 실질적인 프로토콜을 만들기 위한 기준을 제시하는 <이론적인 모델>에 불과하다. 
-> 유연,안전,상호연동 가능한 네트워크 구조를 이해하고 설계하기 위한 모델이다.

이 <OSI>가 그 유명한 <OSI 7계층>이다. 1층부터 7층까지 각각 물리층, 데이터링크층, 네트워크층, 전송층, 세션층, 표현층, 응용층이다. 
OSI 7계층은 각각의 계층에서 어떤 기능을 담당해야 하는지 명확하게 제시해줌. 


하지만 우리가 사용하는 인터넷에서는 OSI 모델을 쓰는 것이 아니라 TCP/IP 프로토콜이라는 모델을 사용한다. 
<TCP/IP 프로토콜>은 서로다른 다수의 망을 통하여 통신하기 위한 프로토콜의 집합을 말한다. 

<TCP 프로토콜>과 <IP 프로토콜>의 합으로 이뤄져있다. 

<TCP 프로토콜> : Transmission Control Protocol - 전송을 제어하는 프로토콜. 
----> 1500바이트 단위로 정보를 묶어서 패킷을 만듦.

<IP 프로토콜>   : Internetworking Protocol - 여러네트워크들을 거쳐서 정보를 전달하기 위한과정에 필요한 프로토콜들임. 
----> 패킷을 받아서 주소를 해석하고 다음 경로를 결정함.

인터넷이라는 것은 이 Internetworking 에서 유래된 단어이다. 


<TCP/IP 프로토콜>은 5계층으로 이뤄져 있다. OSI의 7계층을 5개로 줄여서 표현한건 아니다. 사실 OSI 이전에 TCP/IP가 존재했다.

OSI의 7계층처럼 엄격한 계층구조를 갖고있지 않고 상대적으로 느슨한 계층구조를 갖는다. 

느슨하지만 실제 사용가능하도록 만들어져있다. 이게 중요한것.

대략적으로 보면 1층부터 5층까지 <물리층>, <데이터링크층>, <네트워크층>, <전송층>, <응용층> 이렇게 있다. 

이름이 비슷하다고 해서 OSI계층과 정확히 매핑되는 것은 아니다. 


1계층부터 3계층인 물리, 데이터링크, 네트워크 층은 묶어서 <네트워크 지원계층>이라고 한다. 
<네트워크 지원계층>은 통신장치간에 데이터 이동에 필요한 {물리적인 면} 을 처리한다. 하나의 패킷이 송신기에서 수신기라는 특정 호스트까지 전달되는 데 필요한 부분 담당. 

물리층 - 물리적인 신호로 데이터를 어떻게 주고받으면 되는지 처리.

데이터링크층 - '하나'의 네트워크 안의 '두 장치'간에 온전한 데이터 전송에 필요한 부분을 처리한다. 네트워크 하드(?)에 하드웨어주소, 물리주소를 기반으로, 하나의 장치에서 다른장치로 정보전달함. 

네트워크층 - 실제 우리가 필요한 것은 종단 대 종단의 통신인데 그 사이에 여러 네트워크들로 구성이 되어 있기 때문에, 송신기가 연결되어져 있는 네트워크에서부터 수신기가 연결되어있는 네트워크까지 여러 네트워크를 거슬러서 어떻게하면 최종목적지까지 전달이 될것이냐 하는 정보들을 담고있음. 
각각의 시스템을 구분할 수 있는 논리적 주소인 <IP주소>를 기반으로 해서 목적지까지 정보를 전달한다. 


4계층과 5계층인 전송, 응용 층은 묶어서 <사용자 지원계층>이라고 한다. 
사용자 지원계층에서는 그 호스트 내의 특정 사용자에게 정보를 전달하기 위해서 어떤 지원이 필요한가를 기술하고 있다. 

전송층 - 목적지 컴퓨터 내에서도 하나의 프로그램만 통신을 하고있지 않을 수 있다. 유튜브를 보면서 배그를 다운받을 수 있다. 동시에 카톡알림도 받는다. 
이렇게 내 컴퓨터의 여러 프로세스들이 동시에 네트워크를 사용한다. 구체적으로, 현재 만든 이 패킷은 누구에게 전달이 될지 식별할 필요가 있다. 
그 일을 하기 위해서 전송층은 <포트번호> 라는 것으로 특정 프로세스에게 해당 패킷을 전달한다.

응용층 - 특정 응용프로그램 레벨에서 필요한 처리들을 수행한다. 예로 서버와 클라이언트 두 호스트간 통신이 이루어진다해봄. 웹서버로 부터 하나의 웹문서를 제공받았는데, 클라이언트 나는 그것을 어떻게 화면에 띄울 것인지. 이런것들이 응용 층, APPLICATION 레벨에서 이뤄지는 작업이다. 


전송층이나 응용층은 송 수신기에서만 사용되고, 펼쳐본다. 중간단계에서는 참조하지 않는다. 
중간 단계에서는 현재 신호중 5계층을 다 펼쳐보는 것이 아니라 물리적인 주소와 놀리적인 주소정도만, 즉 한단계의 네트워크내에서 누구에게 전달될것인지, 또 그정보를 어떤 다음 네트워크로 전달하면 될 것인지 이런거만 본다. 


====================================================================
<<<2주 온라인#1 인터넷 개요>>>
====================================================================

우리가 사용하는 컴퓨터 네트워크는 '인터넷'이다. 

인터넷은 '인터네트워크'에서 파생됨.

<인터네트워크>란? 네트워크 간의 네트워크다. 

네트워크라는 것이 '통신에 필요한 다수의 노드들의 연결망' 이었는데, 그런 연결망들이 다시 네트워킹 되어져 있는 구조를 <인터네트워크>라 한다. 

즉, 네트워크 여러개가 연결되어있는 구조다. 

특정 네트웤에 있는 호스트는 다른 네트웤에 있는 호스트와 여러 네트웤을 거쳐서 통신한다.  

A장치가 D장치에 통신할때, 네트워크들과 네트워크들 중간에있는 <라우터> 혹은 <스위치>장치들이 A가 보내는 메세지를,
동일 네트워크 안의 두 장치간 전달을 위해서는 두번째 계층(데이터링크층)까지 펼쳐보고, 
다른 어떤 네트워크로 전달하면 되는지 결정하기 위해서는 세번째 계층인 네트워크층을 열어본다.
네트워크층을 열면 나오는 논리적인 주소를 통해 어떤 네트워크로 보낼 것인지를 결정을 해서, 그쪽 네트워크로 보내기 위해서 다시 두 장치간의 데이터 전달을 위해 데이터링크층에서 물리적인 주소를 사용해서 물리층을 통해서 전달하는 일을 수행한다. 

< GPT >
- 현재 A 장치는 데이터를 패킷 형태로 만들어 D 장치로 보내려고 합니다.
- 네트워크 중간에 라우터와 스위치가 있음 : A와 D가 동일한 네트워크에 있지 않다면, 중간에 라우터나 스위치 같은 네트워크 장치들이 메시지를 전달하게 됩니다.
- 데이터링크층 (2계층)에서 메시지 확인 : 중간에 있는 스위치나 라우터는 먼저 데이터링크 계층(2계층)을 열어봅니다. 이 계층은 두 장치 간의 물리적인 주소(MAC 주소)를 가지고 데이터를 주고받는 역할을 합니다. 이를 통해 데이터를 같은 네트워크 안에서 전달할 수 있는지 확인합니다.
- 네트워크층 (3계층)에서 라우팅 결정 : 그 다음으로, 만약 메시지를 다른 네트워크로 보내야 한다면, 장치는 네트워크 계층(3계층)을 열어봅니다. 여기서는 IP 주소와 같은 논리적인 주소를 보고, 어느 네트워크로 데이터를 보내야 할지를 결정합니다.
- 결정된 네트워크로 데이터 전송 : 목적지가 있는 네트워크로 메시지를 보내기로 결정되면, 다시 데이터링크 계층에서 물리적인 주소(MAC 주소)를 사용해 데이터를 전달하고, 물리적인 네트워크를 통해 패킷을 전송합니다.
- A에서 D로 가는 메시지가 중간에 있는 네트워크 장치들(라우터나 스위치)을 거치면서, 데이터를 어떤 네트워크로 보내야 하는지 결정하고, 그 네트워크 안에서 물리적으로 메시지를 전달하는 과정을 설명한 것입니다.

즉, 각각의 네트웤을 연결하고 있는 라우터라는 장치를 거칠 때 마다 2계층(데이터링크층)과 3계층(네트워크층)에 있는 물리주소와 논리주소를 이용해서 어느 네트웤으로 
보내야할지, 또 그 네트웤의 어떤 장치로 보내야 할지를 식별을 해나가면서 통신을 하는것이다. 

네트워크간 연결망인 <인터네트워크> 중에, 우리가 오늘날 널리 사용하는 것은 <인터넷>이다.

우리는 이 <인터넷>을 통해 전세계의 컴퓨터들 간 정보를 주고받는 <컴퓨터통신>을 한다. 

데이터그램 방식 : 한 패킷을 전달하기 위해서 하나의 고정 경로로 다보내는 것이 아니라, 
해당 패킷을 전달하는 순간에 가장 효율적인 경로를 통해 정보전달을 할 수 있도록 한다. 
첫번째 패킷 보낼때 사용했던 경로가 어떤 문제가 발생하여 사용불가해도 차선책의 다른 경로를 통해서 패킷 전달 가능하다. 


다만 <인터넷>에서는 TCP/IP 프로토콜을 사용하여 인터네트워크에 연결된 모든 장치들 간 통신을 한다. 

TCP/IP 프로토콜은 TCP프로토콜과 IP프로토콜을 합친 것.


<TCP 프로토콜> : Transmission Control Protocol 
- 내가 보낼 데이터를 여러개의 패킷으로 나누어 각 패킷이 제대로 전송될 수 있게끔 하는 내용이 있음. 
(두 시스템 간 신뢰성있는 데이터전송을 관장함***)

-> 데이터의 흐름 관리 : 데이터를 얼마나 빨리 보내야 할지 정함. 
-> 수신데이터가 정확한지 확인.
-> 데이터의 패킷화/패킷들로부터 원데이터 복구.
-> (1500바이트 단위로 정보를 묶어서 패킷을 만듦.)

<IP 프로토콜>   : Internetworking Protocol 
- 여러 네트워크들을 거쳐서 정보를 전달하기 위한 과정에 필요한 프로토콜. 
-> 패킷을 받아서 주소를 해석하고 다음 경로를 결정함.***
-> TCP 프로토콜 하위에서 기반 역할을 해줌.
-> IP주소는 IP프로토콜에서 사용되는 주소임.



컴퓨터A - (j포트)와 컴퓨터 P - (k포트)가 TCP/IP 통신을 한다고 했을 때, 

<5계층> 
(5)어플리케이션층 - A가 전달하는 데이터는 어플리케이션 층에 있고, 한번에 전달하기 힘드므로 바로 아래 전송층에서 여러 패킷으로 나뉜다. 

(4)전송층 - 이때 분리되어진 패킷들은 수신기의 전송층에서 다시 재조합될 수 있게 패킷순서대로 번호가 부여되어 있다.
또 송신기의 어떤 프로세스에서 송신한건지와 수신기에 어떤 프로세스로 전달할지가 나와있는 A와 P의 포트번호도 담겨있다.
수신기의 전송층에서 이걸보고 K번 프로세스에게 패킷을 전달한다. 

(3)네트워크층 - 네트워크층에서는 각 패킷의 뒤에 논리주소인 IP주소를 또 추가한다. 
현재 그래서 네트워크층에서 패킷은 DATA-1-j-k-A-P 이렇게 되어 있다. 

(2)데이타링크층 - 네트워크안에서 송신장치의 물리주소와 수신장치의 하드웨어주소(물리주소)를 패킷의 끝에 추가한다. 
이때 이 네트워크에 다음 경로가 없다면 이 네트워크와 외부네트워크를 연결해주는 라우터의 주소가 패킷의 끝에 있다.
네트워크를 거슬러가면서 패킷이 전달됨에 따라 매번 송수신기에대한 하드웨어주소는 변화해 가는데, 나머지 포트번호와 논리주소 J,K / A,P는 변하지 않는다.

(1)물리층

다시한번, TCP는 전달되어진 패킷이 제대로 전달되었는가를 확인.
IP는 패킷이 이상하게 전달되건 말건 주어진 패킷을 목적지까지 전달함.

인터넷이 TCP/IP프로토콜을 사용하므로, 인터넷주소는 IP이다.
전화번호처럼, 인터넷 주소(IP)도 마찬가지로 인터넷상의 각 장치를 유일하게 식별하기 위한 범용적인 논리주소이다.
IP주소의 등록 및 관리는 NIC라는 곳에서 한다. 

이런 인터넷주소는 크게 IP주소라는 숫자주소와 / 도메인 네임이라는 문자열주소로 나뉜다.

원칙적으로는 숫자주소, IP가 인터넷주소가 맞다. 
하지만 사람이 숫자주소를 일일히 기억하며 컴퓨터를 구분하는 것은 쉽지 않다. 

좀더 사람이 구분하기 쉽게 해놓기 위해서 IP주소에 매핑되어진 도메인네임(DOMAIN NAME) 이라는 것을 만들어 

IP주소가 아닌 도메인네임으로도 통신을 할 수 있도록 한 것이다.

IP주소는 또 IPv4와 IPv6으로 나뉜다. v는 version임.

IPv4 - 32비트 이진주소 // 고유주소를 2의 32제곱개 정도 만들수있음.

IPv6 - 하위호환성을 갖는 128비트 주소. // 128개의 비트열을 통해서 주소표현하므로 2의 32제곱개 고유주소를 만들수있다. // 기존 32비트주소와 호환성을 갖도록 만들어져 있다. 


====================================================================
<<<2주 온라인#2 IP주소와 도메인 네임>>>
====================================================================

IPv4에서, 사람이 32비트의 2진주소를 기억하기는 어려웠다. 10진정수 4개를 기억하는 것이 더 편했다. 

따라서 IP주소는 (8비트 X 4구역)으로 나눠 4개의 10진정수를 점 . 으로 구분하여 표기하기로 했다. 



그러므로 자연스럽게 한 구역당 올수있는 10진정수의 범위는 0~255까지가 됐다. (2의 8제곱 = 256) 

따라서 300.400.500.600 는 없는 IP주소이다. 한 자리에 255가 11111111, 즉 최대숫자이다.



이런 IP주소는 또 클래스라는 단위로 나뉜다. A,B,C,D,E 클래스가 있다. 

<A클래스>는 IP주소의 첫 구역 첫 비트값이 0으로 시작하는 주소들을 묶는 단위다.\
<B클래스>는 




====================================================================
<<<2주 온라인#3 IP주소의 유형과 포트번호>>>
====================================================================


IP주소는 다시 두가지로 나뉜다. 

공인IP - 인터넷상에서 유일하게 식별가능한 IP 주소

공인IP주소 자리가 충분하지 못하므로 이 공인 IP주소의 부족을 해결하기 위한 방법으로, IPv6처럼 128비트로 주소 길이를 늘리는 방법도 있지만,
사설IP를 쓰는 방법도 있다. (사설IP 주소를 더 사용한다.)

사설IP - 네트워크 내에서만 유일하게 식별되는 지역적 주소다. 
내부에서는 사설IP로 각 기기들을 식별할 수 있지만, 외부 네트워크에서는 사설IP로 해당 네트워크 내부로 접근할 수 없다. 

따라서, 사설IP를 할당받고 있는 시스템(기기)은 직접 인터넷에 연결된 것이 아니라 하나의 공인 IP 주소를 다수의 사설 IP주소들이 공유한다.

집에있는 인터넷 공유기는 NAT(Network Adress Translation)기능으로 하나의 공유IP와 여러 사설IP를 매핑하고 IP번역을 해준다.

즉, 공유기와 사설IP는 우리 조직 내에 할당된 공인IP의 개수보다 더 많은 시스템(기기)들이 인터넷을 사용할 수 있도록 해준다.


<사설네트워크 주소대역>은, 

A클래스 : 10.0.0.0  -  10.255.255.255

B클래스 : 172.16.0.0  -  172.31.255.255

C클래스 : 192.168.0.0  -  192.168.255.255

예로, 내 컴퓨터의 IP주소를 확인해봤더니 192.168.~~~~ 이라면 이건 공인IP가 아니라 우리조직 네트워크 내부에서만 사용되는, 사설IP구나 라고 생각할 수 있는것이다.
외부에서는 내 컴퓨터가 통신할때 IP주소가 192.168.~~~~로 보여지지 않는다는 것이다.
내 데스크톱 IP주소가 192.168.0.1이라면 학교에서, 혹은 외부에서 192.168.0.1주소로 내 PC와 통신할 수 있는 방법은 없다!!!***
우리집 공유기가 뱉는 공인IP주소를 통해서 공유기로 통신한 다음 공유기가 내 PC로 네트워크 내 통신을 해주는 것이다. 


<동적 호스트 구성 - DHCP>
공인IP와 사설IP를 매핑하는 <인터넷공유기>에서는 보통 <DHCP프로토콜>을 이용해,
그 사설IP를 사용하는 네트워크 내의 개별 호스트들에 <자동>으로 주소를 할당한다.

그 네트워크에 연결되어있는 호스트들이 인터넷을 사용하기 위해 접속하는 순간** 자동으로 특정대역에 있는 사설IP주소 중 하나를 할당해준다
즉 특정 IP가 특정 시스템(기기)에 고정할당되는것은 아니다.

< GPT >
인터넷 공유기는 일반적으로 라우터 기능을 포함하고 있습니다. 
사실, 일상에서 우리가 "인터넷 공유기"라고 부르는 장치가 바로 라우터입니다. 
이 장치는 여러 기기들이 하나의 공인 IP주소를 사용해 인터넷에 접속할 수 있도록 해주는 역할을 합니다.

인터넷 공유기의 기능입니다.
- 라우팅 : 내부 네트워크(사설 IP주소 대역)와 외부 네트워크(인터넷, 공인 IP주소)를 연결하는 기능.
- DHCP  : 내부 네트워크의 기기들에게 사설 IP주소를 자동으로 할당하는 기능.
- NAT     : 사설 IP주소를 공인 IP주소로 변환해 외부 인터넷과 통신할 수 있도록 하는 기능.
- 스위칭  : 여러 기기가 동일 네트워크를 공유할 수 있도록 데이터를 각 기기에게 전달하는 기능.

따라서, 가정이나 사무실에서 사용하는 인터넷 공유기는 대부분 라우터, DHCP 서버, 스위치 등의 기능을 모두 포함하고 있는 하나의 장치입니다.


DATA-1-j-k-A-P를 떠올려 보자. 
패킷의 A,P 부분은 Source, Destination IP주소이다. 즉 출발지, 목적지 IP주소였다.

네트워크 내부에서, 패킷에 Source : 172.18.3.1 / Destination : 25.8.2.10 이라면, 현재 패킷의 출발지 IP는 사설네트워크주소대역 안에 있으므로 사설IP이다. (B클래스)

NAT(Network Address Translation)는 내부 Translation Table을 이용해 이 사설IP주소를 공유기의 공인IP주소로 바꿔서 외부 네트워크로 내보낸다.

즉 패킷이 외부 네트워크로 나갈 때 A P 부분인, Source : 200.24.5.8 / Destination : 25.8.2.10 이렇게 Source부분이 바뀌게 된다.
Destination부분은 이미 공인IP라 바뀌지 않는다.


공유기 내부의 <Translation Table>에는 <PRIVATE> 열과 <EXTERNAL> 열이 있는데, 공유기 본인의 공인IP주소는 공유기가 알고있으므로 테이블에 넣지 않고,

<PRIVATE> - 내부네트워크, 호스트의 사설IP
<EXTERNAL> - 외부 목적지의 공인IP


그럼 특정 호스트의 사설IP를 이용해 특정호스트한테 패킷을 줄수는 있어. 그런데 특정호스트가 유튜브패킷과 카톡패킷, 구글패킷을 동시에 받고 있다면 각 패킷을 어떻게 구분하고 열어볼 것인가?

그래서 <포트번호>가 있다. 포트번호는 특정 호스트에서 네트워크를 사용하는 여러 응용프로그램을 식별하기 위한 번호다.

<포트>는 통신하는 프로그램 간에 가상의 연결단이다. 
내컴퓨터의 디스코드 프로그램과 승률 컴퓨터의 디스코드 프로그램이 정해진 포트로만 패킷을 주고받으면서 음성 데이터를 주고받는다. 

16비트값이라서, 0 ~ 65535 사이의 정수값이다.

이 포트번호는 <잘알려진 포트> / <등록된 포트> / <동적포트> 이렇게 3등분된다.

<잘 알려진 포트> (Well-Known Ports) - 특정 용도로 사용하기 위해 IANA에서 정한 포트이다.  // 0~1023

<등록된 포트> (Resistered Ports) - 특정 응용프로그램회사에서 IANA에 포트 등록을 요청해서 이미 등록해놓은  포트 // 1024~49151 (예) - 3306번 = MySQL

<동적 포트> (Dynamic Ports) - 특정 용도가 지정되어 있지 않고 누구나 사용가능한 포트 // 49152~65535



'나만 볼 것들' 카테고리의 다른 글

프로그래밍랩 기말 대비  (2) 2024.12.14
웹프레임워크1 강의 메모장  (1) 2024.09.13
설계패턴 수업 메모장  (1) 2024.09.13
동아리 면접 예상질문  (4) 2024.09.13