본문 바로가기
프로그래밍/네트워크

TCP 소켓의 입출력 버퍼

by bantomak 2023. 8. 23.

TCP 소켓 입출력 버퍼란?

TCP 소켓의 데이터 송수신에는 경계가 없다. 예를 들어, 송신 측에서 write() 함수로 여러 데이터를 보내도 수신 측에서는 read() 함수 한 번으로 그 데이터를 수신할 수 있다. 또 송신 측에서 write() 함수로 용량이 큰 데이터를 보내도 수신 측에서 read() 함수로 그 데이터를 여러 번에 나눠서 수신할 수도 있다. (1대 1로 매핑되지 않는다.)

 

송신 측에서 100 bytes의 데이터를 보냈을 경우 수신자는 20 bytes씩 다섯 번에 나누어 수신할 수 있다는 뜻이다. 그런데 20bytes의 데이터를 수신하는 동안 나머지 80 bytes의 데이터는 어디에 있어야 할까? (네트워크 상에 떠있을 수는 없다.)

또한, 송신자가 100bytes의 데이터를 20 bytes씩 5번에 나누어 보냈을 경우 수신자는 20 bytes씩 받게 되는데 100 bytes를 모아서 한 번에 수신하고 싶을 때 이 데이터들은 어디에서 모아서 수신하는 것일까?

 

이러한 상황때문에 TCP 소켓 생성 시 입력 버퍼, 출력 버퍼라는 것을 생성합니다.

 

TCP 소켓 입출력 버퍼

 

위 그림에서 write()함수를 통해 출력 버퍼에 데이터가 전달되고 입력 버퍼로 전달된 데이터는 read() 함수를 통해 수신하게 된다. 즉, 수신자가 데이터를 수신하는 시점은 송신자가 write() 함수를 호출했을 때가 아니라 수신자가 read() 함수를 호출하는 시점이다.

 

입출력 버퍼의 특성

  • 입출력 버퍼는 TCP 소켓 각각에 별로 존재한다.
  • 입출력 버퍼는 소켓 생성시 자동으로 생성된다.
  • 소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송이 이루어진다.
  • 소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸되어 버린다.

수신자 측의 입력버퍼의 크기가 50 bytes인데 송신자가 100 bytes를 보낼 경우 버퍼가 넘쳐서 문제가 발생할 수 있다. 하지만 TCP에서는 슬라이딩 윈도우(Sliding Window)라는 프로토콜이 존재하기 때문에 위와 같은 문제가 발생하지 않는다.

 

슬라이딩 윈도우란 수신자가 자신의 수신가능한 버퍼 사이즈(aka. Window Size) 값을 송신자에게 알려주고, 송신자는 수신자가 수신 가능한 만큼의 데이터를 보내는 것이다. 이러한 TCP 프로토콜의 특성을 흐름제어라고 한다.

 

수신자 : 나 한번에 16658 bytes까지 수신이 가능해(Window Size가 16658 bytes)

송신자 : 그래? 알았어 16658 bytes만큼만 보낼께

 

출처

 

TCP 소켓의 입출력 버퍼

안녕하세요. 이성덕입니다. 포스트를 오랜만에 쓰는것 같네요 ㅎㅎ 오늘은 TCP소켓의 입출력 버퍼에 대...

blog.naver.com

댓글