3-way-handshake

 

  • TCP 통신을 이용하여 데이터를 송신할 때 네트워크 연결이 성립되는 과정
  • 양쪽 모두 데이터를 전솔할 준비가 되었다는 것을 보장하고, 실제로 데이터를 송수신하기 전 상대방도 준비가 되었는지 확인할 수 있도록 합니다.
  • 즉, TCP/IP 프로토콜을 이용해서 전송을 할 때 정확한 데이터 전송을 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정입니다.
  • 연결 수립 과정
    • Client에서 접속을 요청하는 SYN(SEQ) 패킷을 Server에 보냅니다. 이때 Client는 SYN 패킷을 보냄과 동시에 Server로부터 ACK 메시지를 받기 위한 SYN_SENT 상태로 바뀌게 됩니다.
    • Server에서 SYN 패킷을 받으면 요청을 수락하는 SYN(NEW SEQ)/ACK(SEQ+1) 패킷을 보낸 뒤 SYN을 받았다는 SYN_RCV 상태로 바뀌게 됩니다. 
    • Client에서 SYN/ACK 패킷을 받으면 연결을 하자는 ACK(NEW SEQ+1)을 보낸 뒤 Client와 Server는 ESTABLISHED 상태로 연결됩니다.

 

 

4-way-hanshake

 

  • TCP 통신을 이용하여 데이터 송신이 끝난 뒤 연결을 해제하는 과정입니다.
  • 연결 해제 과정
    • Client와 Server가 연결된 상태에서 Client가 연결을 끊기 위한 Close() 함수를 호출하며 FIN 세그먼트를 Server측에 보내며 FIN_WAIT1상태가 됩니다.
    • Server는 클라이언트가 연결을 종료한다는 것을 알게되고 ACK 세그먼트를 보낸 뒤 CLOSE_WAIT상태가 되고 Client는 FIN_WAIT2상태가 됩니다. 그 후 CLOSE_WAIT 상태가 끝나면 Server는 연결을 끊기 위한 CLOSE() 함수를 호출하며 Client로 FIN 세그먼트를 보냅니다.
    • FIN 세그먼트를 받은 Client는 Server로 ACK 세그먼트를 보낸 뒤 TIME_WAIT상태가 되며 전송 중이지만 아직 전송이 되지않은 데이터를 모두 받은 뒤 CLOSED상태가 되며 연결을 해제합니다.

 

 

PORT 상태 정보

  • CLOSED : 포트가 닫힌 상태
  • LISTEN : 포트가 열려있고 연결을 기다리는 상태
  • SYN_RCV : SYN요청인 연결 요청을 받고 상대방 응답을 기다리는 상태
  • ESTABLISHED : 포트 연결된 상태

 

플래그 정보

  • TCP 헤더에는 CONTROL BIT(플래그 비트, 6비트)각 존재하며,  각 bit는 "URG-ACK-PSH-RST-SYN-FIN"의 의미를 가집니다.
    • 즉, 해당 비트가 1이냐 0이냐에 따라서 해당 패킷이 어떤 내용을 담고 있는지 나타냅니다.\
  • SYN(Synchronize Sequence Number) - 000010
    • 연결 설정, Sequence number를 랜덤으로 설정하여 세션을 연결하는데 사용하며, 초기에 Sequence Number을 전송합니다.
  • ACK(Acknowledgement) - 010000
    • 응답 확인으로 패킷을 받았다는 것을 의미합니다.
    • Acknowledgement Number가 유효한지를 나타냅니다.
    • 양단 프로세스가 쉬지않고 전송한다고 한다면 최초 연결 설정 과정에서 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK bit는 1입니다. 
  • FIN(Finish) - 000001
    • 연결 해제로 세션 연결을 해제할 때 사용합니다.

 

 

 

*참고*

 

TCP 연결 과정에서 연결(3단계)와 연결 해제(4단계) 과정에서 단계 차이가 나는 이유는??

  • Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 후에 자신도 FIN 메시지를 보내기 때문입니다

 

 

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

  • 이러한 현상에 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간(Default: 240sec)동안 세션을 남겨 놓고 잉여 패킷을 기다리는 과정을 거칩니다. (TIME_WAIT 과정)

 

초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유?

  • Connection을 맺을 때 사용하는 포트(Port)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재합니다
  • 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순처적인 Number가 전송된다면 이전의 Connection으로부터 오는 패킷으로 인식할 수 있다. 이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정합니다

 

'Network' 카테고리의 다른 글

[Network] 쿠키와 세션  (0) 2021.10.21
[Network] HTTP Method  (0) 2021.10.21
[Network] HTTP와 HTTPS  (0) 2021.10.21
[Network] TCP와 UDP  (0) 2021.10.17
[Network] OSI 7계층 & TCP/IP 4계층  (0) 2021.10.14

+ Recent posts