CS & Algorithm/CS

[CS]프로세스와 스레드 , TCP의 3-way handshake

eunkonge 2026. 8. 18. 13:02

1. 프로세스와 스레드

1. 프로세스란?

프로그램을 실행 시켜 정적인 프로그램이 동적으로 변해 프로그램이 돌아가고 있는 상태

= 컴퓨터에서 작업 중인 프로그램

 

프로세스의 구조
프로그램이 실행되어 프로세스가 만들어지면 4가지의 메모리 영역으로 구성

코드 영역 (Code / Text) : 개발자가 작성한 프로그램 코드가 CPU가 해석 가능한 기계어 형태로 저장
데이터 영역 (Data) : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있는 곳

힙 영역 (Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터를 위한 공간
스택 영역 (Stack) : 지역 변수 같은 호출한 함수가 종료되면 되돌아올 임시 자료를 저장하는 독립된 공간

 

프로세스 자원 공유 방법

  1. IPC(Inter-Process Communication) 사용
  2. LPC(Local inter-Process Communication) 사용
  3. 별도의 공유 메모리 사용

2. 스레드란?

하나의 프로세스 안에서 동시에 진행되는 작업 갈래, 흐름 단위

 

스레드 특징

  • 스레드끼리 프로세스의 자원을 공유 => 동시 작업이 가능
  • 스레드는 프로세스의 Stack만 할당받아 복사, Code, Data, Heap은 프로세스내 다른 스레드들과 공유
구분 프로세스 스레드
실행 단위 실행 중인 하나의 프로그램 프로세스 내부의 실행 흐름
메모리 프로세스마다 독립적인 메모리 공간 Code, Data, Heap 공유
Stack 프로세스마다 존재 스레드마다 독립적으로 존재
자원 공유 IPC 등 별도 방법 필요 공유 메모리로 쉽게 가능
생성 및 전환 비용 상대적으로 큼 상대적으로 작음
안정성 다른 프로세스의 영향을 적게 받음 하나의 스레드 문제가 프로세스 전체에 영향을 줄 수 있음

3. 멀티 프로세스와 멀티 스레드

멀티 프로세스 : 하나의 작업을 여러 프로세스를 이용해 처리하는 방식
멀티 스레드 : 하나의 프로세스 안에서 여러 스레드가 동시에 작업을 수행하는 방식
=> 공유 자원에 여러 스레드가 동시에 접근할 수 있기 때문에 동시성 문제를 고려해야 함.

4. 멀티스레드에서 동시성 문제가 발생하는 이유

여러 스레드가 같은 프로세스의 Code, Data, Heap을 공유 => 여러 스레드가 동시에 읽고 수정하면 실행 순서에 따라 예상치 못한 결과를 초래할 수 있다.

두 스레드가 동시에 count 값을 1 증가시킨다고 해보자.

count = 0

Thread A: count 읽기 → 0
Thread B: count 읽기 → 0

Thread A: 0 + 1 → count = 1
Thread B: 0 + 1 → count = 1

여러 스레드가 공유 자원을 동시에 접근하면서 실행 순서에 따라 결과가 달라지는 상황을 Race Condition(경쟁 상태)라고 한다. => 한 번에 하나의 스레드만 접근하도록 제어하는 동기화가 필요
자바에서는 synchronized , Lock, AtomicInteger 등의 Atomic 클래스를 사용할 수 있음

2. TCP 3-Way Handshake

1. TCP 3-Way Handshake란?

TCP / IP 프로토콜을 이용해 통신을 하는 응용 프로그램이 데이터를 전송하기 전 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 방식
과정

  1. Closed : 연결 시도 전 Client, Server의 상태 / TCP 포트가 닫혀진 상태
  2. Listen : TCP 포트가 열려 있고 연결 요청을 대기하는 상태
  3. Syn-Sent(Client) : Client가 Server에게 연결을 요청하는 SYN 패킷 전송(임의의 값 seq(100) 넘버를 함께 전송)
  4. Syn-Receved(Server) : SYN 패킷을 받은 Server는 요청을 수락하게 되면 SYN+ACK 패킷을 전송하며 응답 (임의의 값 seq(200) 넘버 전달, Client로부터 전달 받은 seq(100)+1을 한 ack(101) 넘버 전달)
  5. Established(Client) : Server의 SYN+ACK를 수신한 Client는 ACK 패킷을 Server에 전송하고 ESTABLISHED 상태로 전환
  6. Established(Server) : Client의 ACK를 수신한 Server도 ESTABLISHED 상태로 전환

왜 3-Way 인가?
클라이언트와 서버가 서로 양방향 통신이 가능한 상태인지 확인해야하기 때문!

만약 2-Way Handshake 까지만 진행된다고 가정하자

Client → Server : SYN
Client ← Server : SYN + ACK

 

여기까지 진행하면 클라이언트 입장에서는
"내가 보낸 SYN이 서버에 정상적으로 도착했다."

"서버가 보낸 SYN도 나에게 정상적으로 도착했다." 는 것을 확인할 수 있다.

 

서버 입장에서는 자신이 보낸 SYN + ACK가 클라이언트에게 정상적으로 도착했는지는 알 수 없다.
따라서 마지막으로 클라이언트가 ACK를 한 번 더 전송

Client → Server : SYN
Client ← Server : SYN + ACK
Client → Server : ACK

 

마지막 ACK를 서버가 수신하면 서버 역시 자신이 보낸 패킷이 클라이언트에게 정상적으로 도착했고, 클라이언트가 응답할 수 있는 상태임을 확인할 수 있다.