1️⃣ TCP (Transmission Control Protocol)
TCP (Transmission Control Protocol) 란 전송 제어 프로토콜로, IP와 함께 'TCP/IP'로도 불린다. OSI 7 계층 중 전송 계층과 관련있으며, UDP와 함께 가장 널리 쓰인다. TCP는 연결형 서비스로, 패킷의 순서를 보장하며 신뢰성있는 전송을 위해 연결을 시작할 때와 종료할 때 handshake 과정을 거치게 된다. 즉, 3-way handshake 과정을 통해 연결을 설정하고, 4-way handshake 과정을 통해 안전하게 연결을 해제한다. TCP와 UDP의 개념은 중요하므로 다른 글에서 좀 더 자세히 다뤄보도록 하겠다.
2️⃣ Information
1) Port State Information (포트 상태 정보)
- CLOSED : 포트가 닫힌 상태
- LISTEN : 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV : SYNC 요청을 받아 상대방 응답 대기 중
- ESTABLISHED : 포트 연결 상태
2) Flag Information (플래그 정보)
TCP 헤더에는 CONTROL BIT(FLAG BIT, 6bit)가 존재하며, 각각의 bit는 순서대로 'URG-ACK-PSH-RST-SYN-FIN'을 의미한다. 만약 두 번째 위치의 bit가 1이면 해당 패킷이 담고 있는 내용을 알 수 있다.
- URG(Urgent) : 긴급 데이터(urgent data)가 포함되어 있음을 나타낸다. 긴급 데이터는 주로 TCP 스트림의 중요도가 높아 즉시 처리되어야 함을 의미한다.
- ACK(Acknowledgment) : 확인 응답 번호(ACK Number)가 유효함을 나타낸다. 해당 플래그가 설정되면 다음 번호로 전송할 준비가 된 데이터가 존재함을 의미한다.
- PSH(Push) : 수신측에게 데이터를 즉시 전달하라는 요청을 나타낸다. 버퍼링을 최소화하여 데이터를 즉시 처리하도록 유도한다.
- RST(Reset) : 연결을 재설정하고 상태를 초기화하는데 사용된다. 일반적으로 오류가 발생하거나 연결을 완전히 종료할 때 사용된다.
- SYN(Synchronize Sequence Number) : 연결 설정을 시작하는데 사용된다. 초기 연결을 설정할 때 사용되며, 시퀀스 번호를 동기화하고 통신의 시작을 알린다.
- FIN(Finish) : 송신자가 데이터 전송을 완료했음을 나타낸다. 종료 프로세스를 시작하기 위해 사용된다.
3️⃣ 3-way handshake
1) 개념
3-way handshake는 TCP/IP 프로토콜을 통해 통신하는 응용 프로그램이 데이터 전송을 시작하기 전에 신뢰성있는 전송을 보장하기 위해 통신 대상이 되는 호스트와 사전에 세션을 수립하는 과정이다. 이 때 데이터를 전송하기 전에 연결을 확립하기 위해 해킷 요청을 세 번 교환하는 것을 '3-way handshaking'이라고 한다. 이는 네트워크 통신에서 확실하게 데이터가 전송되었는지 확인하면서 이루어지는 통신 방식이다.
2) 과정

1. [Client -> Server]
네트워크 통신을 위해 수신 측 컴퓨터의 허락을 받아야 한다. 따라서 송신 측 컴퓨터는 수신 측 컴퓨터에 연결 확립 허가를 받기 위해 'SYN' 요청을 보낸다. 이 때 송신자가 최초로 데이터 전송시 'Sequence Number'를 임의의 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다. 클라이언트 측 포트 상태는 'CLOSED' -> 'SYN_SENT' 로 변환되며, 서버 측 포트 상태는 'LISTEN'이 된다.
2. [Server -> Client]
수신 측 컴퓨터는 송신 측 컴퓨터가 보낸 요청을 받고, 허가 응답 회신을 위해 연결 확립 응답인 'ACK'를 보낸다. 이와 동시에 수신 측 컴퓨터는 송신 측 컴퓨터로부터 데이터 전송 허가를 받기 위해 연결 확립 요청인 'SYN'을 보낸다. 이 때 연결을 확립하기 위해 코드 비트의 SYN과 ACK가 1로 활성화되며, ACK Number 필드를 'Sequence Number + 1'로 지정하여 새그먼트를 전송한다. 클라이언트 측 포트 상태는 'CLOSED', 서버 측 포트 상태는 'SYN_RCV'가 된다.
3. [Client -> Server]
수신 측 컴퓨터의 요청을 받은 송신 측 컴퓨터는 수신 측 컴퓨터에 허가한다는 응답으로 연결 확립 응답인 'ACK'를 보낸다.
이 때 전송할 데이터가 있으면 이 단계에서 데이터 전송이 가능하다. 클라이언트 측 포트 상태는 'ESTABLISHED', 서버 측 포트 상태는 'SYN_RCV' -> 'ESTABLISHED'가 된다.

4️⃣ 4-way handshake
1) 개념
4-way handshake 는 3-way handshake와 반대로 연결을 해제하는 과정이다. 이 때 하나의 플래그가 더 추가되는데, 바로 'FIN(Finish)' 플래그이다. 세션 종료시 사용되며, 더 이상 전송할 데이터가 없음을 나타낸다. 명칭 그대로 4번의 메시지 교환이 이루어진다.
2) 과정

1. [Client -> Server]
클라이언트가 통신을 종료하려고 할 때, 먼저 서버에게 연결을 종료하겠다는 의미를 담은 'FIN' 플래그가 설정된 TCP 세그먼트를 전송한다. 클라이언트 측은 'FIN_WAIT_1' 상태로 변한다
2. [Server -> Client]
서버는 클라이언트로부터 'FIN'을 받으면 이에 대한 확인 메시지인 'ACK'를 보내고, 클라이언트의 요청을 수락하여 통신이 끝날때까지 기다린다. 이 때 'TIME_WAIT' 상태로 바뀐다. 이후 서버는 ACK Number 필드를 'Sequence Number + 1'로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다. 서버 측은 'CLOSE-WAIT' 상태가 되며, 서버가 종료될 준비가 되었다는 'FIN'을 전송하기 전까지 클라이언트 측은 'FIN_WAIT_2' 상태가 된다.
3. [Server -> Client]
서버는 통신을 종료하겠다는 의사를 표시하기 위해 'FIN' 플래그가 설정된 TCP 세그먼트를 클라이언트에게 보낸다. 이후 승인 번호를 보내줄 때까지 'LAST_ACK' 상태가 된다.
4. [Client -> Server]
클라이언트는 서버로부터 'FIN'을 받으면 이에 대한 확인 메시지인 'ACK'를 서버로 전송한다. 하지만 아직 서버로부터 수신하지 못한 데이터가 존재할 수 있으므로 'TIME_WAIT' 상태가 되어 기다린다. 이는 예상치 못한 오류로 인해 연결이 데드락 상태로 빠지는 것을 방지한다. 만약 오류가 발생하여 종료가 늦춰져 특정 시간이 초과되면 'CLOSED' 상태로 변한다.

참고
1️⃣ TCP (Transmission Control Protocol)
TCP (Transmission Control Protocol) 란 전송 제어 프로토콜로, IP와 함께 'TCP/IP'로도 불린다. OSI 7 계층 중 전송 계층과 관련있으며, UDP와 함께 가장 널리 쓰인다. TCP는 연결형 서비스로, 패킷의 순서를 보장하며 신뢰성있는 전송을 위해 연결을 시작할 때와 종료할 때 handshake 과정을 거치게 된다. 즉, 3-way handshake 과정을 통해 연결을 설정하고, 4-way handshake 과정을 통해 안전하게 연결을 해제한다. TCP와 UDP의 개념은 중요하므로 다른 글에서 좀 더 자세히 다뤄보도록 하겠다.
2️⃣ Information
1) Port State Information (포트 상태 정보)
- CLOSED : 포트가 닫힌 상태
- LISTEN : 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV : SYNC 요청을 받아 상대방 응답 대기 중
- ESTABLISHED : 포트 연결 상태
2) Flag Information (플래그 정보)
TCP 헤더에는 CONTROL BIT(FLAG BIT, 6bit)가 존재하며, 각각의 bit는 순서대로 'URG-ACK-PSH-RST-SYN-FIN'을 의미한다. 만약 두 번째 위치의 bit가 1이면 해당 패킷이 담고 있는 내용을 알 수 있다.
- URG(Urgent) : 긴급 데이터(urgent data)가 포함되어 있음을 나타낸다. 긴급 데이터는 주로 TCP 스트림의 중요도가 높아 즉시 처리되어야 함을 의미한다.
- ACK(Acknowledgment) : 확인 응답 번호(ACK Number)가 유효함을 나타낸다. 해당 플래그가 설정되면 다음 번호로 전송할 준비가 된 데이터가 존재함을 의미한다.
- PSH(Push) : 수신측에게 데이터를 즉시 전달하라는 요청을 나타낸다. 버퍼링을 최소화하여 데이터를 즉시 처리하도록 유도한다.
- RST(Reset) : 연결을 재설정하고 상태를 초기화하는데 사용된다. 일반적으로 오류가 발생하거나 연결을 완전히 종료할 때 사용된다.
- SYN(Synchronize Sequence Number) : 연결 설정을 시작하는데 사용된다. 초기 연결을 설정할 때 사용되며, 시퀀스 번호를 동기화하고 통신의 시작을 알린다.
- FIN(Finish) : 송신자가 데이터 전송을 완료했음을 나타낸다. 종료 프로세스를 시작하기 위해 사용된다.
3️⃣ 3-way handshake
1) 개념
3-way handshake는 TCP/IP 프로토콜을 통해 통신하는 응용 프로그램이 데이터 전송을 시작하기 전에 신뢰성있는 전송을 보장하기 위해 통신 대상이 되는 호스트와 사전에 세션을 수립하는 과정이다. 이 때 데이터를 전송하기 전에 연결을 확립하기 위해 해킷 요청을 세 번 교환하는 것을 '3-way handshaking'이라고 한다. 이는 네트워크 통신에서 확실하게 데이터가 전송되었는지 확인하면서 이루어지는 통신 방식이다.
2) 과정

1. [Client -> Server]
네트워크 통신을 위해 수신 측 컴퓨터의 허락을 받아야 한다. 따라서 송신 측 컴퓨터는 수신 측 컴퓨터에 연결 확립 허가를 받기 위해 'SYN' 요청을 보낸다. 이 때 송신자가 최초로 데이터 전송시 'Sequence Number'를 임의의 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다. 클라이언트 측 포트 상태는 'CLOSED' -> 'SYN_SENT' 로 변환되며, 서버 측 포트 상태는 'LISTEN'이 된다.
2. [Server -> Client]
수신 측 컴퓨터는 송신 측 컴퓨터가 보낸 요청을 받고, 허가 응답 회신을 위해 연결 확립 응답인 'ACK'를 보낸다. 이와 동시에 수신 측 컴퓨터는 송신 측 컴퓨터로부터 데이터 전송 허가를 받기 위해 연결 확립 요청인 'SYN'을 보낸다. 이 때 연결을 확립하기 위해 코드 비트의 SYN과 ACK가 1로 활성화되며, ACK Number 필드를 'Sequence Number + 1'로 지정하여 새그먼트를 전송한다. 클라이언트 측 포트 상태는 'CLOSED', 서버 측 포트 상태는 'SYN_RCV'가 된다.
3. [Client -> Server]
수신 측 컴퓨터의 요청을 받은 송신 측 컴퓨터는 수신 측 컴퓨터에 허가한다는 응답으로 연결 확립 응답인 'ACK'를 보낸다.
이 때 전송할 데이터가 있으면 이 단계에서 데이터 전송이 가능하다. 클라이언트 측 포트 상태는 'ESTABLISHED', 서버 측 포트 상태는 'SYN_RCV' -> 'ESTABLISHED'가 된다.

4️⃣ 4-way handshake
1) 개념
4-way handshake 는 3-way handshake와 반대로 연결을 해제하는 과정이다. 이 때 하나의 플래그가 더 추가되는데, 바로 'FIN(Finish)' 플래그이다. 세션 종료시 사용되며, 더 이상 전송할 데이터가 없음을 나타낸다. 명칭 그대로 4번의 메시지 교환이 이루어진다.
2) 과정

1. [Client -> Server]
클라이언트가 통신을 종료하려고 할 때, 먼저 서버에게 연결을 종료하겠다는 의미를 담은 'FIN' 플래그가 설정된 TCP 세그먼트를 전송한다. 클라이언트 측은 'FIN_WAIT_1' 상태로 변한다
2. [Server -> Client]
서버는 클라이언트로부터 'FIN'을 받으면 이에 대한 확인 메시지인 'ACK'를 보내고, 클라이언트의 요청을 수락하여 통신이 끝날때까지 기다린다. 이 때 'TIME_WAIT' 상태로 바뀐다. 이후 서버는 ACK Number 필드를 'Sequence Number + 1'로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다. 서버 측은 'CLOSE-WAIT' 상태가 되며, 서버가 종료될 준비가 되었다는 'FIN'을 전송하기 전까지 클라이언트 측은 'FIN_WAIT_2' 상태가 된다.
3. [Server -> Client]
서버는 통신을 종료하겠다는 의사를 표시하기 위해 'FIN' 플래그가 설정된 TCP 세그먼트를 클라이언트에게 보낸다. 이후 승인 번호를 보내줄 때까지 'LAST_ACK' 상태가 된다.
4. [Client -> Server]
클라이언트는 서버로부터 'FIN'을 받으면 이에 대한 확인 메시지인 'ACK'를 서버로 전송한다. 하지만 아직 서버로부터 수신하지 못한 데이터가 존재할 수 있으므로 'TIME_WAIT' 상태가 되어 기다린다. 이는 예상치 못한 오류로 인해 연결이 데드락 상태로 빠지는 것을 방지한다. 만약 오류가 발생하여 종료가 늦춰져 특정 시간이 초과되면 'CLOSED' 상태로 변한다.

참고