본문 바로가기
COMPUTER SCIENCE/Network

[Network] Transport Layer - TCP : Connection-Oriented Transport - (2)

by 민트맛녹차 2023. 1. 16.

Reliable Data Transfer

TCP 는 IP 의 unreliable service 위에 reliable data transfer service 를 만든다. 따라서, process 가 TCP receiver buffer 에서 읽어온 data stream 은 ucorrupted, without gaps, without duplication, 그리고 in-sequence 를 보장한다.

TCP 는 pipelined segments, cumulative acks, single retransmission timer 의 특징을 가지며, timeout events 와 duplicate acks 에 의해 retransmission 이 작동한다.

 

TCP sender events

TCP sender 에서 data transmission 과 retransmission 에 관해 가장 중요한 세 가지 event 는 data received from application above, timer timeout, ACK receipt 이다.

TCP 가 application 으로부터 data 를 받으면, data 를 segment 로 encapsulate 하고, segment 를 IP 로 보낸다. 각각의 segment 는 segment 의 first data byte 의 byte-stream number 인 sequence number 를 가진다. 다른 segement 에 의해 timer 가 실행되지 않았다면, TCP 는 segment 가 IP 로 넘어갈 때 timer 를 실행한다. oldest unacked segment 에 대한 timer 라고 생각해도 된다. 이 timer 의 expiration interval 은 TimeoutInterval 이다. 

TCP 는 timeout event 가 발생하면 timeout 을 유발한 segment 를 retransmit 하고, timer 를 restart 한다.

TCP sender 가 receiver 로 부터 acknowledgement segment(ACK) 을 받으면 oldest unacknowledge byte 의 sequence number 와 비교한다. ACK 이 더 크다면, ACK 이 하나 이상의 unacked segment 를 확인한 것이므로 sender 는 sequence number 를 업데이트한다. 또한, 아직 unacked segment 가 있다면 timer 를 restart 한다.

 

Retransmission Scenarios

 

 

 

 

TCP ACK generation

위 그림은 TCP receiver 의 ACK generation 에 대해 나타낸 그림이다 . TCP receiver 는 packet 2개 당 하나의 ACK 을 보내는데, cumulative ACK 을 사용하기에 한번만 보내도 두개 모두 ACKing 이 가능하다. 또한,  매번 ACK 을 보낸다면 2N(N + N) 번의 통신을 해야하지만, 2개 당 하나의 ACK 을 보내 3/2N(N + N/2) 번의 통신을 하게되어 통신 수를 줄일 수 있다.

TCP 는 cumulative ACK 과 duplicate ACK 을 사용하여 Go-Back-N 의 특징을 가지며, out-of-order segment 를 버리지 않아(no discard) Selective Repeat 의 특징을 가진다. 따라서  TCP 는 Go-Back-N 과 Selective Repeat 의 특징을 모두 가지고 있음을 알 수 있다.

 

TCP fast retransmit

time-out period 가 상대적으로 길다면, lost packet 을 재전송하기 전에 긴 delay 가 생긴다. sender 는 duplicate ACKs 를 통해 lost segments 를 감지한다. sender 는 보통 많은 segments 를 연속적으로 보내기 때문에, 한 segment 가 lost 되면 많은 duplicate ACKs 를 받게 된다. TCP sender 는 triple duplicate ACKs(같은 데이터에 대한 3 ACKs) 를 받을 시 , timeout 을 기다리지 않고 smalledst sequence number 를 가진 unacked segment 를 즉시 재전송하는 fast transmit 을 수행하여 긴 delay 가 생기는 것을 방지한다.  

 

Flow Control

TCP connection 은 bytes 를 받아 receive buffer 에 배치하고, application 은 이 buffer 를 통해 데이터를 읽는다. application 이 다른 일 때문에 바빠 데이터를 바로 읽어오지 못하는 등, 상대적으로 데이터를 읽는 속도가 느리다면 sender 는 너무 많은 데이터를 빠르게 보내 connection 의 receive buffer 를 overflow 하게 될 수 있다.

TCP 는 flow-control service 를 제공하여 seder 가 receiver 의 buffer 가 overflow 되는 가능성을 application 이 제거하도록 한다. 즉, Flow control 은 sender 가 receiving application 이 읽는 속도에 맞춰 보내도록 하는 speed-matching service 인 것이다. 

TCP 는 sender 가 receive window 라고 불리는 변수를 가지도록 하여 flow control 을 제공한다. receive window 는 receiver 에 얼마나 많은 free buffer space 가 있는지 sender 에게 알려준다. sender 는 receiver 의 receive window 값에 맞춰 unacked data 의 양을 제한한다.

 

TCP Connection Management

TCP 는 다음의 세 단계를 통해 TCP connection 을 만든다. 이때, connection 생성을 위해 두 host 사이에 3개의 packet 이 전달되므로, 이 절차를 three-way handshake 라고 한다.

  1. client 는 SYN bit 를 1로 설정하고, random 하게 initial sequence number (x) 을 선택해 sequnce number field 에 넣어 TCP SYN segment 를 만든다. 이 segment 를 IP datagram 으로 캡슐화하여 server 에게 보낸다.
  2. server 는 IP datagram 에서 TCP SYN segment 를 추출하고, connection 에 TCP buffer 와 변수들을 할당하며, client 로 connection-granted segment 를 보낸다. connection-granted segment 또는  SYNACK segment 는 SYN bit 와 ACK bit 를 1로 설정하고, acknowledge field 에 x+1 를 넣고, random 하게 initial sequence number(y) 을 선택해 sequnece number field 에 넣어 만든 segment 이다.
  3. SYNACK segment 를 받으면, clinet 는 connection 에 buffer 과 변수들을 할당한다. clinet 는 server 로 connection-granted segment 를 보낸다. connection-granted segment 는 SYN bit 는 0, ACK bit 를 1로 설정하고, acknowledge field 에 y+1 을 넣고,  sequnece number field 에 x+1 을 넣어 만든 segment 이다. 이때, connection 이 생성되었으므로, SYN bit 를 0 으로 설정한다.

위 세 단계가 완료되면, client 와 server 는 서로 데이터를 담은 segement 를 보낼 수 있다. 

 

TCP 는 다음의 네 단계를 통해 TCP connection 을 닫는다. 이때, connection 을 닫기 위해 두 host 사이에 4개의 packet 이 전달되므로, 이 절차를 four-way handshake 라고 한다.

  1. client 는 FIN bit 를 1로 설정하고, random 하게 initial sequence number (x) 을 선택해 sequnce number field 에 넣어만든 segment 를 server 로 보낸다.
  2. server 는 ACK bit 를 1 로 설정하고, acknowledge field 에 x+1 을 넣고, random 하게 initial sequence number(z) 을 선택해 sequnece number field 에 넣어 만든 segment 를 client 로 보낸다
  3. server 는 FIN bit 를 1로 설정하고, acknowledge field 에 x+1 을 넣고, random 하게 initial sequence number (y) 을 선택해 sequnce number field 에 넣어만든 segment 를 client 로 보낸다.
  4. client 는 ACK bit 를 1 로 설정하고, acknowledge field 에 y+1 을 넣고, sequnece number field 에 x+1 을 넣어 만든 segment 를 server 로 보낸다

위 과정을 통해, client 와 server 는 각각 connection 을 종료한다. 

 

 

위 두 그림은 TCP client 와 server 의 TCP connection 의 life cycle 을 나타낸 그림이다. 

 

 

참조
Computer Networking _ A Top Down Approach, 7th, converted

댓글