COM+의 내보내기 기능은 다른 machine에 존재하는 COM object를 호출할 수 있도록 합니다. 그러므로, DCOM 통신을 사용하는 대표적인 분산처리 mechanism입니다. DCOM 통신의 하부에는 RPC(or MSRPC)가 존재합니다. 보통, 이러한 DCOM 호출에 문제가 발생했을 때, 1) RPC통신이 가능한지, 2) COm Object 에 Crash나 Hang 이 존재하는 지.. 를 Check하게 됩니다. 지금 언급할 내용은 RPC 통신에 문제가 없는 지를 알아볼 것입니다. 먼저, 몇가지 용어에 익숙해질 필요가 있습니다.
EndPoint --> 이것은 Network안에 서비스가 존재하는 위치라고 보시면 됩니다.
EndPoint Mapper는 동적으로 Client와 서비스가 존재하는 서버사이에 bind, setup, tear-down을 허용하는 역활을 합니다.
COM+ DLLHost와 같은 서버와 이를 Proxy를 통해 호출하는 Client사이에 EndPoint는 135번 Port를 사용합니다. RPC Endpoint Mapper는 svchost process중 RPCSS 라는 놈을 hosting하는 Procee가 됩니다.
Debugging tools for microsoft에서 제공하는 tlist를 통해서, 확인해 보면 다음이 rpcss를 hosting하는 Process입니다.
0 32 1056 svchost.exe Svcs: RpcSs
Command Line: C:WINDOWSsystem32svchost -k rpcss
그러므로, Client가 proxy를 통해서, Server의 COM object를 호출하기 시작할 netmon 데이타를 보면 다음과 같습니다.
(tcp handshaking은 생략하고..)
1. RPC Bind.
7 5.625000 000BDB72E909 00065B7CEA9B MSRPC c/o RPC Bind: UUID 000001A0-0000-0000-C000-000000000046 call 0x3 assoc grp 0x0 xmit 0x16D0 recv 0x16D0 157.60.8.178 157.60.8.145 IP (port 135)
2. RPC Bind Ack.
10 5.625000 00065B7CEA9B 000BDB72E909 MSRPC c/o RPC Bind Ack: call 0x3 assoc grp 0xB59D xmit 0x16D0 recv 0x16D0 157.60.8.145 157.60.8.178 IP
135 port가 열렸다면, 정상적으로 Bind Ack가 올겁니다. 아니라면, 135 port에 문제가 있는 것입니다. UUID 000001A0-0000-0000-C000-000000000046 는 IRemoteSCMActivator 라고 불리는 놈입니다. 이것은 RPCSS와 연관이 있으며, RPCSS를 통해서, COM Object를 hosting 하는 dllhost process를 Launching 하게도 하고, remote method call도 가능하게 하는 시발이 됩니다..
binding이 되면, 해당 interface에서 제공하는 method를 Call하게 됩니다. 먼저, Server의 동적 Port를 통해서, Client가 rpc 통신을 해야 하기 때문에 서버이름, port, ip등의 정보를 제공받아야 합니다. 그것에 대한 request/response의 packet은 다음과 같습니다.
3. Request.
13 5.640625 000BDB72E909 00065B7CEA9B MSRPC c/o RPC Request: call 0x3 opnum 0x4 context 0x1 hint 0x318 157.60.8.178 157.60.8.145 IP (port 135)
** opnum 04는 서버의 instance를 생성합니다.
4. Response.
14 5.812500 00065B7CEA9B 000BDB72E909 MSRPC c/o RPC Response: call 0x3 context 0x1 hint 0x4E0 cancels 0x0 157.60.8.145 157.60.8.178 IP
. . . .
00380: 00 00 C5 00 6A 00 07 00 62 00 79 00 75 00 6E 00 ..Å.j...b.y.u.n.
00390: 67 00 63 00 6B 00 32 00 2E 00 66 00 61 00 72 00 g.c.k.2...f.a.r.
003A0: 65 00 61 00 73 00 74 00 2E 00 63 00 6F 00 72 00 e.a.s.t...c.o.r.
003B0: 70 00 2E 00 6D 00 69 00 63 00 72 00 6F 00 73 00 p...m.i.c.r.o.s.
003C0: 6F 00 66 00 74 00 2E 00 63 00 6F 00 6D 00 5B 00 o.f.t...c.o.m.[.
003D0: 31 00 37 00 35 00 37 00 5D 00 00 00 07 00 31 00 1.7.5.7.].....1.
003E0: 35 00 37 00 2E 00 36 00 30 00 2E 00 38 00 2E 00 5.7...6.0...8...
003F0: 31 00 34 00 35 00 5B 00 31 00 37 00 35 00 37 00 1.4.5.[.1.7.5.7.
00400: 5D 00 00 00 07 00 31 00 39 00 32 00 2E 00 31 00 ].....1.9.2...1.
00410: 36 00 38 00 2E 00 32 00 31 00 35 00 2E 00 31 00 6.8...2.1.5...1.
. . . .
packet를 대략 보면 알겠지만, 1757 port를 동적으로 받았습니다. 이 port를 통해서 RPC 통신이 발생할 것입니다.
보통, RPC는 이와같은 pattern을 갖습니다. bind/bind ack/request/response. . ..
그 이후에는 proxies와 stubs에서 사용되는 interface를 bind하고 여차여차 진행됩니다.
(Bind)
31 5.875000 000BDB72E909 00065B7CEA9B MSRPC c/o RPC Alt-Cont: UUID 00000143-0000-0000-C000-000000000046 call 0x1 assoc grp 0x0 xmit 0x16D0 recv 0x16D0 157.60.8.178 157.60.8.145 IP (port 1757)
-- remote에서 사용되는 IUnknown Interface 라고 보면 됩니다..
(Bind Ack)
10 5.625000 00065B7CEA9B 000BDB72E909 MSRPC c/o RPC Bind Ack: call 0x3 assoc grp 0xB59D xmit 0x16D0 recv 0x16D0 157.60.8.145 157.60.8.178 IP
만일, Object가 Create된것 같은 데, 그 다음이 안된다라면, 1757 port가 열리지 않았을 수 있습니다. 그러므로, Netmon data를 확인해 보면, 그 다음 Packet의 Bind가 정상적이지 않을 것입니다. Firewall이 있거나 Ristrict port range를 사용하게 되면, RPC를 위한 동적 port가 부족할 수도 있는 데, 그러한 환경을 Check 해 봐야 합니다.
방화벽에 사용할 RPC 동적 포트 할당을 구성하는 방법
http://support.microsoft.com/kb/154596/
http://support.microsoft.com/kb/179442/ko