(리눅스)소켓의 생성(2-1) 소켓에 존재하는 버퍼 내의 데이터
소켓의 생성(2-1)
※ 소켓에 존재하는 버퍼 ※
이전 포스팅 소켓의 생성(2)에서 연결 지향형(TCP) 소켓에 대해 설명했다.
내용 중에 " 데이터를 송수신하는 소켓은 내부적으로 버퍼(buffer), 즉 바이트 단위의 배열을 가지고 있다. "
라고 했었다.
그리고
" 데이터는 이 버퍼(바이트 단위 배열)에 저장되는데,
버퍼의 용량을 초과하지 않는 한
데이터가 채워진 후에 N 번의 read 함수를 호출해서 1번에 다 받거나 여러 번에 걸쳐서 받거나
아니면 N 번의 write 함수를 호출해서 1번에 다 보내거나 여러 번에 걸쳐서 보낼 수 있다."
라고 했었다.
-
※ 그렇다면, 소켓 내부의 존재하는 버퍼에 용량이 꽉 차면 데이터는 소멸될까? ※
일단 이 버퍼에 받아진 데이터는,
read 함수 호출을 통해서 데이터가 읽혀지면, 읽혀진 만큼 버퍼에서 비워지게 된다.
하지만 read 함수 호출로 읽혀지는 데이터의 양보다 많은 양의 데이터가 수신되면 버퍼도 꽉 찰 수 있다.
그러나, 이런 상황이어도 전송되는 데이터가 소멸되는 일은 발생하지 않는다.
데이터를 전송하는 영역(write 함수)의 소켓이 더 이상 데이터를 전송하지 않기 때문이다.
즉, 지금 설명하고 있는 연결지향형(TCP) 소켓은
자신과 연결된 상대 소켓의 상태를 파악해가면서 데이터를 전송한다.
혹 데이터가 제대로 전송되지 않으면 데이터를 재 전송까지 해준다.
따라서 연결지향형(TCP) 소켓의 데이터 손실은 특별한 경우가 아니라면 발생하지 않는다.
-
추가로
연결지향형(TCP) 소켓은 다음에 소개할 비 연결지향형(UDP) 소켓이랑은 다르게
"소켓 대 소켓의 연결은 반드시 1 : 1 이어야 한다."
즉, 연결지향형(TCP) 소켓 하나는 다른 연결지향형(TCP) 소켓 하나와만 연결이 가능하다.
그럼 지금까지 설명한 연결 지향형(TCP) 소켓의 특성을 하나의 문장으로 정리하면
" 신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식의 소켓이다. "
신뢰성 있는 : 데이터의 손실이 없다.
순차적인 바이트 기반 : 데이터가 전송될 때 순서대로 전송되고 받을 때도 순서대로 받는다.
연결 지향 : 상대 소켓의 상태를 파악해가면서 데이터를 전송한다.
-
추가 팁을 드리자면,
위의 한 마디로 정리한 것이 어렵게 느껴져도 걱정하지 않아도 된다.
앞으로 연결지향형(TCP) 소켓을 코딩하다 보면 의미가 이해될 것이다.