TCP 소켓 입출력 버퍼란?
TCP 소켓의 데이터 송수신에는 경계가 없다. 예를 들어, 송신 측에서 write() 함수로 여러 데이터를 보내도 수신 측에서는 read() 함수 한 번으로 그 데이터를 수신할 수 있다. 또 송신 측에서 write() 함수로 용량이 큰 데이터를 보내도 수신 측에서 read() 함수로 그 데이터를 여러 번에 나눠서 수신할 수도 있다. (1대 1로 매핑되지 않는다.)
송신 측에서 100 bytes의 데이터를 보냈을 경우 수신자는 20 bytes씩 다섯 번에 나누어 수신할 수 있다는 뜻이다. 그런데 20bytes의 데이터를 수신하는 동안 나머지 80 bytes의 데이터는 어디에 있어야 할까? (네트워크 상에 떠있을 수는 없다.)
또한, 송신자가 100bytes의 데이터를 20 bytes씩 5번에 나누어 보냈을 경우 수신자는 20 bytes씩 받게 되는데 100 bytes를 모아서 한 번에 수신하고 싶을 때 이 데이터들은 어디에서 모아서 수신하는 것일까?
이러한 상황때문에 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만큼만 보낼께
출처
'프로그래밍 > 네트워크' 카테고리의 다른 글
와이어샤크(Wireshark) 설치하기 (1) | 2023.10.04 |
---|---|
이더넷(Ethernet)이란 무엇인가? (2) | 2023.08.23 |
빅 엔디언(Big Endian) 리틀 엔디언(Little Endian)에 대해서 (33) | 2023.08.14 |
INADDR_ANY에 대해서 (4) | 2023.08.14 |
TCP 3-way Handshake & 4-way Handshake (3) | 2023.08.14 |
댓글