[네트워크] 3-way-handshake와 4-way-handshake

Narcoker·2023년 5월 31일
0

네트워크

목록 보기
4/12

3 way handshake와 4 way handshake

TCP는 장치들 사이에 논리적인 접속을 성립(establish)하기 위하여 연결을 설정하여
신뢰성을 보장하는 연결형 서비스 이다.

이때 신뢰성을 보장하기 위한 방법으로 연결과 연결 해제하는 과정을 말한다.

3 way handshake

TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정(Connection Establish) 하는 과정

과정

[포트(PORT) 상태 정보]

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

클라리언트가 서버에게 SYN(x) 패킷을 보냄

  • SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.
  • 송신자가 최초로 데이터를 전송할 때 Seqeunce Number를 난수로 지정한다.
  • PORT 상태 - A: CLOSED, B: LISTEN

[초기 Seqeunce Number를 난수로 지정하는 이유]

Connection을 맺을 때 사용하는 포트(Port)는 유한 범위(0 ~ 2^32 -1) 내에서 사용하고
시간이 지남에 따라 재사용된다.

따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다.

서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데
난수가 아닌 순처적인 Number가 전송된다면
이전의 Connection으로부터 오는 패킷으로 인식할 수 있다.
이런 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정한다.

서버는 SYN(x)를 받는다. 접속 요청을 수락한다.
서버는 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 클라이언트도 포트를 열어달라고 요청
(sequence: y, ACK : x + 1)

  • SYN 과 ACK플래그 비트를 1로 설정한 세그먼트 정송
  • PORT 상태 - A: CLOSED, B: SYN_RCV

클라이언트는 서버의 응답을 받고 ACK(y+1)를 서버로 보냄 접속 요청이 수락됐음을 알게됨, 연결

  • 이 시점 이후부터 데이터를 전송할 수 있다.
  • PORT 상태 - A: ESTABLISHED, B: ESTABLISHED

4 way handshake

TCP의 연결을 해제(Connection Termination) 하는 과정

과정

클라이언트는 서버로 연결을 종료하겠다는 FIN 을 보낸다.

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

  • ACK : 수신 Sequence Number + 1
  • ACK 플래그 비트를 1로 설정

이후 CLOSE_WAIT 상태 동안 남은 데이터를 모든 송신한다.

서버는 더이상 보낼 데이터가 없으면
연결 종료 요청을 받아들인다는 FIN 플래그를 보낸다.

클라이언트는 FIN을 받고 확인했다는 ACK을 서버에게 보낸다.
아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT상태가 된다.

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

TIME_WAIT 의 기간은 2MSL(Maximum Segment Lifetime) 이다.

MSL 이란,
TCP에서 한 개의 세그먼트가 네트워크 상에서 최대로 존재할 수 있는 시간을 의미한다.
이는 TCP 세그먼트가 네트워크 상에서 무한정 존재하지 않도록 하기 위한 제한 시간으로 사용한다.

MSL은 보통 30초에서 1분이라고 하는데
RFC793(page 28)에 정의에 의하면 MSL은 2분이고 TIME_WATE의 기간은 4분이다.

하지만 실제로 대부분의 OS의 TIME_WAIT는 1분이라고 한다.
리눅스도 1분이라고 규정하고 있고 커널 코드에 상수로 정해져있다.

TIME_WAIT 기간을 2MSL 로 설정하여 네트워크에 남은 패킷이 없음을 보장할 수 있다.

연결과정과 종료 과정이 다른 이유

클라이언트가 전송을 마쳤더라도 서버는 아직 보낼 데이터가 남아 있을 수 있기 때문이다.
우선 FIN에 대한 ACK만 보내고 남은 데이터를 모두 전송후 자신도 FIN을 보내기 때문

profile
열정, 끈기, 집념의 Frontend Developer

0개의 댓글