본문 바로가기

BackEnd/Linux

Linux / network - 리눅스기초를 활용한 데이터 통신 4(OSI - 7계층 모델, 소켓 통신, 소켓 통신 흐름)

안녕하세요

 

인포돈입니다

이번에 OS의 네트워크에 대해서 학습을 해보면서 이를 정리한 내용을 적어보려 합니다.

본 내용은 우분투를 기본으로 작성되었습니다.
본 내용은 Cloud Computing을 활용하여 작성되었습니다.

이번 포스팅에서는 간략히 OS 네트워크의 큰 틀에 대해서 알아본다.

 

OSI 모델 - 7 계층 구조

OSI란 Open System Interconnection의 약자이며 네트워크 표준화 모델을 의미한다. 이러한 모델은 hw/sw 기반의 논리적인 변화에 대한 요구 없이 서볼 다른 시스템 간의 통신을 원활하게 하기 위해서 만들어졌다.

7. Application Layer - 응용 계층
6. Presentation Layer - 표현 계층
5. Session Layer - 세션 계층
4. Trnasport Layer - 전송 계층
3. Network Layer - 네트워크 계층
2. Data Link Layer - 데이터 링크 계층
1. Physical Layer - 물리 계층

 

 - Physical Layer

물리 계층이라고 하며 쉽게 생각하여 비트 스트림을 전송하는데 필요한 모든 것을 가리키는 계층이다. 램 케이블 같은 것을 떠올리면 된다. 이러한 계층에서는 인터페이스의 기계적, 전기적, 규격 및 전송 매체를 다루기도 한다.

 

이 계층에서는 단방향 모드, / 반이중 모드 / 전 이중 모드 이렇게 3가지가 있다.

 

 - Data Link Layer

데이터 링크 계층으로 가까운 노드끼리의 전송을 맡는 계층이다. 더 쉽게 이해하기 위해서는 앞서 1 계층에서 010101010비트 스트림으로 나왔다면, 물리적이기 때문에 노이즈가 발생할 수 있다. 따라서 2 계층에서는 이 비트 스트림을 신뢰성 있는 링크로 변환해주는 계층이다. 

 

 - Network Layer

네트워크 계층으로 발신지로부터 목적지까지 패킷 전달을 위한 라우팅 즉 전달하는 역할만 하는 계층이다. (여기서 라이팅이란 길 찾는 것으로 기억하자) 대표적으로 ip주소 같은 거다.

 

 - Transport Layer

전송 계층으로 종단에서부터 종단까지 데이터를 전달한다. 3 계층과의 다른 점은 바로 양쪽 끝을 직접 찾아보는 것이고 3 계층은 하나하나 다 찾아가는 것이다. 여기서는 신뢰성이 있을 수 있고 없을 수도 있는데 (2 계층에서 신뢰성을 보장했는데도) 그 이유는 채널과 같이 순서가 바뀌거나 또 다른 노이즈가 있을 수 있기 때문이다.

 

 - Session Layer

세션 계층으로 프로세스 간 통신에 추가적인 기능을 제공하는 계층이다. 

 

 - Presentation Layer

표현 계층으로 주고받는 데이터에 관한 표현을 담당하는 계층이다. (변환, 암호화, 압축)

 

 - Application Layer

응용계층으로 뭐... 크게 설명할 거 없는 우리가 사용하는 응용 프로그램을 위한 계층이다.


소켓 통신

그렇다면 이제 우리가 여러 코드에 많이 쓰이는 소켓이란 게 있다. 소켓은 소프트웨어와 소프트웨어를 연결하는 인터넷의 접점이라고 보면 되는데 소켓은 application과 transport사이에 존재한다. 이러한 소켓 프로그램은 프로세스와 스레드가 통신할 수 있도록 통신 선로를 만드는 역할을 한다.

 

여기서 소켓은 프로토콜, ip 주소, 포트 넘버로 정의되는데

 

 - 프로토콜 : 국가 간의 약속이며 통신 규약이다.

 - ip : 전 세계 컴퓨터에 부여된 고유 식별 주소이다.

 - 포트 넘버 : 한 호스트 내에서 네트워크 통신을 하고 있는 프로세스를 식별하기 위한 숫자

 

이러한 특성을 가지고 있다. 이러한 소켓 통신은 서버와 클라이언트가 특정 port번호를 통해 실시간으로 양방향 통신을 하는 방식으로 실시간 동영상이나 온라인 게임 등과 같은 곳에 자주 사용되며, 실습용으로도 안성맞춤이다.

 

소켓 통신 흐름

 

보시는 바와 같이 위쪽이 서버 아래쪽이 클라이언트다.

 

서버 측에서 socket을 만들어 bind와 listen을 통해 accept까지 갑니다.

(bind는 ip와 port번호를 설정하는 명령 // listen은 클라이언트의 접근 요청에 수신 대기열을 만드는 역할)

accept에서는 클라이언트의 접속이 있을 때까지 무한 대기합니다.

 

클라이언트 쪽은 socket을 만들고 connect를 통해서 서버에 접속을 알립니다.

 

그 후 연결이 확인되면 read와 write를 통해 서버와 클라이언트 간에 데이터를 통신합니다. 그 후 close를 통해서 접속을 종료합니다.

 

이게 아주 간단한 소켓의 활용입니다. 물론 코드로 보면 어려울 수도 있지만 크게 어려울 것 없습니다.

 

이제 다음 포스팅부터는 본격적으로 데이터 통신 코딩에 대해서 다뤄보도록 하겠습니다.