본문 바로가기
서버/서버이론

[Server] 리눅스 소켓이란?

by 코딩히어로 2022. 1. 13.
728x90

리눅스에서는 기본적으로 모든 것을 파일 단위로 처리합니다.

즉 소켓, 디바이스, 폴더 등등 모든 객체를 파일로 관리하며 리눅스 시스템에서

프로세스가 이 파일들에 접근할 때 파일 디스크립터를 이용해서 접근하게 됩니다.

 

그렇다면 파일디스크립터(fd)란?

- 리눅스에서 파일을 open 함수로 열면 파일 디스크립터 변환
- 프로그램이 파일을 액세스 할 때 파일 디스크립터 사용
- 리눅스에서는 모든 파일, 하드웨어 장치, 파이프, 소켓 등을 파일로 취급
- 파일 디스크립터 테이블 : 파일을 오픈 시 시스템에서 파일 정보를 담은 구조체 할당

테이블의 인덱스 값이 파일 디스크립터입니다.
파일 디스크립터는 위와 같이 리눅스 시스템에서 없어서는 안 되는 중요한 개념입니다.

 

파일 디스크립터를 기준으로 그렇다면 소켓을 파일 디스크립터로 어떻게 할당하는 것인가.?

 

소켓 디스크립터(sd)란?
- 소켓 번호, 소켓을 만들고 얻은 파일 디스크립터
- 프로그램이 네트워킹을 할 때 소켓 디스크립터 사용

 

리눅스상에서 파일 디스크립터를 사용하여 소켓을 열면 그것을 소켓 디스크립터라 부릅니다.

개념상으로는 파일 디스크립터와 같은 의미입니다.

 

그렇다면 리눅스에서는 소켓 디스크립터만 있으면 통신이 가능할까??

소켓 디스크립터는 단순하게 리눅스 시스템이 소켓에 접근할 수 있는 매개체 정도로 이해하면 됩니다.

네트워크 데이터 통신을 위해서는 TCP/IP라는 통신 프로토콜이 필요합니다.

 

TCP/IP 정의
- 데이터를 보내기 위해 사용하는 프로토콜
- 네트워크 계층 중 전송계층으로써 송신자와 수신자를 연결하는 통신서비스를 제공하는 계층

TCP 정의
- 인터넷상에서 데이터를 메시지 형태로 보내기 위해 IP 주소와 함께 사용하는 프로토콜
- IP가 데이터의 배달을 처리한다면 TCP는 패킷을 추적 및 관리
- 연결형 서비스를 지원하는 프로토콜로 인터넷 환경에서 기본으로 사용
- 높은 신뢰성을 보장하지만 UDP에 비해 속도가 느림
- 연속성보다 신뢰성 있는 전송이 중요할 때 사용하는 프로토콜
- 서버와 클라이언트는 1대 1로 연결됩니다.
- 스트림 전송 방식으로 전송 데이터 크기가 무제한 (리눅스 입출력 버퍼 크기에 제한을 받습니다.)

 

아마 처음 소켓에 대해 접하는 분들은 패킷이란 거에 대해 아리송할 수 있습니다.

패킷이란 무엇인지 개념을 보고 넘어가도록 하겠습니다.

인터넷 내에서 데이터를 보내기 위한 경로 배정(라우팅)을 효율적으로 하기 위해

데이터를 여러 개의 조각들로 나누어 전송을 하는데 이 조각들을 가리켜 패킷이라고 부릅니다.

 

위에서 말한 스트림 전송방식으로 전송 데이터 크기가 무제한이라 하였는데

옆에다가 또 리눅스 입출력 버퍼 크기에 제한을 받는다고 합니다..

그래서 이게 무제한이란 거야 모야.??

 

이 궁금증을 풀기 위해 우리는 리눅스 입출력 버퍼에 대해 알고 넘어가야 합니다.

 

리눅스 입출력 버퍼가 무엇인가?
- 입출력 버퍼는 TCP 소켓 각각에 대해 별도로 존재
- 입출력 버퍼는 소켓 생성 시 자동으로 생성됨
- 소켓을 닫아도 출력 버퍼에 남아있는 데이터는 계속해서 전송이 끝날 때까지 작업을 진행
- 소켓을 닫으면 입력 버퍼에 남아있는 데이터는 그 즉시 소멸됨

 

위에 내용은 말 그대로 리눅스 입출력 버퍼에 대한 내용이다 그래서 이 내용만으로는 궁금증이 풀리지 않습니다.

정말 중요한 건 각각 TCP 소켓은 입출력 버퍼를 각각 별도로 가지고 있고 데이터를 주고받을 때 

TCP 슬라이딩 윈도(흐름 제어)라는 개념을 사용합니다.

 

TCP 슬라이딩 윈도란?
- 수신자가 자신이 수신 가능한 버퍼사이즈(window size)를 송신자에게 알리고 송신자는 수신자가 수신가능한 크기만큼씩만 데이터를 송신합니다.

ex) 수신자가 window size가 1KB 인 소켓에 10KB를 전송하고자
     한다면 실질적으로 데이터는 10개의 패킷으로 전송하고

10번의 ACK를 기다려야 하므로 이런 문제를 해결하기 위해 여러 패킷을 논리적인 하나의 패킷으로
묶어서 처리합니다.

 

728x90
반응형

'서버 > 서버이론' 카테고리의 다른 글

[서버] 간단한 소켓 테스트 서버 만들어보기  (2) 2022.09.21
[서버] REST API란 무엇인가?  (4) 2022.09.21
[Server] 트랜잭션이란?  (4) 2022.01.07
[Server] 로드 밸런싱이란?  (0) 2022.01.03
[Server] FCM이란?  (1) 2021.12.12

댓글