Protocols/MSNP/MSNC/P2Pv2 Headers: Difference between revisions
m (1 revision imported) |
Animadoria (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
{{Protocols/MSNP | {{Protocols/MSNP | ||
|section=MSNC}} | |||
=P2Pv2 Binary Headers (from MSNP16)= | =P2Pv2 Binary Headers (from MSNP16)= |
Latest revision as of 19:14, 11 May 2022
MSNP Protocol |
MSNC |
Overview • MSNObject |
Client Capabilities |
P2P protocol |
Transports • MSNSLP |
Headers |
P2Pv1 Binary headers |
P2Pv2 Binary headers |
Transfers |
Display Pictures |
Custom Emoticons |
File Transfer |
Overview |
Introduction • Terms • Clients |
Reference |
Error List • Commands • Relying Party Suite • Spotlife |
Services |
XMPP • HTTP Gateway • Tabs • Activities |
Documentation |
Development Tools • MSNP Grid |
Polygamy • URLs used by MSN |
Documents |
Protocol Versions |
Version 21 |
Version 18 |
Version 16 |
Version 15 |
Version 14 |
Version 13 |
Version 12 |
Version 11 |
Version 9 |
Version 8 |
Version 2 |
MSNC |
Introduction • P2P • Object Descriptor • Display Pictures • File Transfer |
Scenarios |
Microsoft Messenger for Mac |
MSNP on WebTV (MSNTV) |
P2Pv2 Binary Headers (from MSNP16)
When the client Alice logs in using MSNP18, and starts a session to another WLM 2009 client Bob (I believe Alice knows the client type of Bob by the GUID that is attached to the email in Bob's JOI command) then the file transfer binary header is substantially changed.
All data is Big Endian. The binary header size is dynamic - It can be between 8(0x08) and 252(0xfc). The new P2P protocol always has header and message part is optional. Ex: Ack packets haven't message part.
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |L|O|Len|Base ID|if L>8 then TLVs = read(L - 8) else skip .... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | if Len > 0 then Payload = (DH and D) else skip .... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
For all of them - (DWORD is a 32-bit, 4 byte, unsigned integer and QWORD is 64 bits, 8 bytes.)
1 | BYTE | HL | Length of header. |
2 | BYTE | OP | Operation code. 0: None, 2: Ack, 3: Init session. |
3 | WORD | ML | Message length without header length. (but included the header's message length) |
4 | DWORD | BaseID | Initially random (?) To get the next one add the payload length. |
TLVs | BYTE[HL-8] | TLV Data | TLV list consists of TLV-encoded pairs (type, length, value). A whole TLV list is padded with zeros to fit 4-byte boundary. TLVs: T=0x1(1) L=0xc(12): IPv6 address of sender/receiver. T=0x2(2) L=0x4(4): ACK identifier. |
DH | DHL | Data Header |
BYTE DHL: Data header length BYTE TFCombination: 0x1=First, 0x4=Msn object (display picture, emoticon etc), 0x6=File transfer WORD PackageNumber: Package number DWORD SessionID: Session Identifier BYTE[DHL-8] Data packets TLVs: if (DHL>8) then read bytes(DHL - 8). T=0x1(1) L=0x8(8): Data remaining. |
D | ML-DHL | Data Packet | SLP messsage or data packet |
F | DWORD | Footer | The footer. |
Examples
First P2P message
H: 18 03 05 4e 13 63 d5 a0 01 0c 00 02 00 00 00 0e 76 2d 0f 01 00 00 00 00 DH: 08 01 00 00 00 00 00 00 D: SLPMessage
All type of header has the follow fields:
1 | 0x18 | Length of header | 24 |
2 | 0x03 | Operation code | Initialize session. |
3 | 0x05 0x4e | Size of message | 1358 = 1350+8(0x08) |
4 | 0x13 0x63 0xd5 0xa0 | Base ID | The next Base ID += Size of message |
TLVs | 01 0c 00020000 000e762d 0f010000 (00 00) | TLV data | TLV = 24 - 8 = 16 bytes. T=01,L=12,V=00020000 000e762d 0f010000. (00 00 = Padded with zeros to fit 4-byte boundary.) |
DH | 08 01 00 00 00 00 00 00 | Data Header |
08=DataHeaderLength 01=TFCombination 00 00=PackageNumber 00 00 00 00 = Session ID No TLV because DataHeaderLength - 8 = 0. |
D | SLP | SLP | SLP Message |
An acknowledgement
H: 08 02 00 00 93 e7 20 56 DH: (no data) D: (no data) F: 00 00 00 00
1 | 0x08 | Length of header | 8 |
2 | 0x02 | Operation code | Acknowledgement |
3 | 0x00 0x00 | Size of message | 0 |
4 | 0x93 0xe7 0x20 0x56 | Base ID | AckIdentifier = Base ID + Size of Message |
TLVs | (No tlv data) | TLVs | Length of header <= 8, so no TLVs in this sample package. |
DH | (no data) | Data Header | Size of message is 0. |
D | (no data) | Data | Size of message is 0. |
F | 0x00 0x00 0x00 0x00 | Footer | Footer is 0 (always). |
File Transfer
H: 08 00 05 70 13 63 da ee DH: 14 07 00 00 d1 c5 26 da 01 08 00 00 00 00 00 02 04 1c 00 00 D: ...
1 | 0x08 | Length of header | 8 |
2 | 0x00 | Operation code | None |
3 | 0x05 0x70 | Size of message | 1392 = 1372+20(0x14) |
4 | 0x13 0x63 0xda 0xee | Base ID | The next Base ID += Size of message |
TLVs | (No tlv data) | TLVs | Length of header <= 8, so no TLVs in this sample package. |
DH | 14 07 0000 d1c526da 01 08 00000000 0002041c 0000 | Data Header |
0x14(20)=DataHeaderLength 0x07=TFCombination(The first file transfer message. 0x06 is all other file transfer message) 0x00 0x00=PackageNumber 0xd1 0xc5 0x26 0xda = Session ID from SLP TLVs = 20-8=12 bytes. T(01) L(08) V(00 00 00 00 00 02 04 1c - data remaining) Padding(00 00) |
D | Data | Data | File data |
Display Picture
H: 08 00 05 70 03 a3 da ee DH: 14 05 00 00 d1 c5 26 dc 01 08 00 00 00 00 00 00 34 f5 00 00 D: ...
1 | 0x08 | Length of header | 8 |
2 | 0x00 | Operation code | None |
3 | 0x05 0x70 | Size of message | 1392 = 1372+20(0x14) |
4 | 0x03 0xa3 0xda 0xee | Base ID | The next Base ID += Size of message |
TLVs | (No tlv data) | TLVs | Length of header <= 8, so no TLVs in this sample package. |
DH | 14 05 0000 d1c526da 01 08 00000000 000034f5 0000 | Data Header |
0x14(20)=DataHeaderLength 0x5=TFCombination(The first display picture message. 0x04 is all other display picture message) 0x0 0x0=PackageNumber 0xd1 0xc5 0x26 0xda = Session ID from SLP TLVs = 20-8=12 bytes. T(01) L(08) V(00 00 00 00 00 00 34 f5 - data remaining) Padding(00 00) |
D | Data | Data | Picture data |
For more information
P2Pv1 and P2Pv2 Header Definitions
Binary header research on MSNC10 (The new P2P protocol used in WLM 2009 and MSNP18)