나민오 2019. 6. 18. 01:58
반응형
본 포스팅은 개념에 대한 복습을 위해 작성되었습니다. 잘못된 내용은 댓글이나 이메일로 알려주시면 감사하겠습니다.

 

3-Way-Handshake

  내가 보낸 데이터가 온전히 상대방에게 도착했는지 알 수 있는 최선의 방법은 상대방이 받았다고 알려주는 것이다. TCP는 이러한 기능을 구현하기 위해서 Sequence Number를 사용하여 어디까지 데이터를 받았으며, 어디까지 보냈는지 확인할 수 있다. 물론, 이 Sequence Number를 이용한 통신은 어디까지나 최초에 3-Way-Hanshake로 세션을 맺은 호스트 간에만 유효하다.

Client to Server

 

  아주 흔한 케이스는 Client - Server 통신에서 볼 수 있다.

 

  1. Client에 해당하는 Host A는 Server에게 SYN이라고 하는 패킷을 보내서 TCP 세션을 맺기를 요청합니다. 
  2. Server는 이에 대한 응답으로 SYN+ACK 패킷으로 응답합니다.
  3. Client도 Server가 보낸 SYN에 대해 ACK로 답해줍니다.

 

+ 위에 나온 SYN과 ACK는 TCP Header에 있는 Flag 정보들 중 하나입니다. TCP Header에는 SYN, ACK 말고도 추가적으로 4가지의 필드가 더 있으며, 이러한 필드에 1을 세팅하여 SYN 패킷, ACK 패킷 등으로 사용한다.

+ Sequence Number는 SYN, ACK 등의 Flag Field와는 별개이며 패킷의 SYN, ACK등의 식별자로서 사용한다.

 

Sequence Number

  SYN, ACK의 식별자로서 사용한다고 했는데, 사실 정확하게 글로 어떻게 정의해야하는지 모르겠다.

가장 위에 있는 Client to Server 패킷은 SYN 패킷이며 Sequence Number가 x이다. (이하 SQ#)

= " Server님, TCP Session 맺어요. SQ#은 x에요. "

두 번째 Server to Client는 SYN+ACK 패킷이며 SQ#이 y이다.

= " Client님, 그래요. SQ#은 y에요. x까지 잘받았어요! "

세 번째 Client to Server는 ACK 패킷이다.

= " Server님, 알았어요. y까지 잘받았어요."

 

TCP Connection Termination

  TCP는 Full-Duplex 통신 ( 양방향 통신 ) 이기 때문에, Session을 Termination 하기 위해서는 양 측 호스트 모두 독립적으로 종료를 완수해야만 완전한 종료라고 할 수 있다.

 

One Side at a Time

  위에서 Session을 요청할 때 SYN을 사용했듯이, 종료할 때는 FIN을 사용한다.

  1. X가 Y에게 FIN을 보낸다
  2. Y는 X의 FIN에 대한 응답으로 ACK를 보낸다.
  3. Y도 X에게 FIN을 보낸다
  4. X는 Y의 FIN에 대한 응답으로 ACK를 보낸다.
2번에서 Y가 FIN을 보내기 전까지는, X의 소켓도 열려있고 데이터도 송신 가능하다.

 

Both Side at a Time

한 가지 더 Termination 방법이 있다.

  1. X가 Y에게 FIN을 보낸다.
  2. Y는 X의 FIN에 대한 응답으로 ACK와 동시에 FIN을 보낸다.
  3. X는 Y의 FIN에 대한 응답으로 ACK를 보낸다.

 

TCP Flow Control

  송/수신 측에서 데이터를 보내거나 받을 때 수용치를 초과하는 데이터가 오거나, 환경에 따라 오가는 데이터의 양을 조절해야할 경우 Flow Control, 흐름 제어 기능을 사용한다. Sliding Window 라는 개념으로 제어하며 이 Window는 송/수신 양 측 모두 갖고 있다.

Sliding Window는 말그대로 미끄러지며 이동하는 Window를 의미한다. 호스트가 보낼 수 있는 데이터의 양을 조절함과 동시에 어떤 SQ#에 대한 Retransmission을 진행해야하는 지 확인할 수 있다.

 

1,2 번은 이미 송신도 완료했고 송신에 대한 (SYN에 대한) ACK도 받았음을 의미한다.

3,4 번은 송신은 완료했지만, 아직 송신에 대한 ACK를 받지 못했음을 의미한다.

5,6,7 번은 송신할 수 있지만, 아직 송신하지 않은 데이터를 의미한다. (정확히는 해당 데이터를 갖고 있는 패킷의 SQ#)

8,9,10 번은 아직 보낼 수 없는 데이터를 의미한다.

 

  Sliding Window는 상황에 따라서 그 모양이 변하는데, 다음과 같은 경우를 들 수 있다. 각 그림을 연속적인 상황으로 가정하면 이해하기 편하다.

1. Window Closes

3번이 Window 로부터 닫혔다. 이미 송신했던 3번에 해당하는 데이터가 상대 호스트로부터 ACK를 받은 경우 Window Close가 발생한다.

 

2. Window Opens

  사실, TCP Header에는 WinSize Field가 있어서, 현재 호스트의 Window Size가 몇인지 알려주는 정보가 포함되어 있다. 그래서 상대방의 Window Size에 맞춰서 송신하는 Window Size를 같이 조정할 수 있다.

지금 설명하는 Window Opens의 경우, 상대 호스트의 Window Size가 기존 7에서 9로 증가했음을 의미한다.

 

3. Window Shrinks

  Window Shrinks는 Window Opens와 마찬가지로 Header의 WinSize에 영향을 받는데, Shrinks의 경우 증가하는 것이 아니라, Window Size가 감소하는 경우를 말한다. 다만, Window Shrinks는 ACKed Pointer가 Window Size 포인터를 벗어나는 경우가 발생할 수 있으므로 위험한 동작이다. 

 

 

반응형