OSI 7계층과 각 계층의 역할
특징이 다른 여러 호스트를 서로 연결해서 통신하려면 연결 방식을 표준화해야 한다. 국제 표준화 단체인 ISO(International Standard Organization)에서는 OSI(Open System Interconnection) 7계층 모델은 제안하여, 네트워크에 연결된 시스템이 갖추어야 할 기능을 상세히 정의하고 있다. [1]
TCP 3-way HandShake
TCP는 데이터를 전송하기 전에 3-way HandShake 방식을 사용해서 연결을 시도한다.
1. Clinet에서 SYN(Synchronize sequence numbers)를 보내며 연결 설정을 요구한다.
2. 그 후 Server에서 SYN 비트에 대한 ACK(acknowledgment)를 보내며 연결을 수락한다.
3. Server가 보낸 연결 수락 세그먼트에 대한 ACK를 보내며 전송 데이터가 있으며 바로 데이터를 전송한다.
SYN_SENT: Client(로컬)에서 Server(리모트)에게 연결 요청 SYN 플래그를 보낸 상태
SYN_RECV: 요청을 수락하는 ACK와 SYN 플래그를 보내고 다시 ACK를 받기를 기다리는 상태
ESTABLISHED: 서로 연결이 된 상태
TCP 4-way HandShake
3-way HandShake가 연결에 대한 과정이라면 4-way HandShake는 해제에 관한 과정이다. 연결 해제는 양쪽 프로세스의 동의하에 진해되기 때문에 연결 해제 세그먼트를 받은 프로세스가 FIN 플래그로 응답할 때까지 연결은 유지된다. [1]
1. Clinet 쪽이 먼저 연결을 해제(Close)하고자 FIN 플래그를 전송하고 기다린다(FIN_WAIT1).
2. Server는(CLOSE_WAIT)으로 상태가 바뀌며 FIN 플래그에 대한 ACK를 보내며 Clinet에게 Close를 요청한다.
3. ACK를 받은 Clinet은(FIN_WAIT2)로 변경된다.
4. Server는 종료 프로세스를 진행하고 FIN을 Client에게 보내(LAST_ACK) 상태로 바뀐다.
5. FIN을 받은 Client는 ACK를 서버에 다시 전송하고(TIME_WAIT) 상태로 바뀌며 일정 시간이 지나면 (Close)가 되며 ACK를 받은 서버도 (Close)가 된다. [4]
FIN_WAIT1: 최초 보낸 FIN에 대한 ACK를 기다리고 있는 상태
CLOSE_WAIT: FIN 플래그를 받고 FIN에 대한 ACK를 보낸 상태
FIN_WAIT2: SERVER의 FIN 플래그를 기다리고 있는 상태
LAST_ACK: 보낸 FIN 플래그에 대해 ACK를 기다리고 있는 상태
TIME_WAIT: 지연 패킷이나 원격의 연결이 닫혔는지 확인하기 위해 대기하는 상태
CLOSE: 연결 종료
후기
OSI 7계층을 계속 까먹어서 정리하였고 3-way와 4-way의 개념을 다시 간단하게 확립했다.
출처 및 레퍼런스
[1] [박기현][쉽게 배우는 데이터 통신과 컴퓨터 네트워크]: 한빛아카데미
[2] [SlidePlayer]https://slideplayer.com/slide/7814134/
[3] [Wiki] https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95
[4] [Kakao Tech] https://tech.kakao.com/2016/04/21/closewait-timewait/
'게임서버(Game Server)' 카테고리의 다른 글
[게임서버] Boost/Asio 바뀐 API (저장용) (0) | 2021.06.02 |
---|---|
[게임서버] IOCP Page-Locking (0) | 2020.12.05 |
[게임서버] Socket pool와 DisconnectEx-IOCP (0) | 2020.05.29 |
[게임서버] AcceptEx와 ConnectEx-IOCP (1) | 2020.05.14 |
[게임서버] AcceptEx와 ConnectEx (0) | 2020.05.13 |