프로그래밍/리눅스 프로그래밍

[libcurl] libcurl + openssl + multi thread 처리에 대한 고민

jinkwon.kim 2018. 4. 30. 20:55
728x90
반응형

*무단으로 퍼가지 마세요.*


libcurl + openssl + multi thread에 대한 정리


이번 글은 curl을 multi threading 기반으로사용시 발생하는 문제점을 정리 하려고 한다.


1. curl을 multi thread처리가 되어있는가??

 - 내가 생각하는 multi thread라 여러 Thread가 각자의 connection을 만들고 이후 작업을 동시에 수행해야한다.

 - curl 공식 홈페이지에 가보면 "libcurl is thread safe but has no internal thread synchronization:

   libcurl은 쓰레드에 안전하다. 그러나 내부 쓰레드 동기화는 없음(이게 뭔 개소리인지.)

   결국 사용자가 lock걸로 알아서 동기화 해서 쓰라고함

 - 결론 libcurl은 multi Thread를 지원하지 않는다고생각하는게 맞음

 - 참고 https://curl.haxx.se/libcurl/c/threadsafe.html


2. libcurl에서 openssl 아무러 문제가 없는가?

 - 2가지의 문제가 존재함.

 (1). libcurl은 openssl 사용에 제약이 발생한다

   - openssl-1.0.x 버전 사용시 SSLv3를 사용할수 있다. 

   - Openssl-1.1.x 버전 사용시 SSLv3를 사용할수 없다.

   - 결론 SSLv3만 지원하는 곳에 curl를 사용하려면 Openssl-1.0.x버전을 사용해서 libcurl를 사용 해야한다.

 (2). 7.39부터는 Default 설정에서 openssl 3.0이 빼버림

   - 이때문에 7.39이상 버전에서는 사용자가 SSLv3일 경우 따로 처리하게 코딩해야한다.

   - 이글 참조 http://doitnow-man.tistory.com/66?category=676183

   

3. libcurl에서 openssl-1.0.x사용 하여 multi thread를 구현시 아무런 문제가 없는가?

 - 매우 치명적인 문제가 있음. 

 - openssl-1.0.x는 내부적으로 multi thread 처리가 되어있지 않기 때문에 multi thread로 처리시 response에 대해서     충돌이 발생한다.

 - 해결책 

  (1). libcurl에서 muli thread 관련인 interface를 제공한다.

    - 참고 자료 : https://curl.haxx.se/libcurl/c/libcurl-multi.html

  (2). libcurl mult interce를 사용하여 쿼리를 한번에 보낸뒤, select함수로 하나 하나 처리 하는 수밖에 없음 

    - 참고 자료 : https://curl.haxx.se/libcurl/c/10-at-a-time.html

  (3) openssl에서 제공하는 threadlock 함수를 구현해 놓은 

      libcurl의 thread_setup 과 thread_cleanup 를 꼭 사용 해야하한다

    - 참고 자료 https://curl.haxx.se/libcurl/c/opensslthreadlock.html

    - 사용법 간략한 예제

     main ()

{

thread_setup();

for ( int i = 0;i < thread_max_cnt; i++) {

  create 쓰레드 생성

}

thread_cleanup();

}

    

4. 총 정리 

 - libcurl은 자체적으로 multi thread처리가 되어있다고는 하나, openssl의 영향으로 완벽한 multi thread로 동작하지     않는다.

 - libcurl에서 opens-1.0.x버전 사용시 select를 사용하여 multi thread처러 동작하게 구현해야한다. 

 - libcurl에서 opens-1.1.x버전 사용시 multi thread를 완벽하게 구현 할수 있으나, SSLv3를 지원하니 못하는 단점이     발생한다.(치명적인 버그가 많아. SSLv3를 더이상 지원하지 않는다고함)


5. openssl 버전에 따른 구현 방식 도식화 

 - openssl 1.0.x를 사용시 구현해야 하는 방식 

 - select 방식 



 - openssl 1.1.x를 써야 구현 가능한 방식

 - multi threading 방식

 - 단 SSLv3지원 안함



728x90
반응형