네트워크는 컴퓨터 공학에서 가장 근본이 되는, 필수 학문 중 하나이다.
네트워크에 대한 기초적인 내용과 소켓에 대해서 간단하게 서술하고자 한다.
네트워크란?
Net + Work의 합성어로, 긴밀하게 연결되어 있는 조직, 체계라는 사전적 의미를 가진다.
컴퓨터 네트워크는 컴퓨터 간에 데이터를 전달하기 위해 연결한 통신망을 의미한다.
네트워크 프로그래밍 : 네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있도록 하는 것.
떨어져 있는 컴퓨터 간에 통신을 하기 위해서는 무엇이 필요할까?
- 물리적 연결
- 통신을 하고자 하는 컴퓨터에는 네트워크에 연결하기 위한 장치가 필요하다.
가장 기본적으로 네트워크 카드, 케이블, 라우터로 구성되어 있다.
1. 네트워크 카드(NIC, Network Interface Controller) : 한 네트워크 안에서 신호를 주고받는 데 쓰이는 하드웨어.
- 컴퓨터가 만드는 디지털 데이터(0,1)를 전기 신호(유선)나 전파(무선)의 형태로 변환하여 전송한다.
- 역으로, 전기 신호를 디지털 데이터로 변환하기도 한다.
- 이더넷 카드(ethernet card), 네트워크 어댑터(Network adapter)라고도 불린다.
2. 네트워크 케이블 : 컴퓨터나 네트워크 장비 사이에서 전기적 신호를 운반하는 전송매체.
- 동축 케이블, 광케이블 등이 있다.
3. 라우터(Router) : 서로 다른 네트워크를 연결하여 다른 네트워크 간에 데이터를 전송하는 경로를 지정하고
그 경로에 따라 패킷을 전달하는 역할을 하는 하드웨어.
- 논리적 연결
: 물리적 연결을 바탕으로 존재하는 추상적 연결 구조
소켓(Socket) : 네트워크 상에서 동작하는 통신의 종착점.
- 네트워크 통신을 위한 프로그램들은 소켓을 생성하고, 이 소켓을 통해서 서로 데이터를 교환한다.
- 구체적으로, 물리적으로 연결된 네트워크 상에서의 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치를 의미한다. 이는 운영체제에서 제공하는 요소이다.
- 일상생활에서 우리가 전기를 사용하기 위해서는 전력망으로부터 전기를 공급받기 위해 소켓을 꽂아야 한다.(흔히 플러그라 부른다.) 마찬가지로 네트워크 망에서 데이터를 송수신하기 위해서는 네트워크 망에 연결하여야 하며 이렇나 역할을 하는 장치를 같은 맥락에서 소켓이라고 표현한다.
- 조금 더 확장해서, 소켓은 네트워크를 통한 두 컴퓨터의 연결을 의미하기도 한다.
이렇게 네트워크는 물리적, 논리적으로 연결되어 통신하며 특히, 논리적 연결의 핵심인 Socket에 대해 더 알아보자.
Socket
: 네트워크 상에서 동작하는 통신의 종착점(Endpoint).
프로세스가 데이터를 송수신하기 위해서는 반드시 소켓을 열어 소켓을 통해 데이터를 쓰고 읽어야 한다.
소켓을 이용한 TCP/IP 프로그래밍을 소켓 프로그래밍이라고 한다.
- Socket의 구성
1. 프로토콜(Protocol) : 통신할 때 데이터를 주고 받는 양식과 규칙 체계.
- HTTP, FTP, SSH, Telnet 등이 있다.
2. IP 주소(Internet Protocol address) : 네트워크에서 장치들이 서로를 인식하고 통신하기 위해 사용하는 번호.
3. 포트(Port) : 논리적인 접속 장소. 물리적인 하드웨어를 연결하는 외부 인터페이스.
- 포트 번호 : 네트워크 상에서 통신하기 위해 호스트 내부적으로 프로세스가 할당받아야 하는 고윳값.
- 컴퓨터에게 부여하는 값이 아닌, 프로그램상에서 생성되는 소켓을 구분하기 위해 소켓에 부여되는 번호를 뜻한다.
- 소켓의 통신 과정
연결요청을 수락하는 기능의 프로그램을 서버(server)라 하고, 연결을 요청하는 프로그램을 클라이언트(Client)라 한다.
서버와 클라이언트 소켓은 프로그램 내에서 호출하는 API함수의 종류와 순서만 다를 뿐 본질적으로 동일한 소켓이다.
<서버와 클라이언트의 소켓 통신 과정>
1. 서버를 먼저 실행하여 서버 소켓을 생성(socket)하고 IP주소와 포트번호를 할당한 후(bind),
클라이언트가 접속하기를 기다린다.(listen)
2. 클라이언트를 실행하여 클라이언트 소켓 생성(socket), 서버에 접속(Connect)하여 데이터를 보낸다.(Send)
3. 서버는 클라이언트의 접속을 수락하고(Accept) 클라이언트가 보낸 데이터를 받아서(Recv) 처리한다.
4. 서버가 처리한 데이터를 클라이언트에 전송한다.(Send).
5. 클라이언트는 서버가 보낸 데이터를 수신하여(Recv) 처리한다.
6. 데이터 송수신이 끝나면 두 소켓 모두 연결을 끊는다.(close).
- 소켓의 타입
1. TCP(Transmission Control Protocol)
: 전송을 제어하는 프로토콜.
- 연결을 지향하기 때문에 스트림 기반 소켓이라고도 한다.
- 신뢰성 있는 데이터의 전송을 담당한다.
- IP를 기반으로 데이터를 보낸다. IP는 하나의 데이터 패킷이 전송되는 과정에만 중심을 두고 설계되어 여러 패킷을 전송할 때 문제가 발생한다.
- TCP는 데이터를 주고받는 과정에서 서로 데이터의 송수신을 확인함으로써 이러한 문제를 해결하고 데이터의 전송에 신뢰를 더한다.
2. UDP(User Datagram Protocol)
: 데이터를 데이터그램 단위로 처리하는 프로토콜. (※ 데이터그램 : 독립적인 관계를 지니는 패킷)
비연결형 서비스를 지원하는 프로토콜이다.
- 데이터 전송 후 상대방의 수신 여부를 확인할 수 없다.
- 데이터의 전송을 '보장'하지 않는다. 분실될 수도 있으며 즉, 신뢰할 수 없다.
- 프로그래밍의 관점에서 보더라도 TCP보다 구현이 용이하다.
- 상황에 따라 TCP보다 훨씬 좋은 성능을 발휘한다.
- 데이터 손실이 자주 발생하는 것이 아니기 때문에 신뢰성보다 성능이 중요시되는 상황에서는 UDP가 좋은 선택이 될 수 있다.
- 흐름 제어(Flow Control)가 존재하지 않는다. (TCP는 흐름 제어가 생명이다!)
- (※ 흐름제어 : 송신 측과 수신 측의 데이터 처리 속도 차이를 해결하기 위한 기법.)
※ TCP가 UDP에 비해 느린 이유.
- TCP에는 데이터 송수신 이전, 이후에 거치는 연결 설정 및 해제과정 존재.
- 데이터 송수신 과정에서 거치는 신뢰성 보장을 위한 흐름제어.
Connected UDP 소켓.
TCP 소켓에는 데이터를 전송할 목적지의 IP와 PORT번호를 등록하는 반면, UDP 소켓에는 등록하지 않는다.
때문에, UDP 소켓에서 데이터를 전송하는 과정은 다음과 같이 세 단계로 나뉜다.
- 1단계 - UDP 소켓에 목적지의 IP와 PORT 번호 등록.
- 2단계 - 데이터 전송
- 3단계 - UDP 소켓에 등록된 목적지 정보 삭제.
데이터를 전송할 때마다 위 과정을 반복하며 목적지의 주소 정보를 계속해서 변경하기 때문에
하나의 UDP 소켓을 통해 여러 목적지로 데이터 전송이 가능하다.
목적지 정보가 등록되어 있지 않은 소켓을 unconnected 소켓, 등록되어 있는 소켓을 connected 소켓이라 한다.
- UDP 소켓은 기본적으로 unconnected 소켓이다.
하나의 호스트(같은 목적지)와 여러 번 송수신하려면 UDP 소켓을 connected로 만드는 것이 효율적이다.
HTTP 통신 vs 소켓 통신
HTTP(HyperText Transfer Protocol) 통신이란?
: HTML 파일을 전송하는 프로토콜을 바탕으로 하는 단방향 통신.
- 웹브라우저에서 통신이 일어나며, 현재는 html 파일뿐만 아니라 json, image 파일 등 또한 전송이 가능하다.
- Client에서 Server로 요청을 보내고 Server가 응답하는 방식으로 통신이 이루어지며, 응답을 받으면 통신이 종료된다.
- Client의 요청이 있을 때에만 Server가 응답하는 단방향 통신이라고 할 수 있다.
- 필요한 경우에만 Server로 접근하는 웹페이지 갱신 등에 적합하다.
소켓 통신이란?
: Server와 Client 양방향 연결이 이루어지는 통신.
- Client와 Server 양쪽에서 서로 데이터 송수신이 가능한 양방향 통신이다.
- 계속해서 연결을 유지해야 하기 때문에 HTTP 통신에 비해 비용이 많이 든다.
- 실시간으로 데이터를 자주 주고받아야 하는 상황에 적합하다.
아직 티스토리 서식이 익숙하지 않기도 하고 글을 두서없이 쓴 것 같다. 글 쓰는 연습 더 해야겠다...
※ 사용한 이미지는 모두 저작권 없는 이미지입니다. (https://pixabay.com/)
'Knowledge' 카테고리의 다른 글
[VNC] 내 컴퓨터에서 원격 컴퓨터로 파일 옮기기 (0) | 2022.11.30 |
---|---|
[VNC] 라즈베리파이 화면 해상도 설정 (0) | 2022.11.30 |
[파이썬] 소켓 통신 과정 (0) | 2022.04.27 |
URI와 웹 브라우저 요청 흐름 (0) | 2022.01.09 |
인터넷 네트워크 기본 (0) | 2022.01.07 |