SMB Large_readx관련하여 질문 드립니다.
SMB프로토콜을 사용해 리눅스 서버와 윈도우 클라이언트간 공유시 Large_readx 관련하여 몇일째 삽질중입니다.
여기저기 많은 자료를 찾아 해결하려 했지만 많은 어려움을 겪고 있습니다.(영어 울렁증이 가장 크네요..ㅜㅜ)
테스트 환경은 아래와 같습니다.
Server OS : RHEL5.2(Kernel 2.6.18-92)
Client OS : Window XP professional
Samba Version : samba-3.2.4
SMB Dialect : NT LM 0.12
SMB프로토콜을 이용하여 데이터 전송시 Server에서는 Client에서 요청한 파일 size만큼만 데이터를 전송하고 있는데,
제가 테스트 중인 Client에서는 Large_readx를 지원하지 않아 매 요청시 64KByte를 limit로 데이터를 요청합니다.
(현재 Client에서 SMB_COM_READ_ANDX(0x2e)시 max_count_low의 parameter값만 사용합니다. max_count_high Parameter를 사용하여 64KByte이상의 데이터를 보낼수 있다고 알고 있는데.. Window Client에서 Large_readx를 지원하지 않아서 인지 max_count_high parameter를 사용하지 않고 있습니다.)
이로 인해 Server에서는 데이터 전송시, 세션 생성후 Client가 요청한 size만큼의 데이터 앞에 SMB Header를 붙여 약 60KByte정도의 size로 데이터를 전송합니다. 한 예로 1MByte size의 데이터를 전송시 약 16번의 Client의 요청이 있어야 서버에서 데이터 전송을 완료할 수 있습니다.
위 내용의 문제를 개선하기위한 한가지 방법은 Client에서 한번의 요청에 서버에서 보내는 데이터의 Size를 늘리면 된다는게 제 짧은 소견입니다. 이를 위해 아래의 궁금사항에 고수님들의 한마디 조언을 부탁드립니다.
1. Client에서 SMB_Header에 명시된 Max Count High필드를 이용하여 64KByte이상의 데이터를 요청할 수 있도록 하려면 어떤 방법이 있는지?
2. 현 samba서버와 WindowXP Client 사이에서는 NT LM 0.12의 SMB Dialect를 사용하는고 있습니다. 제가 테스트한 WindowXP SMB Client에서는 Large_readX, Large_writeX, Lagre_file을 지원하지 않는데, 어떻게 지원 가능하도록 설정하는지?
Ethereal을 사용하여 SMB통신시 Packet캡쳐한 내용 및 간단한 분석을 첨부파일로 올려드립니다.
짧은 한마디 조언에 목말라 있습니다. 부탁드립니다.
첨부 | 파일 크기 |
---|---|
![]() | 81 KB |
samba-tng 에서 win32 용
samba-tng 에서 win32 용 smbclinet 를 받아서 -b 옵션을 테스트해보고,
원하는게 그 기능이라면 smbclient 소스를 보면 되겠습니다.
OTL
답변 정말
답변 정말 감사드립니다.
bushi님께서 말씀한신대로 smbclient로 -b옵션을 줘서 테스트를 해보았습니다.
-b옵션은 send buffer사이즈를 달리하면서 보낼시 쓰는 옵션인데요.
-b옵션으로 buffer를 설정시 SMB_COM_READ_ANDX요청시 MaxCountHigh필드를 사용하여 size를 늘리지는 않고,
여러개의 SMB_COM_READ_ANDX SMB요청 메세지를 한프레임으로 만들어 한번에 서버로 보냅니다.
(-b옵션으로 buffer size를 160k로 설정할시 16k데이터 SMB요청메세지10개를 한 프레임으로 만들어 서버로 보냅니다.)
이러면 패킷의 오버헤드는 상당량 줄일수 있을듯 하네요. 문제는 이런 기능을 WindowXP client에 어찌 적용을 시키나요.
smbclient를 따로 제공 하는 수 밖에는 없나요? 아직까지 MaxCountHigh필드의 미련을 못 버리겠어요...ㅜㅜ
다시 한번 답변에 진심으로 감사드립니다.
더이상 삽으로 팔 곳이 없는 그날을...
댓글 달기