TCP Header

아래 그림은 TCP 헤더의 구조이다.

빨간 네모박스는 TCP-Flag에 해당한다.

 

FLAG 설명
SYN(연결 요청 플래그) - TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷이다. 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는 것에 사용되며, 초기에 시퀀스 번호를 보냄.
ACK(응답 플래그) - 상대방으로부터 패킷을 받았다는 걸 알려주는 패킷.
- ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단하여 재전송하거나 다음 패킷을 전송한다.
- 받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK을 보낸다. (일반적으로 +1 하여 보냄)
FIN(연결종료 플래그) - 세션 연결을 종료 시킬 때 사용되며, 더이상 전송할 데이터가 없음ㅇ르 나타낸다.
RST(연결 재설정 플래그) - 재설정(Reset) 하는 과정이며, 양방향에서 동시에 일어나는 중단 작업이다.
- 비정상적인 세션 연결 끊기에 해당한다.
PSH(밀어넣기) - TELNET과 같은 상호작용이 중요한 프로토콜의 경우 빠른 응답이 중요하여 데이터를 즉시 OSI 7계층으로 전송하도록 하는 FLAG
- 데이터는 버퍼링 없이 바로 위 계층이 아닌 7 계층의 응용프로그램으로 바로 전달한다.
URG(긴급데이터플래그) - Urgent Pointer란 전송하는 데이터 중에서 긴급히 처리해야할 내용이 있을 경우에 사용한다.
- Urgent Pointer가 유효한 것인지를 나타낸다.
Ex) ping 명령어 실행 도중 CTRL + C 입력

 

3 Way HandShaking

TCP는 장치들 사이에 논리적인 접속을 성립(Establish)하기 위해서 핸드쉐이크 방법을 사용한다.

정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.

Client -> Server : TCP SYN

Server -> Client : TCP SYN,ACK

Client -> Server : TCP ACK

SYN = synchronize sequence numbers (연결 요청 플래그)

ACK = acknowledgement (응답 플래그)

 

 

[Step 1]

클라이언트는 서버에 접속을 요청하는 SYN 패킷을 보낸다.

클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 되고, 서버는 Wait For Client 상태이다.

 

[Step 2]

SYN요청을 받고 클라이언트에게 요청을 수락한다는 ACK SYN flag가 설정된 패킷을 발송하고

클라이언트가 다시 ACK으로 응답하기를 기다린다. 서버는 SYN_RECEIVED 상태가 된다.

 

[Step 3]

클라이언트는 서버에 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 된다.

이때의 서버 상태는 ESTABLISHED 이다.

4 Way HandShaking

3 Way HandShaking은 TCP의 연결을 초기화 할 때 사용한다면, 

4 Way HandShaking은 세션을 종료하기 위해 수행되는 절차이다.

 

* 흔히 불리는 Graceful Shutdown (우아한 종료)의 과정이다.

 

Client -> Server : TCP FIN

Server -> Client : TCP ACK

Server -> Client :  TCP FIN

Client -> Server : TCP ACK 

FIN = Finish (연결 종료 플래그)

[Step 1]

클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송한다. 클라이언트는 FIN-WAIT 상태가 된다.

 

[Step 2]

서버는 FIN 플래그를 받고, 확인 메세지 ACK을 보내고 자신의 통신이 끝날때까지 기다리는 CLOSE_WAIT 상태가 된다.

 

[Step 3]

서버가 연결을 종료할 준비가 되면 클라이언트에게 FIN 플래그를 전송한다.

서버의 상태는 LAST-ACK 상태가 된다.

 

[Step 4]

클라이언트가 해지 준비가 되었다는 ACK을 확인했다는 메세지를 보낸다.

클라이언트 상태는 FIN-WAIT -> TIME-WAIT 으로 변경된다.

 

TIME-WAIT 상태란 일정시간(디폴트 : 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거친다.

일정 시간이 지나면 세선을 만료하고 연결을 종료시키며 CLOSED 상태가 된다.

서버/클라이언트를 구축하기 위해선 다양한 모델들을 사용할 수 있다. 

각 모델별 장-단점을 나열해보는 시간을 가져보자.

 

(Linux & Windows 공통)

1. 멀티프로세스 (Multi Process)

* 프로세스란 실행중인 프로그램의 메모리,리소스 등을 총칭하는 의미이다.

- 설명 : fork 함수를 통해 또 하나의 프로세스를 만든다.

- 장점 : 다른 모델과 비교했을 때 크게 장점이 없다. 자식프로세스에서 서비스를 제공하고, 부모프로세스에서는 소켓을 수락하는 역할(Listen 및 Accept)을 한다.

- 단점 : 프로그램이 너무 무거워진다. 프로세스가 여러개가 될 수록 CPU의 짐이 늘어남.

2. 멀티 쓰레드 (Multi Thread)

- 설명 : 멀티 프로세스는 프로세스가 많아질수록 CPU의 과부하가 일어날 수 있다. 멀티 쓰레드 모델은 그런 단점을 보완해줄 수 있는 모델로 클라이언트가 접속할 때마다 쓰레드를 생성하여 쓰레드가 Read/Write를 처리한다.

- 장점 : 멀티프로세스 모델에 비해, CPU 과부하가 적다. 하나의 프로세스에서 여러개의 쓰레드를 활용하는 것이기 때문이다.

- 단점 : 쓰레드가 여러 개 만들어지면, 임계영역에 대한 동기화 등의 방법으로 보호를 해야하고, 복잡성이 생긴다.

3. Select (멀티 플렉싱 I/O 모델)

* 멀티플렉싱이란 ?

- 하나의 프로세스로 여러개의 소켓을 핸들링하는 방법

 

- 설명 : 멀티플렉싱의 대표적인 모델이다. 하나의 프로세스로 최대 1024개의 FD를 관리할 수 있다.(커널 값을 커스텀하면 더 많은 FD 관리도 가능하다.) 

- 장점 : 하나의 프로세스로 여러 소켓을 효율적으로 핸들링 가능하다, 다양한 OS에서 사용 가능한 I/O 모델이다.

- 단점 : 각 FD 이벤트 확인 유무를 전체 For문을 통해 확인해야하기 때문에 비효율적이다. 시간복잡도 : O(n)

 

(Only Linux)

4. Epoll (멀티 플렉싱 I/O 모델) (poll 상위호환)

- 설명 : Select 모델보다 더 발전된 형태로, 다수의 클라이언트를 받아들일 수 있으며,

이벤트가 발생한 FD만 For문으로 체크하면 되기 때문에, 더욱 효율적이다. (시간복잡도 : O(1))

- 장점 : 다수의 클라이언트 수용 가능, 엣지트리거와 레벨트리거로 이벤트발생시점 조절 가능 

- 단점 : 딱히 없는 것 같다. 비교할려면 Windows I/O 모델인 IOCP와 누가 최고의 모델인가 생각해볼만 할 것 같다.

 

(Only Window)

5. WSA (Windows Socket Architecture) 기반 I/O 모델

소켓 I/O 모델 이벤트 통보방식 스레드 수의 제약 여부 Overlapped 구조체 사용 여부
Select FD_SET 제한없음 사용안함
AsyncSelect 윈도우즈 메세지 제한없음 사용안함
EventSelect 이벤트 객체 스레드당 최대 64개 이벤트 처리 제한 사용안함
Overlapped I/O 이밴트 객체/ 커널에서 호출 스레드당 최대 64개 이벤트 처리 제한 사용함
IOCP (Input Output Completion Port) Completion Port 객체 제한 없음 사용함

 

시간복잡도 Time-Complexity란?

시간복잡도는 데이터를 처리하는 과정에 있어서 얼마나 시간이 걸리는 지 확인할 수 있는 지표이다.

알고리즘의 속도를 의미한다. 

대표적으로 빅오(Big-O) 표기법을  사용한다.

 

시간복잡도 그래프

시간복잡도 비교 그래프

제일 빠른 순 부터 나열하면

Excellent/Best

1 O(1) - 일반 배열의 랜덤 Access 등에 해당함. C++ STL의 Array, Vector, List의 Random Access가 이에 해당함. 

 

Good

2 O(log n) - 이진탐색의 시간복잡도에 해당함. STL C++의 Set과 map의 컨테이너에서 find, I/O 등의 시간복잡도에 해당함.

정렬알고리즘에서는 퀵정렬의 시간복잡도에 해당함.

 

Fair

3 O(n) - For문 한 번 돌 때의 시간복잡도에 해당함. STL C++의 Vector에서 find와 I/O 부분의 시간복잡도에 해당함.

 

Bad

4 O(n log n) - 예제 없음. 그냥 이진탐색을 몇(n)번 실행하는것으로 생각하면 될 것 같다.

 

Horrible/Worst

5 O(n^2) - For문 두 번 돌 때의 시간복잡도에 해당함. 정렬 알고리즘 중에서는 삽입정렬,선택정렬, 버블정렬이 이에 해당함.

6 O(2^n) - 재귀로 표현하는 피보나치 수열. 

7 O(n!) - 예제 없음.

+ Recent posts