Computer Science/Network

[Network] Transport Layer - TCP: Connection-oriented transport

HJChung 2022. 2. 5. 23:17
한양대학교 - 컴퓨터네트워크 수업을 듣고 정리한 내용입니다. 

 

1. TCP Segment Structure

TCP Segment Structure

TCP Segment Structure는 Header와 data 로 구분되고 header에 있는 각 필드의 의미를 아는 것이 중요하다. 몇 가지는 앞서 Reliable Data Transfer을 공부할 때 나온 개념인데 이렇게 header에 담겨져가는 것을 보니 좀 더 이해에 도움이 된다. 

 

1) sequence number, ACK

sequence number is byte stream "number" of first byte in segment's data.

ACKs(TCP uses cumulative ACK) is sequence number of next byte expectred from other side. 

Client인 Host A, 그리고  A가 보내는 데이터를 그대로 출력만 해주는 echo server인 Host B가 있다고 가정하자.  

A가 보내는 데이터는 transport layer에서 segment의 data 부분에 담겨져서 가고, segment의 header부분에 segment number와 ACK 필드에 어떤 정보가 있는지를 그림으로 나타내면 아래와 같다. 

 

2) Timeout

이전에 [Network] Transport Layer - Reliable Data Transfer(신뢰성 있는 에 Packe이 Time out까지 ACK이 오질 않으면 Packet loss라고 판단하는 것이라고 정리한 적이 있다. 

이 때 timeout value를 어떻게 설정할 것인가에 대해 간단히만 언급하고 지나갔었는데 좀 더 살펴보면, 

Host A에서 Host B로 요청 후 피드백이 오기까지의 시간을 Round-trip Time(RTT)라고 한다. 그럼 timeout value를 RTT로 설정하면 되지 않을까?

하지만 packet 마다 주고받아지는 네트워크 경로가 다 다르고 queueing delay도 제각각이기 때문에 RTT는 상수로 딱 정하기가 어렵다. 

그래서 대표 RTT가 필요하다. 이게 바로 EstimatedRTT이다. 

sampleRTT: 실제 측정한 RTT. measured time from segment tansmission until ACK receipt

 

EstimatedRTT = (1-α)*EstimatedRTT + α*SampleRTT

EstimatedRTT는 sampleRTT와 지금까지의EstimatedRTT의 weighted 평균을 낸 것이다.

α는 network 상황이 반영되기 위한 가중치인데 일반적으로는 0.125로 한다. 

 

 

 

 

 

그리고나서 Timeout value는 EstimatedRTT에 여유값(safety margin)을 조금 더 줘서 packet loss가 확실 할 때 timeout을 주도록 한다. 

2. TCP Reliable data transfer

  • Pipelined segments 방식
  • ACK는 Cumulative acks를 의미한다. 
  • TCP uses single retransmission timer. 이건 Go Back N 방식과 유사하다. 

 

첫 번째 상황. 

두 번째 상황. 

3. Flow control

TCP 연결이 되면 senver buffer, receiver buffer가 생성된다. sender는 receiver가 받을 수 있는 만큼 양을 조절하면서 보내는데 이를 flow control이라고 한다. 

flow control: sender won't overflow receiver's buffer by transmitting too much, too fast.

이를 위해서는 receiver가 얼마나 받을 수 있는지를 sender에게 알려줘야 한다. 그래서 이 정보가 TCP segment header에 receive window라는 필드에 적혀져간다. 

 

만약에 receive window가 0이라면? sender는 보내는 걸 멈춰야 할까? 그렇게 되면 이후에 receiver buffer에 공간이 생겨도 sender가 어떻게 알 방법이 없을 것이다. 그래서 sender는 그냥 기다리는게 아니라  receive window를 파악하기 위해서 주기적으로 segment를 보낸다. 

 

4. TCP Connection Management