3way handshaking(TCP의 링크 설정)

-
클라이언트는 접속을 요청하는 SYN 패킷을 보낸다.
이 때, 클라이언트는 응답을 기다리기 위해 SYN_SENT 상태로 변한다.
서버는 LISTEN상태로 대기중이다.
- SYN_SENT: SYN을 요청한 상태
- LISTEN: 포트가 열린 상태로 연결 요청에 대기 하는 중
-
LISTEN 상태였던 서버는 SYN 요청을 받으면,
클라이언트에게 요청을 수락하는 ACK 패킷과 SYN 패킷을 보낸다.
(양방향 통신이기 때문에 서버도 클라이언트에 접속하기 위해 SYN 패킷을 보냄)
서버는 SYN_RECEIVED상태로 전환 후 대기한다.
- SYN_RECEIVED: SYN요청을 받고 상대방의 응답을 기다리는중
-
SYN/ACK 패킷을 받은 클라이언트는 서버에 ACK 패킷을 보내고 ESTABLISHED 상태로 전환한다.
ACK 패킷을 받은 서버 또한 ESTABLISHED 상태로 전환되면 연결 수립이 완료된다.
- ESTABLISHED: 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다
자세한 설명
- Client → Server SYN 보내기
- 클라이언트가 연결을 시작
- 클라이언트는 서버에 SYN 플래그 비트를 1로 설정해 세그먼트를 서버에 전송
- 자신의 초기 시퀀스 번호(ISN)도 함께 보냄
- 데이터는 없음(오직 연결 요청)
- Client → Server: [SYN, seq=1000]
- Server → Client SYN-ACK 응답
- 서버는 클라이언트의 SYN을 수신하고, 서버의 ISN(Initial Sequence number)을 보내며 승인번호(ACK #)로 클라이언트의 ISN+1을 보냄
- SYN 플래그 비트를 1로 설정해 세그먼트를 클라이언트에 전송
- Server → Client: [SYN, seq=5000, ACK=1001]
(= "나는 5000번부터 시작할게. 너의 1000번도 잘 받았어")
- Client → Server ACK 보내기
- 클라이언트가 서버의 SYN-ACK을 받고 최종확인
- 클라이언트는 서버의 ISN+1한 값인 승인번호를 담아 ACK 세그먼트 전송
- Client → Server: [ACK, seq=1001, ACK=5001]
(= "너의 5000번 받았고, 내 다음은 1001번부터야")
데이터 통신 과정

1. 송신 측이 ESTABLISHED 상태에서 수신 측에게 데이터를 보낸다.
2. 수신 측은 잘 전송 받았다고 ACK 플래그를 넣어 응답한다.
3. 만약 송신 측에서 수신 측으로부터 ACK를 받지 못했다면 제대로 송신하지 못한 것으로 판단하고 데이터를 재전송한다.
4way handshaking(TCP의 링크 해제)

-
서버와 클라이언트가 TCP 연결이 되어있는 상태에서 클라이언트가 접속을 끊기 위해
CLOSE() 함수를 호출한다.
클라이언트가 FIN 플래그를 보내게 되고, FIN_WAIT1 상태로 대기한다.
- FIN_WAIT1: 자신이 보낸 FIN에 대한 ACK나 FIN을 기다린다
-
서버는 클라이언트가 CLOSE()를 호출한 것을 알게 되고 CLOSE_WAIT 상태로 바꾼 후
ACK 플래그를 전송한다.
만일 서버에서 클라이언트로 보낼 데이터가 남은 경우 나머지를 모두 전송한다.
- CLOSE_WAIT: 상대방의 FIN을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알린다
-
ACK를 받은 클라이언트는 FIN_WAIT2 상태로 변한다.
이 때 서버도 CLOSE() 함수를 호출하고 FIN 플래그를 클라이언트에게 전송한 후, LAST_ACK 상태로 대기한다.
- FIN_WAIT2: 자신이 보낸 FIN에 대한 ACK를 받았고, FIN을 기다린다
- LAST_ACK: CLOSE_WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 ACK를 기다리는 상태
-
FIN 플래그를 수신한 클라이언트는 ACK 플래그를 보낸 후 TIME_WAIT 상태로 전환된다.
ACK 플래그를 받은 서버는 CLOSED 상태로 변한다.
TIME-WAIT에서 일정 시간이 지난 클라이언트는 CLOSED 상태로 변한다.
둘 모두 CLOSED 상태로 전환되면 연결은 완전히 종료된다.
- TIME_WAIT: 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이됨 → 혹시 모를 누락된 데이터 패킷을 기다림.
- CLOSED: 연결 수립을 시작하기 전의 기본 상태(연결 없음)
플래그(패킷의 플래그)의 종류

- ACK플래그가 다른 플래그와 같이 출력되는 경우:
3-way handshaking의 2단계, SYN 플래그와 같이 전송된다.