소켓 프로그래밍을 해봤다면 이해가 조금 수월할 것이다.
서버의 입장에서는,
- 소켓을 Listen 상태로 전환한다. (LISTEN)
- SYN을 수신하고 SYN+ACK를 송신한다. (SYN RECEIVED)
- ACK를 수신한다. 클라이언트 소켓이 Accept 된다. (ESTABLISHED)
- 데이터를 송수신한다.
- FIN을 수신하고 ACK를 송신한다. (CLOSE WAIT)
- FIN을 송신한다. 소켓을 Close하려 한다. (LAST ACK)
- ACK를 수신한다. 소켓을 Close 한다. (CLOSED)
위의 흐름이 가장 일반적이다.
이는 다이어그램의 파란 선을 따라간 것이고, 회색 선을 따라가면 일반적이지 않은 전이가 보인다.
대표적으로,
- 서버가 먼저 SYN을 송신한다. (SYN SENT)
- 서버가 먼저 FIN을 송신한다. (FIN WAIT 1)
위의 두 전이는 일반적인 전이가 아니다.
특히, 서버가 Active close(그림에는 Open으로 잘못 적혀 있다) 하는 경우는 Time wait으로 인한 자원 낭비가 발생할 수 있으므로 주의해야 한다.
클라이언트의 입장에서는,
- SYN을 송신한다. 서버와의 Connect를 시도한다. (SYN SENT)
- SYN+ACK를 수신하고 ACK를 송신한다. (ESTABLISHED)
- 데이터를 송수신한다.
- FIN을 송신한다. 소켓을 Close하려 한다. (FIN WAIT 1)
- ACK를 수신한다. (FIN WAIT 2)
- FIN을 수신하고 ACK를 송신한다. (TIMED WAIT)
서버보다 비교적 간단한 흐름을 보인다.
재밌는 부분이 있다면 SYN이나 FIN이 동시에 송수신될 수 있다는 것이다.
이를 Simultaneous open/close라고 하던데, 물론 굉장히 드물겠지만 Wireshark에서 마주치게 되면 상당히 당혹스럽지 않을까 싶다. ^^;
'CS > 네트워크' 카테고리의 다른 글
STUN-TURN과 NAT의 관계 (0) | 2023.07.09 |
---|---|
네이글(Nagle) 알고리즘이란? (0) | 2023.05.19 |
2-way handshake를 사용하지 않는 이유? (0) | 2023.04.18 |
와이어샤크로 DHCP 패킷 캡쳐하기 (0) | 2023.03.14 |
내 패킷은 몇 개의 라우터를 거칠까? (0) | 2023.03.08 |
댓글