본문 바로가기

CS/네트워크

TCP의 3 way handshake와 4 way handshake

3 way handshake(연결 설정)

  • 두 프로세스 모두 전송할 준비가 되어있다는 것을 보장한다.

1) Client(Process A)에서 Server(Process B)에 연결을 요청하는 패킷 SYN(a)를 보낸다.

2) Server가 정상적으로 요청을 받았다면, 그를 수락하는 ACK(a+1)패킷과 함께 SYN(b)를 보낸다.

cf) ACK(a+1)의 의미는 a번 패킷까지 안전하게 받았으니 a+1번째 패킷을 달라는 의미가 된다.

이를 통해 클라이언트는 자신이 보낸 패킷이 안전하게 도달했는지 알 수 있다.

3) Client는 두 패킷을 받고 ACK(b+1)로 패킷을 보내면 연결이 완료된다.

4 way handshake(연결 해제)

1) Client에서 연결을 끊겠다는 FIN플래그를 전송한다.

2) Server에서 FIN플래그를 받았다는 의미로 ACK를 보낸다. 이 때, 서버에서 모든 데이터가 가지 않았을 수도 있기 때문에 Client는 잠시동안 Time out 된다. 

3) Server에서 모든 데이터를 다 보냈다는 표시로 FIN플래그를 전송한다.

4) Client는 FIN플래그에 대한 ACK를 보낸다.

5) Client의 ACK를 받은 Server는 closed 된다.

6) Client는 Server에서 미처 받지 못한 데이터가 있을 경우에 대비해 잠시동안 Time wait 한다.

 

포트 상태 정보

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

QUESTION

  • 왜 두 개의 패킷을 사용하는가?
    • 요청과 응답에 대한 패킷을 주고받아야 하기 때문이다.
  • 연결 설정을 할 때 2 way handshake로는 안되는가?
    • TCP는 양방향성이다. 즉, 클라이언트가 서버에게 연결 요청을 하듯, 서버도 클라이언트에게 자신의 존재를 알리고 연결할 수 있다는 신호를 전송해야 한다.
  • 왜 sequence number는 랜덤하게 설정되는가?
    • 포트는 유한 범위 내에서 사용하고 재사용된다. 따라서 두 개의 프로세스가 이전에 사용했던 동일한 포트를 사용할 수도 있다. 이렇게 잘못 인식하게 된다면 전송되는 패킷이 이전에 연결되었던 프로세스로부터 오는 것으로 잘못 인식할 수 있다. 이러한 상황을 방지하고자 함이다.
  • 연결설정, 연결해제 과정에 차이가 있는 이유?
    • Client가 FIN 플래그를 보냈더라도, 서버에서는 아직 데이터를 모두 보내지 않았을 수도 있다. 따라서 일단 FIN 플래그에 대한 응답 ACK만 보내고 데이터를 모두 전송한 다음 FIN을 보낸다.
  • 만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까?
    • 데이터가 유실될 위험이 있다. 따라서 이러한 상황을 방지하기 위해 Client는 일정한 시간 동안 Time wait 한다.

'CS > 네트워크' 카테고리의 다른 글

HTTP 헤더  (0) 2021.05.25
GET과 POST  (0) 2021.05.18
TCP/UDP의 Header  (0) 2021.05.17
TCP와 UDP  (0) 2021.05.15
OSI 7계층  (0) 2021.05.15