시작하지 말았어야 했던 것/(Unix, Linux) C Socket

(리눅스)소켓의 생성(2-1) 소켓에 존재하는 버퍼 내의 데이터

Sean(slay) 2021. 2. 2. 07:49
반응형

소켓의 생성(2-1)

 

 

※ 소켓에 존재하는 버퍼 

 

이전 포스팅 소켓의 생성(2)에서 연결 지향형(TCP) 소켓에 대해 설명했다.

 

내용 중에 " 데이터를 송수신하는 소켓은 내부적으로 버퍼(buffer), 즉 바이트 단위의 배열을 가지고 있다. "

 

라고 했었다.

 

그리고 

 

데이터는 이 버퍼(바이트 단위 배열)에 저장되는데,

 

버퍼의 용량을 초과하지 않는 한 

 

데이터가 채워진 후에 N 번의 read 함수를 호출해서 1번에 다 받거나 여러 번에 걸쳐서 받거나

 

아니면 N 번의 write 함수를 호출해서 1번에 다 보내거나 여러 번에 걸쳐서 보낼 수 있다."

 

라고 했었다.

 

-

 

 ※ 그렇다면, 소켓 내부의 존재하는 버퍼에 용량이 꽉 차면 데이터는 소멸될까? 

 

일단 이 버퍼에 받아진 데이터는,

 

read 함수 호출을 통해서 데이터가 읽혀지면, 읽혀진 만큼 버퍼에서 비워지게 된다.

 

하지만 read 함수 호출로 읽혀지는 데이터의 양보다 많은 양의 데이터가 수신되면 버퍼도 꽉 찰 수 있다.

 

그러나, 이런 상황이어도 전송되는 데이터가 소멸되는 일은 발생하지 않는다.

 

데이터를 전송하는 영역(write 함수)의 소켓이 더 이상 데이터를 전송하지 않기 때문이다.

 

즉, 지금 설명하고 있는 연결지향형(TCP) 소켓은 

 

자신과 연결된 상대 소켓의 상태를 파악해가면서 데이터를 전송한다.

 

 데이터가 제대로 전송되지 않으면 데이터를 재 전송까지 해준다.

 

따라서 연결지향형(TCP) 소켓의 데이터 손실은 특별한 경우가 아니라면 발생하지 않는다.

 

-

 

추가로

 

연결지향형(TCP) 소켓은 다음에 소개할 비 연결지향형(UDP) 소켓이랑은 다르게

 

"소켓 대 소켓의 연결은 반드시 1 : 1 이어야 한다."

 

즉, 연결지향형(TCP) 소켓 하나는 다른 연결지향형(TCP) 소켓 하나와만 연결이 가능하다.

 

그럼 지금까지 설명한 연결 지향형(TCP) 소켓의 특성을 하나의 문장으로 정리하면

 

" 신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식의 소켓이다. "

 

신뢰성 있는 : 데이터의 손실이 없다.

 

순차적인 바이트 기반 : 데이터가 전송될 때 순서대로 전송되고 받을 때도 순서대로 받는다.

 

연결 지향 : 상대 소켓의 상태를 파악해가면서 데이터를 전송한다.

 

-

 

추가 팁을 드리자면,

 

위의 한 마디로 정리한 것이 어렵게 느껴져도 걱정하지 않아도 된다.

 

앞으로 연결지향형(TCP) 소켓을 코딩하다 보면 의미가 이해될 것이다.

반응형