본문 바로가기
Computer Science/Computer Network

[Network] TCP 3-way handshake & 4-way handshake

by domo7304 2022. 9. 19.

TCP 3-way handshake & 4-way handshake 란 클라이언트는 서버에 요청을 전송할 수 있는지, 서버는 클라이언트에게 응답을 전송할 수 있는지 확인하는 과정이다.

  1. 3-way handshake (이동)
  2. 4-way handshake (이동)
  3. 기타 질문 (이동)
  • 3-way 인 이유? 2-way 로는 부족한가?
  • TCP 의 연결 설정 과정과 연결 종료 과정의 단계가 차이나는 이유?
  • Server 에서 FIN 플래그 전송 전에 전송했던 패킷이 FIN 패킷보다 늦게 도착한다면?
  • ISN 이 0부터 시작하지 않고 난수를 생성해서 설정하는 이유?

용어 설명

  • SYN : Synchronize Sequence Number
  • ACK : Acknowledgement

포트 설명

  • CLOSED : 포트가 닫힌 상태
  • LISTEN : 포트가 열린 상태로 연결 요청 대기 중
  • SYN_RCV :  SYNC 요청을 받고 상대방의 응답을 기다리는 중
  • ESTABLISHED : 포트 연결 상태

플래그 정보

  • TCP Header 에는 CONTROL BIT(플래그 비트, 6bit) 가 존재하며, 각각의 bit 는 "URG-ACK-PSH-RST-SYN-FIN" 의 의미를 가진다. 즉, bit 가 1인지 0인지에 따라 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타낸다.

TCP segment structure

1. 3-way handshake

연결과정

1. 클라이언트는 서버에 접속을 요청하기 위해 SYN(a) 패킷을 보낸다.

  • 이 때 Sequence Number 를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다. 
  • Port 상태 - A : CLOSED, B : LISTEN2

2. 서버는 클라이언트의 요청인 SYN(a) 패킷에 대한 요청 수락 응답으로 ACK(a+1) 패킷과 클라이언트도 포트를 열어달라는 SYN(b) 패킷을 보낸다. 

  • 이 때 Acknowledgement Number 를 (Sequence Number + 1) 로 지정하고, SYN 와 ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
  • Port 상태 - B : SYN_RCV, A : CLOSED

3. 클라이언트는 ACK(a+1) 패킷과 SYN(b) 패킷을 받고 이에 대한 응답으로 ACK(b+1) 패킷을 보내며 연결이 성립된다.

  • ACK, SYN 패킷을 받은 후 Port 상태 - A : ESTABLISHED, B : SYN_RCV
  • 클라이언트가 ACK 패킷을 보낸 후 최종 Port 상태 - A : ESTABLISHED, B : ESTABLISHES
  • 이 때 전송할 데이터가 있으면, 이 단계에서 데이터를 전송할 수 있다.

 

2. 4-way handshake

해제 과정

1. 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 보낸다.

  • 서버가 FIN 플래그로 응답하기 전까지 연결을 계속 유지
  • Port 상태 - A : ESTABLISHED, B : ESTABLISHED

2. 서버는 FIN 플래그를 받고, 확인했다는 ACK 를 클라이언트에게 보낸다. (이 때 모든 데이터를 보내기 위해 CLOSE_WAIT 상태가 된다.)

  • 이 때 Acknowledgement Number 를 (Sequence Number + 1) 로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
  • 서버에서 전송할 데이터가 남아있다면 이어서 계속 전송한다. 클라이언트에서도 아직 서버로부터 받지 못한 데이터가 있을 수 있음을 대비해 일정 시간동안 세션을 남겨놓고 패킷을 기다린다. 이를 TIME_WAIT 상태라고 한다.
  • Port 상태 - B : CLOSE_WAIT, A : FIN_WAIT_1

3. 데이터를 모두 보냈다면, 이제 연결을 종료해도 괜찮다는 의미로 FIN 플래그를 클라이언트에게 보낸다.

  • Port 상태 - B : CLOSE_WAIT, A : FIN_WAIT_2

4. 클라이언트는 FIN 을 받고, 확인했다는 ACK 를 서버에게 보낸다. (아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT 을 통해 기다린다.)

  • Port 상태 - A : TIME_WAIT, B : LAST_ACK

5. 서버는 ACK 를 받은 이후 소켓을 닫는다. TIME_WAIT 시간이 끝나면 클라이언트도 닫는다.

 

3. 기타 질문

1. 3-way 인 이유? 2-way 로는 부족한가?

TCP 는 양방향성 연결이기 때문에 클라이언트에서 서버에게 자신의 존재를 알리고 패킷을 보낼 수 있다는 것을 알리는 것처럼, 서버에서도 클라이언트에게 자신의 존재를 알리고 패킷을 보낼 수 있다는 신호를 보냈을 때, 정상적으로 수신되었음을 알려줘야 하므로 2-way 로는 부족하다.

2. TCP 의 연결 설정 과정(3단계)과 연결 종료 과정의 단계(4단계)가 차이나는 이유?

클라이언트가 데이터 전송을 마쳤다고 하더라도 서버에서 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN 에 대한 ACK 만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메시지를 보내기 때문이다.

3. Server 에서 FIN 플래그 전송 전에 전송했던 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까?

클라이언트에서 세션을 종료한 뒤 뒤늦게 도착하는 패킷이 있다면, 이 패킷은 Drop 되고 데이터는 유실될 것.

이러한 현상에 대비하여 클라이언트는 서버로부터 FIN 플래그를 수신하더라도 일정시간(default: 240sec) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치는데, 이 과정을 TIME_WAIT 과정이라고 한다.

4. ISN 이 0부터 시작하지 않고 난수를 생성해서 설정하는 이유?

Connection 을 맺을 때, 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용한다. 따라서 이전에 사용한 포트 번호를 재사용할 가능성이 있다.

Sequence Number 가 순차적인 숫자로 전송된다면, 서버는 이전의 Connection 으로부터 전송되는 패킷으로 인식할 수 있다. 따라서 이러한 문제를 해결하기 위해 난수로 초기 Sequence Number 를 설정한다.

 

댓글