홍카나의 공부방

[컴퓨터 네트워크] 14-2. TCP의 연결설정(3-way handshake), 데이터 전송, 연결 해제 본문

Computer Network

[컴퓨터 네트워크] 14-2. TCP의 연결설정(3-way handshake), 데이터 전송, 연결 해제

홍문관카페나무 2023. 4. 29. 18:13

TCP의 연결 설정 : three-way handshake

  • TCP는 연결 지향형 프로토콜로, source와 destination 사이에 가상 연결 통로를 설정하게 된다.
  • 가상 연결 통로 설정 방법 중 하나는 three-way handshake이다. 연결 이후 모든 세그먼트는 해당 연결 통로로 전송된다.
  • TCP 연결은 Layer2와 다르게 physical이 아닌, virtual(logical) 연결이라는 것도 알아두면서 아래 그림으로 이해해보자.

3-way handshake를 이용한 TCP Connection

 

  1.  서버가 Passive Open 상태로 연결을 기다린다.
  2. 클라이언트가 Active Open 상태가 되면서 서버에 패킷을 전송한다.
  3. 이 과정에서 해당 패킷의 sequence number(첫번째 byte의 번호)는 해킹 방지를 위해 임의로 결정되며, 데이터 없이 헤더만 전송한다. SYN, ACK Flag가 포함된 패킷은 데이터가 없어도 전송된다. 위 그림에서는 8000번으로 SYN이 전송됐다.
  4. 서버에서 패킷을 받은 후, ACK(8001), SYN+ACK Flag를 담아서 클라이언트로 SYN을 받았다는 응답을 보낸다. 여기서 수신 윈도우 크기(rwnd)도 같이 전송되며, 위 그림에서는 rwnd: 5000으로 초기 수신 버퍼 크기가 5000바이트임을 알렸다. seq#는 역시나 랜덤으로 정해진 숫자인 15000을 보냈다. ACK번호에 +1을 하여 보낸 것은 패킷을 잘 받았다는 것을 표현한 것이다.
  5. Client에서는 연결을 open하고, 다시 Seq#에 1을 더한 Ack(15001), rwnd:(가용송신버퍼 크기), ACK Flag를 서버에 보낸다.
  6. 3번째 패킷을 보낼 때는 1번째 송신에서 Data를 전송하지 않고 헤더만 보냈기 때문에, 그전에 보냈던 seq 번호인 8000번을 다시 보낸 것이다. 이는 데이터가 따로 전송되지 않았다는 의미를 전달하기 위함이다.
  7. 서버에서도 3번째 패킷의 ACK를 확인한 다음, 연결을 open 한다.

 

요약 : 클라이언트의 SYN에 대해서 SYN+ACK가 전달되고, 또 서버에서 보낸 SYN에 대해서 ACK가 전달된다.

- 핵심은 SYN segment와 SYN+ACK segment가 데이터를 따로 전송하지는 않으나, 시퀸스 번호를 하나 소비한다는 점이다.
- 만약 ACK만 전달 되는 segment도 데이터를 따로 전송하지 않고 헤더만 보낸다면, 시퀸스 번호를 소비하지는 않는다. ( 보냈던 번호로 또 보냄 )

 

TCP의 데이터 전송

  • 아래의 데이터 전송 예시 그림은 연결이 온전히 설정이 되었음을 가정하고 그리는 예시다.

데이터 전송

 

  1.  위 연결 설정 과정에서 시퀸스 번호 8000번을 소비했기 때문에, 8001번을 첫번째 시퀸스 넘버로 설정해서 데이터를 전송한다.
  2. 클라이언트에서 패킷을 2번 보내서 8001~9000번 데이타, 9001~10000번 데이타를 보냈는데 서버에서는 패킷을 받을 때마다 굳이 ACK를 하나씩 보내지 않는다. ACK는 Overhead가 발생하는 과정이므로, 어느 정도 패킷을 연속으로 받고 ACK를 보낸다.
  3. 서버에서도 데이터를 보냈다. 연결 설정때 서버가 seq# 15000번을 소비했기 때문에, seq(15001)로 데이터를 보낸다.
  4. 마지막 클라이언트가 ACK를 보낼때 seq#를 10000번으로 보냈는데, 데이터를 보내지 않고 ACK Header만 보냈음을 의미한다.

 

TCP의 연결 해제

  • 연결 해제는 연결 설정시 보낸 것과 매우 비슷하게, FIN -> FIN+ACK -> ACK 형태로 통신하게 된다.
  • 먼저 끊어 주는 측이 Active Close고, 요청에 응답해서 연결을 끊는 쪽은 Passive Close다.
  • 클라이언트든 서버든 FIN에 대한 ACK를 응답받았을 때 Connection이 완벽하게 종료된다.

 

 

번외로 한쪽만 송신을 먼저 끝내는 Half-Close 방법도 있는데 이 글에서는 3-way HandShake만 일단 다뤘다.

반응형