본문 바로가기

Etc./APM

TCP/IP 소켓 프로그래밍 기초 지식

1. 파일 디스크립터란? 

시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수를 의미한다.  파일 또는 소켓을 생성할 때마다 운영 체제는 해당 파일 또는 소켓에 부여된 숫자 하나를 건네준다. 파일 디스크립터를 파일 핸들이라고도 한다. 

 

리눅스에서는 소켓도 하나의 파일로 취급하기 때문에 파일을 생성하건, 소켓을 생성하건 파일 디스크립터가 반환된다. 마찬가지로 윈도우에서도 시스템 함수의 호출을 통해서 파일을 생성할 때 핸들이라는 것을 반환한다. 하지만 윈도우에서는 리눅스와 달리 파일 핸들과 소켓 핸들을 구분하고있다. 

 

2. 소켓의 타입

소켓의 타입이란 소켓의 데이터 전송 방식을 의미하는데, 이 정보를 socket 함수의 두번째 인자로 전달해야한다.

 

1. 연결지향형 소켓 

특성:

중간에 데이터가 소멸되지 않고 목적지로 전송된다.

전송 순서대로 데이터가 수신된다.

전송되는 데이터의 경계가 존재하지 않는다.

 

데이터를 송수신하는 소켓은 내부적으로 버퍼, 즉 바이트배열을 지니고있다. 그리고 소켓을 통해 전송되는 데이터는 이 배열에 저장된다. 그러므로 데이터가 수신되었다고해서 read 함수를 호출해야 하는 것이 아니라 용량을 초과하지 않는 한, 데이터가 채워진 후에 한번의 read 함수 호출을 통해서 데이터를 전부 읽어 들일수도 있고, 반대로 한번의 write 함수호출로 전송된 데이터의 전부를 여러번의 read 함수 호출을 통해서 읽어 들일수도 있다.  

때문에 연결지향형 소켓은 데이터의 경계가 존재하지 않는다고 말한다. 반대로 데이터 경계가 존재하는 것은 두 번의 함수 호출이 수반되었다면 데이터를 수신할때에도 두번의 함수 호출이 수반되어야함을 의미한다.

 

2. 비 연결지향형 소켓

엄청난 속도로 이동하는 오토바이 택배 서비스에 비유할 수 있다.

 

특성:

전송된 순서에 상관없이 가장 빠른 전송을 지향한다.

전송된 데이터는 손실의 우려가 있고, 파손의 우려가 있다.

전송되는 데이터의 경계가 존재한다.

한번에 전송할 수 있는 데이터의 크기가 제한된다.

 

결론은 신뢰성과 순차적 데이터 전송을 보장하지 않고, 고속의 데이터 전송을 목적으로 하는 소켓이다.

 

3. 라우터와 스위치

네트워크를 구성하려면 외부로부터 수신된 데이터를 호스트에 전달하고, 호스트가 전달하는 데이터를 외부로 송신해주는 물리적 장치가 필요하다. 이가 라우터와 스위치이며, 이 또한 컴퓨터에 지나지 않는다. 

 

4. 소켓의 구분에 활용되는 PORT 번호

IP는 컴퓨터를 구분하기 위한 목적으로 존재하기때문에 IP만 있다면 컴퓨터로 데이터를 전송할 수 있다. 하지만 이것만 가지고 최종 목적지인 응용프로그램까지 데이터를 전송할 순 없다.

컴퓨터에는 NIC(네트워크 인터페이스 카드)라 불리는 데이터 송수신장치가 하나씩 달려있다. IP는 데이터를 NIC를 통해 컴퓨터 내부로 전송하는데 사용한다. 그러나 컴퓨터 내부로 전송된 데이터를 소켓에 적절히 분배하는 작업은 운영체제가 담당한다. 이때 포트번호가 필요하다.  NIC를 통해서 수신된 데이터 안에는 포트번호가 새겨져 있다.

그러므로 데이터 전송의 목적지 주소에는 IP주소뿐만 아니라 PORT 번호도 포함이된다.

 

+ 서버 소켓은 생성시 자신이 속한 컴퓨터의 IP주소로 초기화가 이루어져야하는데, 하나의 컴퓨터에 둘 이상의 IP주소가 할당될 수 있기 때문이다. IP주소는 컴퓨터에 장착되어 있는 NIC 개수만큼 부여 가능하다. 

5. 네트워크 바이트 순서와 인터넷 주소 변환

CPU가 데이터를 메모리에 저장하는 방식은 두 가지로 나뉜다.

 

빅 엔디안: 상위 바이트의 값을 작은 번지수에 저장하는 방식

리틀 엔디안: 상위 바이트의 값을 큰 번지수에 저장하는 방식

 

데이터를 주고받을 때 문제가 생기기 때문에 네트워크상으로 데이터를 전송할 때에는 데이터의 배열을 빅 엔디안 기준으로 변경해서 송수신한다.

 

6. TCP 이론적 이야기

6.1. TCP 소켓에 존재하는 입출력 버퍼 

TCP 소켓의 데이터 송수신에는 경계가 없다. 서버가 한번의 write 함수 호출을 통해서 40바이트를 전송해도, 클라이언트는 네번의 read 함수 호출을 통해서 10바이트씩 데이터를 수신하는 것이 가능하다. 

그럼 클라이언트가 10바이트만 먼저 수신했다면, 서버가 보낸 나머지 30바이트는 어디서 대기하는 것일까? 

write 함수가 호출되는 순간 데이터는 출력 버퍼로 이동을하고, read 함수가 호출되는 순간 입력 버퍼에 저장된 데이터를 읽어들이게 된다. 

 

입출력 버퍼의 특징 

입출력 버퍼는 TCP 소켓 각각에 대해 별도로 존재한다.

입출력 버퍼는 소켓생성시 자동으로 생성된다.

소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송이 이뤄진다.

소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸되어버린다.

 

그럼.... 클라이언트의 입력버퍼 크기가 50바이트인데, 서버에서 100바이트를 전송하면 어떻게 될까? 

 

답은 명료하다. 입력 버퍼의 크기를 초과하는 분량의 데이터 전송은 발생하지 않는다. 

TCP는 데이터의 흐름까지 컨트롤하기 때문이다.

TCP에는 슬라이딩 윈도우라는 프로토콜이 존재한다.

 

"소켓 A: 50바이트까지는 보내도 괜찮아 ! 

소켓 B: 응 ! "

이런식으로 대화를 주고받으면서 데이터를 송수신하기때문에, 버퍼가 차고 넘치는 현상은 발생하지 않는다. 

 

6.2. TCP의 내부 동작 원리: 상대 소켓과의 연결

세가지 일을 수행한다.

1. 상대 소켓과의 연결

2. 상대 소켓과의 데이터 송수신

3. 상대 소켓과의 연결 종료

 

연결설정과정에서 총 세번의 대화를 주고받는데 (1. 우리 이제 연결하자, 2. 나도 준비가 되었어, 3. 내 요청 들어줘서 고마워)

이를 Three-way handshaking 이라고 한다. 

 

Three - way handshaking 과정

syn은 "너 ~ 지금 들려?"를 의미하고, ACK는 그 대답을 의미한다.

 

A: 클라이언트가 요청 메시지 (SYNC)를 전송한다. 이때 임의의 랜덤 숫자를 함께 전송한다.

B: 서버가 요청을 수락하며, 클라이언트에게도 들리냐는 연결 요청 메시지를 전송한다. 그 메시지에는 ACK를 포함하는데, 이는 SYN보다 +1한 값을 가지고 이는 잘 들린다는 뜻이다. 

C: 클라이언트는 그 질문이 잘 들린다고 ACK에 받은 SYN+1을 해서 전송한다.

 

참고) 열혈 TCP 프로그래밍

https://hyemsinabro.tistory.com/m/157

'Etc. > APM' 카테고리의 다른 글

[DB] 프로시저 (procedure)  (0) 2023.01.30
[APM] APM 스카우터  (0) 2023.01.27
OSI 7계층  (1) 2023.01.25
소켓프로그래밍이란  (0) 2023.01.25
WAS란?  (0) 2023.01.05