본문 바로가기
Computer Science/Computer Networking

[Computer Networking] Transport Layer : TCP (2) (Transmission Control Protocol)

by __K.Jun__ 2024. 8. 9.

TCP flow control (흐름 제어)

- 애플리케이션 계층에서 TCP 소켓 수신 버퍼에서 데이터를 읽는 속도가 데이터가 도착하는 것보다 비교적 느리다면, 송신자가 점점 더 많은 데이터를 빠르게 전송함으로 수신 버퍼에 오버플로가 발생할 것이다.

- 이처럼 TCP는 송신자가 수신자의 버퍼를 오버플로시키는 것을 방지하기 위해 애플리케이션에게 흐름 제어 서비스를 제공한다. 흐름 제어는 송신자가 보내는 속도와 수신자가 읽는 속도를 일치시키는 서비스다.

- TCP는 송신자가 수신 윈도우라는 변수를 유지하여 흐름제어를 제공한다. 수신 윈도우는 수신 측에서 가용한 버퍼 공간이 얼마나 되는지를 송신자에게 알려주는 데 사용된다. TCP는 전이중(full-duplex)이므로 연결의 각 측의 송신자는 별개의 수신 윈도우를 유지한다.

- LastByteRead : 수신자의 애플리케이션 프로세스에 의해 버퍼로부터 읽힌 데이터 스트림의 마지막 바이트의 번호

- LastByteRcvd : 수신자의 네트워크로부터 도착하여 수신 버퍼에 저장된 데이터 스트림의 마지막 바이트 번호

- LastByteRcvd - LastByteRead <= RcvBuffer이고,

- rwnd = RcvBuffer - [LastByteRcvd - LastByteRead] 로 수신 윈도우의 크기를 조정한다.

 

TCP 3-way handshake

- TCP 연결 시작

1.

- 클라이언트 측 TCP는 서버 TCP에게 SYN 비트가 1인 애플리케이션 계층 데이터를 포함하지 않는 TCP 세그먼트(SYN 세그먼트)를 송신한다.

- 클라이언트는 최초의 순서 번호(Seq = x)를 임의로 선택하고, 최초의 TCP SYN 세그먼트의 순서 번호 필드에 이 번호를 넣는다.

- 이 세그먼트는 IP 데이터그램 안에서 캡슐화되고 서버로 송신된다.

2.

- 서버는 데이터그램으로부터 TCP SYN 세그먼트를 추출한다. 그리고 TCP 버퍼와 변수를 할당한다.

- 그리고 클라이언트 TCP로 애플리케이션 계층 데이터를 포함하지 않는 연결 승인(ACKbit = 1) 세그먼트를 송신한다.

- SYN 비트는 1로 설정, TCP 세그먼트 헤더의 ACK 필드는 (ACKnum = x + 1)로 설정,  자신의 최초 순서 번호(Seq = y) 설정한다.

3.

- 연결 승인 세그먼트를 수신하면, 클라이언트는 연결에 버퍼와 변수를 할당한다.

- (ACKnum = y + 1)을 포함하는 세그먼트 헤더를 가진 세그먼트를 서버로 송신하여 서버의 연결 승인 세그먼트를 확인한다.

- 연결이 설정 되었기 때문에 SYN 비트는 0이다.

- 마지막 단계에서는 애플리케이션 계층 데이터를 포함할 수 있다.

 

- TCP 연결 종료

1.

- 클라이언트가 서버에게 SYN 비트가 1인 세그먼트를 보낸 것 처럼, 연결 종료 시에는 FIN 비트가 1인 세그먼트를 서버에 보낸다.

- 서버가 이 세그먼트를 받으면 클라이언트에게 확인응답(ACK) 세그먼트를 보낸다.

2.

- 그 다음 서버가 클라이언트에게 FIN 비트가 1로 설정된 종료 세그먼트를 송신한다.

- 마지막으로 클라이언트는 서버의 종료 세그먼트에 확인응답(ACK)을 한다. 이 시점에서 두 호스트의 모든 자원은 할당 해제된다.

728x90