[네트워크] 3 way handshake & 4 way handshake

hyyyynjn·2021년 11월 2일
0

면접대비

목록 보기
27/31
post-thumbnail

3 way handshake : 연결 성립 단계

  1. 클라이언트가 서버에게 syn 패킷(sequence: x)을 보낸다
  2. 서버가 syn(x)를 받는다. 그 후 클라이언트로 부터 잘 받았다는 신호인 ack와 syn 패킷을 보낸다
    (sequence: y, ack: x+1)
  3. 클라이언트는 서버의 응답인 ack(x+1), syn(y)패킷을 받고 이에 대한 응답으로 ack(y+1)을 서버로 보낸다

위와 같은 3번의 통신이 완료되면 연결이 성립된다.


  1. 클라이언트 -> 서버

클라이언트는 서버로 접속을 요청한다는 의미로 syn(x)을 보낸다.

  • tcp header의 sequence number 필드를 임의의 랜덤 숫자로 지정하고, syn 플래그 비트를 1로 설정한 세그먼트를 전송한다.
  • 포트 상태
    클라이언트 : closed
    서버 : listen -> syn_rcv
  1. 서버 -> 클라이언트

서버는 클라이언트의 요청 syn(x)를 받고 접속 요청을 수락한다는 의미로 ack(x+1)과 클라이언트와의 연결을 요청하는 syn(y)을 보낸다

  • 서버는 tcp header의 acknowledgement number 필드를 sequence number + 1 로 지정하고
    syn, ack 플래그 비트가 1로 설정된 세그먼트를 전송한다.
  • 포트 상태
    클라이언트 : closed -> established
    서버 : syn_rcv
  1. 클라이언트 -> 서버

클라이언트는 서버의 수락 응답(ack(x+1), syn(y))를 받고
서버로 ack(y+1)을 보낸다. 이후 연결이 성립된다.

  • 전송할 데이터가 존재하면 이 단계부터 데이터를 전송할 수 있다.
  • 포트 상태
    클라이언트 : established
    서버 : syn_rcv -> established

연결을 성립하기 위해 2종류의 패킷을 사용하는 이유

연결을 성립하기 위해서
요청과 응답에 대한 패킷을 주고 받아야 하기 위해 2종류의 패킷이 필요하다.

2way가 아닌 3way인 이유

총 3번의 신호를 주고 받아 tcp connection 이 성립되기 때문이다

  1. 클라이언트는 서버에게 자신의 존재를 알리고
  2. 서버는 클라이언트의 존재를 확인했다는 사실과 함께 자신의 존재를 알리는 신호를 보내고
  3. 클라이언트는 서버의 존재를 확인했다는 신호를 보내면
  • tcp connection established

클라이언트는 syn 패킷을 보낼 때 최초의 sequence number(ISN)를 랜덤으로 설정하여 보내는 이유

tcp connection을 맺을 때 사용하는 port는 유한한 범위를 가진다. 그렇기 때문에 시간이 지나면 재사용된다.
이말은 곧 과거에 두 host가 과거에 사용했던 port 쌍을 다시 사용할 가능성이 있다는 의미다.

랜덤수가 아닌 순차적으로 sequence number를 설정하게 되면

이전에 성립했던 tcp connection 으로부터 오는 패킷으로 인식할 가능성이 존재한다.
이러한 문제점이 발생할 가능성을 최대한 줄이기 위해서 ISN(최초의 sequence number)를 랜덤수로 설정한다.

4 way handshake : 연결 해제 단계

연결 성립후, 모든 통신이 끝나면 연결을 해제한다.

  1. 클라이언트는 서버에게 연결을 종료한다는 의미로 tcp header의 FIN 플래그를 설정하여 보낸다
  2. 서버는 FIN을 받고 이를 확인했다는 의미로 ack 패킷을 클라이언트에게 보낸다
    (이때 모든 데이터를 보내기 위해 close_wait 상태가 된다)
  3. 서버가 데이터를 모두 보내면, 연결이 종료되었다는 의미로 FIN 플래그를 클라이언트에게 보낸다
  4. 클라이언트는 FIN을 받고, 이를 확인했다는 의미로 ack 패킷을 서버에게 보낸다
    (서버로부터 받지 못한 데이터가 있을 수 있으므로 time_wait 상태가 되고 대기한다)
  • 서버는 ack를 받은 뒤 소켓을 닫고 closed 상태가 된다
  • 클라이언트는 time_wait 만큼의 시간이 지나면 소켓을 닫고 closed 상태가 된다.

  1. 클라이언트 -> 서버

클라이언트는 tcp 연결을 해제하겠다는 의미로 fin 플래그를 서버로 전송한다.

  • 서버는 클라이언트로부터 fin 플래그가 설정된 세그먼트를 받기 전까지 tcp 연결을 유지한다.
  1. 서버 -> 클라이언트

서버는 클라이언트의 요청 (fin)을 받고 이를 받았다는 의미로 ack를 보낸다

  • 이 후 서버는 자신의 통신이 끝날 때까지 (데이터를 모두 보낼 때까지) 기다리기 위해 close_wait 상태가 된다.
  1. 서버 -> 클라이언트

서버는 데이터를 모두 보내고 자신의 통신이 끝나면, tcp 연결을 종료한다는 의미로 fin 플래그를 클라이언트에게 전송한다

  1. 클라이언트 -> 서버

클라이언트는 서버의 응답(fin)을 확인했다는 의미로 ack 를 보낸다.

  • 클라이언트는 서버로부터 아직 못받은 데이터를 받기 위해서
    time_wait 상태가 된다.

이후

  • 서버는 클라이언트로부터 ack를 받고 socket을 닫은 뒤 closed 상태가 된다.
  • 클라이언트는 time_wait 의 시간이 지나면 socket을 닫고 closed 상태가 된다.

TCP Header 속 플래그

tcp header에는 6비트의 code bit(flag bit) 부분이 있다.

  • 각각의 bit가 의미를 지닌다.
  • urg-ack-psh-rsh-syn-fin 순서이며 해당 위치의 비트가 1이면 해당 패킷이 어떤 내용을 담는 패킷인지 나타낸다
  • 예를 들어 000010이면 syn 패킷, 01000 이면 ack 패킷, 000001 이면 fin

syn

synchronize sequence number

  • 연결 설정의 의미를 가지는 플래그이다.
  • sequence number를 난수로 설정하여 세션을 연결하는데 사용한다.

ack

acknowledgement

  • 응답 확인의 의미를 가지는 플래그이다.
  • 01000 이면 acknowledgment number 필드가 유효하다는 의미이다.

fin

finish

  • 연결 해체의 의미를 지닌다 (더이상 전송할 데이터가 없음을 의미한다)
  • 세션을 종료할 때 사용되는 플래그이다.

0개의 댓글