*무단으로 퍼가지 마세요.*
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지원 안함
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
[Makefile] Linux Makefile이란?? (2) | 2018.08.27 |
---|---|
[Segfault] 기초 편 : Linux의 Segmentation Fault(Segfault) 분석 방법 (0) | 2018.08.26 |
[메모리] share memory 사용법 (0) | 2018.04.17 |
[libcurl] 사용법 및 connection 유의 사항 (0) | 2018.03.24 |
한글 encoding 차이로 인한 memcmp 및 strncmp 동자 오류 (0) | 2018.03.21 |