3.5. 흐름제어와 TCP 연결 과정

김현우·2024년 11월 25일
0

네트워크

목록 보기
6/8
post-thumbnail

Flow Control의 필요성

각 호스트 끼리는 버퍼에 데이터를 보내둔다.
하지만 이떄 어플리케이션은 바로바로 버퍼의 데이터를 꺼내 사용하지 않는다.
어플리케이션은 자신이 하던일을 하고 필요한 시점에 버퍼에서 데이터를 꺼내 사용하며
사용치 않을때는 버퍼에 데이터가 계속 쌓인다.

만약 버퍼의 사이즈를 넘어서는 데이터가 오면 어떻게 될까??
이때 버퍼에 저장되지 못하고 넘치는 데이터는 버려질 것이므로 우리는 이에대한 해결책이 필요하다.


이를 위해 TCP는 흐름제어 서비스를 제공한다.

Flow control

TCP는 receive window를 통하여 가용버퍼가 얼만큼 남았는지 사용자에게 알려준다.

전송 예시와 같이 살펴보면

만약 호스트 A가 B에게 데이터를 전송한다면 B는 이 연결에 수신 버퍼를 할당한다.
이 크기를 RcvBuffer라 한다.

B가 버퍼로 부터 데이터를 읽으며 다음과 같은 변수를 정의한다.
LastByteRead : B의 어플리케이션 프로세스가 버퍼에서 읽은 데이터 스트림의 마지막 바이트 
LastByteRcvd : B의 수신 버퍼에 도착한 데이터 스트림의 마지막 바이트

요약하자면 LastByteRead는 버퍼에서 읽어온 양
LastByteRcvd 는 버퍼에 들어온양 이라 보면 되며

RcvdBuffer>= LastByteRcvd - LastByteRead 여야 오버플로우가 발생치 않는다.

따라서 Rwnd(플로우 컨트롤을 위한 버퍼 크기 윈도우)는 RcvdBuffer- (LastByteRcvd - LastByteRead) 이며 0보다 커야한다.

호스트 A에서도 비슷한 상수를 가지는데 LastByteSent와 LastByteAcked를 가지며
LastByteSent - LastByteAcked <= Rwnd (보낸양<= 윈도우)여야한다.

한가지 문제가 있는데,
만약 rwnd =0 으로 가득 찼다는 신호를 보내게 된다면 
호스트 A는 B에게 데이터를 전송하지 못하게 되며 

그렇다면 B또한 A에게 응답을 하지 않으니 rwnd가 남더라도 알려줄 방법이 없다.

이를 방지하기 위해 rwnd가 비더라도 1바이트 데이터를 통해 rwnd가 비었는지 찼는지를 계속 통신하게 된다.

TCP 연결

<연결>
1. 클라이언트는 서버에서 SYN 세그먼트를 전송한다.
 - 이때 세그먼트에는 임의의 seq 번호가 할당된다.
 - SYN = 1 로 전송된다.
 
2. 서버는 클라이언트의 요청을 확인한후 SYNACK를 전송한다.
 - 이때 SYN비트를 1로 만들며 연결에 필요한 TCP 버퍼와 변수등을 할당한다.
 - 자신의 seq를 임의로 할당하며 ACK는 cli_seq+1로 돌려준다.
 
3. 연결에 버퍼와 변수를 할당하며 또 다른 세그먼트를 전송한다.
 - 이때 SYN = 0이 되며 
   이 경우에만 클라이언트에서 전송한 페이로드를 어플리케이션 레벨에 올릴수 있다.
   
<연결 종료>
1. 클라이언트가 서버에게 FIN 비트를 설정후 전송한다.
 -> ACK를 받는다.
 
2. 서버 또한 클라이언트에서 FIN 비트를 설정한후 전송한다.
 -> ACK 를 받고 서로 연결 종료
 
profile
학생

0개의 댓글