TCP IP 파이썬 활용

TCP 소켓 서버/클라이언트 구현 - 기초 개념 다지기

웹하는빡통 2020. 6. 15. 18:58

지난 시간에는 파이썬을 이용하여 간단하게 UDP 소켓에 대해 공부하였다. 이번에는 TCP 소켓에 대해 알아보자.

TCP 방식은 UDP 방식보다 상대적으로 비교할때 조금 복잡한 구조이다.

바로 3단계 연결 설정(3-way Handshaking)이 필요하기 때문이다. 이와 같이 TCP 방식으로 서버와 클라이언트를 구현하기 위해서는 무엇보다 3단계 연결 설정을 고려해야 한다.

서버 측에서는 listen() 함수와 accept() 함수를 통해 이러한 과정을 구현하고

클라이언트 측에는 connect() 함수를 통해 이러한 과정을 구현한다. 

아울러 3단계 연결 이전과 이후를 구분해 3단계 이전에는 부모 프로세스가 일련의 과정을 처리하지만

3단계 연결 이후에는 자식 프로세스가 일련의 처리 과정을 처리한다는 점도 기억해야 한다. 

 

먼저 TCP 소켓 서버 구현 순서이다.

1. socket() 함수를 이용해 소켓 객체 생성

2. IP 주소 설정

3. 포트 번호 설정

4. bind() 함수를 이용해 IP 주소와 포트 번호의 연동(Binding)

5. listen() 함수를 이용해 3단계 연결 과정 구현

6. accept() 함수를 이용해 3단계 연결 이후 과정 구현

7. 소켓 서버의 동작 과정 구현 

8. close() 함수를 이용해 자식 프로세스 소켓 객체 종료

9. close 함수를 이용해 부모 프로세스 소켓 객체 종료

 

아까 말했듯이 TCP 소켓 서버에는 listen() 함수와 accept() 함수를 이용해 3단계 연결을 구현하는 과정이 필요하다.

아울러 accept() 함수 실행까지는 부모 프로세서의 소켓 객체가 일련의 작업을 수행하지만, 

accept() 함수 실행 이후부터는 자식 프로세스의 소켓 객체가 일련의 작업을 수행한다는 점도 기억할 필요가 있다.

따라서 소켓 객체 종료도 자식 프로세스를 종료한 뒤 부모 프로세스를 종료해야 한다.

만약 부모 프로세스를 먼저 종료하면, 아시다시피 자식 프로세스가 고아 프로세스로 전략하기 때문에 순서에 특히 신경써야 할 필요가 있다. 

 

TCP Server 코드 설명. 

TCP/IP 기반의 소캣 객체 parent 생성한다. 이때 소켓 객체 parent는 부모 프로세스이다

 

listen()함수는 udp 서버에는 없다 3단계 연결 설정에 따라 동작하는 tcp클라이언트로부터 연결 요청을 기다리겠다는 의미이다. 여기서 10 10대의 tcp 클라이언트 대상으로 동시 접속이 가능하다. 

 

accept() 함수 역시도 udp 소켓 서버에는 없다 accept()함수는 3단계 연결을 수행한 뒤 새로운 소켓 객체 child_process와 주소(IP 주소와 포트 번호)를 튜플 타입으로 반환한다 이때 accept() 함수 실행까지는 부모 프로세서인 소켓 객체 parent가 일련의 작업을 수행하고 accept() 함수 실행 이후로부터 자식 프로세스인 소켓 객체 child일련의 작업을 수행한다.이와 같은 방식을 다중 할당 방식이라고 한다. 

 

전체 코드.

 

다음은 TCP 클라이언트 부분이다. 다음과 같은 순서로 구성된다.

1. socket() 함수를 이용해 소켓 객체 생성

2. IP 주소 설정

3. 포트 번호 설정 

4. bind() 함수를 이용해 IP 주소와 포트 번호 연동

5. connect() 함수를 이용해 3단계 연결 구현

6. 소켓 클라이언트의 동작 과정 구현

7. close() 함수를 이용해 소켓 객체 종료  

 

TCP 클라이언트에서는 connect() 함수를 이용하는 내용이 나온다. 이때 TCP 클라이언트의 connect() 함수는

TCP 서버의 accept() 함수와 쌍을 이룬다. 

 

TCP Client 코드 설명. 

connect() 함수는 UDP 클라이언트에는 없다. connect() 함수는 TCP 서버 측 accept() 함수의 대응 관계를 이루면서 일련의 3단계 연결 설정을 수행한다. 

 

전체 소스 코드.

 

TCP 소켓 동작 과정을 정리하자면 TCP 서버는 listen()함수를 통해 TCP Client로부터 3단계 연결 설정을 기다린다.

TCP 클라이언트는 Connect() 함수를 이용해 TCP 서버와 3단계 연결을 시작한다. 그러면 TCP 서버의 accept() 함수가 3단계 연결을 처리해 상호간에 연결을 확립한다. 이때 TCP 서버는 accept() 함수 처리까지 부모 프로세스가 담당하며, 이후부터는 자식 프로세스가 담당한다. 이해하기 쉽게 아래 사진을 보면 더 이해하기 쉬울 것이다. 

 

 

실행결과.

실행 순서는 TCP 서버 코드를 먼저 실행 후 클라이언트 코드를 실행하면 다음과 같은 결과가 나온다.