네트워크 전송 계층에서 사용되는 TCP의 연결 설정 및 연결 해제 과정에 대해 알아보려고 합니다.
TCP는 장치들 사이에서 논리적인 성립(establish)을 하기 위해 연결을 설정하여 신뢰성을 보장하는 연결형 서비스를 제공합니다. 이러한 신뢰성 있는 서비스를 제공하기 위해 3 way handshake, 4 way handshake 과정을 거치게 되는데, 이 과정들에 대해 상세하게 설명드리겠습니다.
3-way handshake
- TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정하는 과정
- 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달을 시작하기 전에 한쪽이 "다른 쪽이 준비가 되었다는 것"을 알 수 있도록 합니다.
- 즉, TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미합니다.
<A 프로세스가 B 프로세스에게 연결을 요청하는 절차>
- A -> B (SYN, 연결 요청 메세지 전송, Sequence Number를 임의의 랜덤 숫자로 지정, SYN Flag Bit를 1로 설정한 세그먼트 전송)
- B -> A (SYN + ACK, 요청 수락 및 A 포트도 열어달라는 메세지 전송, Acknowledgement Number를 (Sequence Number + 1)로 지정하고 SYN, ACK Flag Bit를 1로 설정한 세그먼트 전송
- A -> B (ACK, B의 요청에 대한 A의 수락 메세지를 전송함으로써 연결을 맺고, 이 단계에서 데이터 전송도 가능)
TCP의 연결을 설정을 위한 3-way handshake에 대해 알아봤으니, 이제 연결을 해제하기 위한 4-way handshake에 대해서도 알아보겠습니다.
4-way handshake
- TCP의 연결을 해제하는 과정
<A 프로세스가 B 프로세스에게 연결 해제를 요청하는 과정>
- A -> B (FIN, 프로세스 A가 연결을 종료하겠다는 FIN flag 전송, 프로세스 B가 FIN Flag로 응답)
- B -> A (ACK, 프로세스 B는 확인 메세지를 보내고, ACK Number Field를 (Sequence Number + 1)로 지정하고 ACK Flag Bit를 1로 설정한 세그먼트를 전송합니다. 이때 전송할 데이터가 남아있으면 이어서 전송)
- A -> B (FIN, 프로세스 B가 통신이 끝났으면 연결 종료 요청에 동의한다는 의미로 프로세스 B에게 FIN Flag 전송)
- B -> A (ACK, 프로세스 A는 확인했다는 메세지 전송 후 TCP 연결이 해제)
참고용 개념
- 포트 상태 정보
- CLOSED: 포트가 닫힌 상태
- LISTEN: 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV: SYNC 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED: 포트 연결 상태
- 플래그 정보
- TCP Header에는 Control Bit(플래그 비트, 6bit)가 존재하며, 각각의 bit는 “URG-ACK-PSH-RST-SYN-FIN”의 의미를 지님
- 즉 해당 위치의 bit가 1이면 해당 패킷이 어떠한 내용을 담고 있는 패킷인지를 나타냄
- URG(Urgent) / 100000
- Urgent Poiner 필드에 값이 채워져있음을 알리고, 송신측 상위 계층이 긴급 데이터라고 알려주면, 긴급비트 URG를 1로 설정하고, 순서에 상관없이 먼저 송신됨
- ACK(Acknowledgement) / 010000
- 응답 확인, 패킷을 받았다는 것을 의미하고 양단 프로세스가 쉬지 않고 데이터를 전송했다고 가정하면 최초 연결 설정 과정에서 전송되는 첫 번째 세그먼트를 제외한 모든 세그먼트의 ACK 비트는 1로 지정
- PSH(Push) / 001000
- 버퍼링된 데이터를 가능한 한 빨리 상위 계층 응용프로그램에 즉시 전달하할 것을 의미, 수신 측은 버퍼가 찰 때까지 기다리지 않고, 수신 즉시 버퍼링된 데이터를 응용프로그램에 전달
- RST(Reset) / 000100
- LISTEN, SYN_RCVD → RST 수신한 경우에 Listen 상태로 들어감
- 그밖의 상태일 때 → RST 수신한 경우에 → 연결 끊고 Closed 상태로 들어
- 연결 확립(ESTABLISHED)된 회선에 강제 리셋 요청, 강제 리셋 RST = 1
- SYN(Synchronize Sequence Number) / 000010
- 연결 설정, Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용
- FIN(Finish) / 000001
- 연결 해제, 세션을 종료시킬 때 사용하고 더 이상 전송할 데이터가 없음을 의미
- Termination의 종류
- Graceful connection release (정상적인 연결 해제)
- 정상적인 연결 해제에서는 양쪽 커넥션이 서로 모두 닫힐 때 까지 연결되어 있습니다.
- Abrupt connection release (갑작스런 연결 해제)
- 갑자기 한 TCP 엔티티가 연결을 강제로 닫는 경우, 한 사용자가 두 데이터 전송 방향을 모두 닫는 경우
- Graceful connection release (정상적인 연결 해제)
- Client가 데이터 전송을 마쳤다고 하더라도 Server는 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 이후에 자신도 FIN 메세지를 보내기 때문입니다.
- 이러한 상황에 대비하여 Client는 Server로부터 FIN 플래그를 수신하더라도 일정시간(Default: 240sec)동안 세션을 남겨 놓고 잉여 패킷을 기다리는 과정을 거칩니다(TIME_WAIT 과정)
- Connection을 맺을 때 사용하는 포트(Port)는 한정된 범위 내에서 사용되고 시간이 지남에 따라서 재사용됩니다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재합니다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 Number가 전송된다면, 이전의 연결로부터 오는 패킷으로 인식할 수 있습니다. 이러한 문제가 발생할 가능성을 줄이기 위해 난수로 ISN을 설정합니다.
- TCP Header에는 Control Bit(플래그 비트, 6bit)가 존재하며, 각각의 bit는 “URG-ACK-PSH-RST-SYN-FIN”의 의미를 지님
<참고자료>
https://velog.io/@averycode/네트워크-TCPUDP와-3-Way-Handshake4-Way-Handshake
https://mindnet.tistory.com/entry/네트워크-쉽게-이해하기-22편-TCP-3-WayHandshake-4-WayHandshake
https://ddooooki.tistory.com/21
https://asfirstalways.tistory.com/356
'Network' 카테고리의 다른 글
[Java] Netty (Concept, Architecture, Component, Work flow) (0) | 2024.06.27 |
---|---|
[Network] ARP / RARP / GARP (0) | 2023.10.04 |
[Network] VRRP(Virtual Redundancy Routing Protocoal)가 무엇이고 왜 사용하는가 (2) | 2023.10.04 |
[Network] IPsec VPN이란? (0) | 2023.07.13 |
[Network] Switch 와 Bridge 비교 (0) | 2023.07.13 |