<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.nina.chat/index.php?action=history&amp;feed=atom&amp;title=Protocols%2FMSNP%2FMSNC%2FMSNSLP</id>
	<title>Protocols/MSNP/MSNC/MSNSLP - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.nina.chat/index.php?action=history&amp;feed=atom&amp;title=Protocols%2FMSNP%2FMSNC%2FMSNSLP"/>
	<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNC/MSNSLP&amp;action=history"/>
	<updated>2026-06-26T13:28:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNC/MSNSLP&amp;diff=4292&amp;oldid=prev</id>
		<title>Animadoria at 19:11, 11 May 2022</title>
		<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNC/MSNSLP&amp;diff=4292&amp;oldid=prev"/>
		<updated>2022-05-11T19:11:16Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:11, 11 May 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Protocols/MSNP&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/MSNC_Navigation&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Protocols/MSNP&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|section=MSNC&lt;/ins&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=MSNSLP=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=MSNSLP=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Animadoria</name></author>
	</entry>
	<entry>
		<id>https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNC/MSNSLP&amp;diff=2533&amp;oldid=prev</id>
		<title>AD: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNC/MSNSLP&amp;diff=2533&amp;oldid=prev"/>
		<updated>2020-05-29T00:23:39Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:23, 29 May 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki-wiki_:diff:1.41:old-2532:rev-2533 --&gt;
&lt;/table&gt;</summary>
		<author><name>AD</name></author>
	</entry>
	<entry>
		<id>https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNC/MSNSLP&amp;diff=2532&amp;oldid=prev</id>
		<title>AD at 02:14, 21 December 2010</title>
		<link rel="alternate" type="text/html" href="https://wiki.nina.chat/index.php?title=Protocols/MSNP/MSNC/MSNSLP&amp;diff=2532&amp;oldid=prev"/>
		<updated>2010-12-21T02:14:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Protocols/MSNP/MSNC_Navigation}}&lt;br /&gt;
&lt;br /&gt;
=MSNSLP=&lt;br /&gt;
&lt;br /&gt;
With MSN Messenger 6 a new sort of protocol is introduced and is based on SIP (Session Initiation Protocol). SIP is explained in [http://www.ietf.org/rfc/rfc2543.txt RFC2543]. MSNSLP is pretty much the same as SIP, but supports less request methods.&lt;br /&gt;
&lt;br /&gt;
MSNSLP uses only the INVITE, BYE, and ACK methods, the latter only used in messages with content type &amp;lt;code&amp;gt;application/x-msnmsgr-transudpswitch&amp;lt;/code&amp;gt;. If you are sending an unknown method, then the other client only sends its BaseIdentifier and nothing else after it.&lt;br /&gt;
&lt;br /&gt;
==MSNSLP structure==&lt;br /&gt;
&lt;br /&gt;
MSNSLP messages follow this structure:&lt;br /&gt;
&lt;br /&gt;
*start line\r\n&lt;br /&gt;
*message-header-1: header value 1\r\n&lt;br /&gt;
*message-header-2: header value 2\r\n&lt;br /&gt;
*...&lt;br /&gt;
*message-header-n: header value n\r\n&lt;br /&gt;
*\r\n&lt;br /&gt;
*message body of zero or more bytes&lt;br /&gt;
*NUL (\0)&lt;br /&gt;
&lt;br /&gt;
===Start Line===&lt;br /&gt;
&lt;br /&gt;
If it is a request, the start line will be a request line and will look like this:&lt;br /&gt;
&lt;br /&gt;
 method ''SPACE'' MSNMSGR:buddy@mail.com ''SPACE'' version ''\r\n''&lt;br /&gt;
&lt;br /&gt;
The '''method''' field is either INVITE to start a session and BYE to end a session. If you receive a second INVITE message in a session, then it's used to change the session parameters, you should accept it if everything is okay.&lt;br /&gt;
&lt;br /&gt;
The '''version''' is currently ''MSNSLP/1.0''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When not a request, the start line is a status line consisting of the protocol version followed by a numeric status code and its associated textual phrase, with each element separated by space characters.&lt;br /&gt;
&lt;br /&gt;
 version ''SPACE'' status code ''SPACE'' reason phrase ''\r\n''&lt;br /&gt;
&lt;br /&gt;
The '''status code''' is a 3-digit integer result code that indicates the outcome of the attempt to understand and satisfy the request. Your client must read the status code to determine whether this is a 200 OK or for example a 404 not found.&lt;br /&gt;
&lt;br /&gt;
===Message Header===&lt;br /&gt;
&lt;br /&gt;
Among the message headers are always in the following order these:&lt;br /&gt;
&lt;br /&gt;
*The '''To''' and '''From''' fields contain the email addresses of the receiver and the sender in the following format: ''&amp;lt;msnmsgr:mail@hotmail.com&amp;gt;'' where mail@hotmail.com is the email address of a person. Also this line makes clear that the user is using MSN Messenger, which can be determined on the &amp;quot;msnmsgr&amp;quot; part.&lt;br /&gt;
&lt;br /&gt;
*The '''Via''' field indicates what path was taken by the request, it's always ''MSNSLP/1.0/TLP ;branch={BranchUID}'' where &amp;quot;MSNSLP/1.0&amp;quot; is the protocol used and it's version and &amp;quot;{BranchUID}&amp;quot; is the unique identifier for that message.&lt;br /&gt;
&lt;br /&gt;
*The '''CSeq''' field is the &amp;quot;Command Sequence&amp;quot; field, most of the time this fields value is 0, but when you receive an incoming INVITE, you should always reply with the CSeq field of the incoming INVITE plus 1.&lt;br /&gt;
&lt;br /&gt;
*The '''Call-ID''' field uniquely identifies a particular invitation, and the Call-ID's of all other requests and responses to this user should have the same value. This fields value should be a GUID, but after some research I saw that it could have any value also non-GUID look-a-like values.&lt;br /&gt;
&lt;br /&gt;
*The '''Max-Forwards''' field may be used to limit the number of proxies or gateways that can forward the request to the next underlying server. But at the moment it isn't used by the MSN Messenger 6 client and servers, I think it can be used when Microsoft introduces its new Office Live Communications Server codenamed Greenwich. But at the moment the value is always zero.&lt;br /&gt;
&lt;br /&gt;
*The following line is the '''Content-Type''' line and specifies of which type the content is. For requests it can have the value ''application/x-msnmsgr-sessionreqbody'' or ''application/x-msnmsgr-transreqbody'' and for responses ''application/x-msnmsgr-sessionreqbody'' or ''application/x-msnmsgr-transrespbody''.&lt;br /&gt;
&lt;br /&gt;
When you receive an incoming message, you certainly need to check some fields whether or not they have the right values. If some data is missing or wrong, you should always send an error back. For further information read the error handling section of this document. The fields of the message header which you certainly should check are the To, the Content-Type and the Content-Length.&lt;br /&gt;
&lt;br /&gt;
===Message Body===&lt;br /&gt;
&lt;br /&gt;
The message body depends on the type of data requested and it &amp;lt;u&amp;gt;must&amp;lt;/u&amp;gt; always have a NUL (\0 character) appended to it at the end. For information about the content of the message body see the relevant sections.&lt;br /&gt;
&lt;br /&gt;
==MSNSLP messages==&lt;br /&gt;
&lt;br /&gt;
===INVITE Request===&lt;br /&gt;
&lt;br /&gt;
A message with INVITE as method can represent two things, namely a request to start a session or a request to change the sessions parameters. But in both cases most of the field have the same value.&lt;br /&gt;
&lt;br /&gt;
====Starting a session====&lt;br /&gt;
&lt;br /&gt;
When you want to start a session over the server, you should set the Content-Type to ''application/x-msnmsgr-sessionreqbody'' and you should add the following content fields: ''EUF-GUID, SessionID, AppID, Context''&lt;br /&gt;
&lt;br /&gt;
*The '''EUF-GUID''' field determines whether this is an invite for a file transfer, custom emoticon or display picture.&lt;br /&gt;
*The '''SessionID''' field contains the SessionID the rest of the session should use.&lt;br /&gt;
*The '''AppID''' field contains the Application Identifier, this is also used to determine the type of the invitation.&lt;br /&gt;
*The '''Context''' field contains a [http://en.wikipedia.org/wiki/Base64 base64 encoded] string of the MSNObject if it's an invite for a display picture or emoticon, or preview data if it's an invite for a file transfer.&lt;br /&gt;
&lt;br /&gt;
====Starting a transfer session====&lt;br /&gt;
&lt;br /&gt;
When you want to transfer something to the other client, you should set the Content-Type to ''application/x-msnmsgr-transreqbody'' and you should add the following content fields: ''Bridges, NetID, Conn-Type, UPnPNat, ICF''&lt;br /&gt;
&lt;br /&gt;
*The '''Bridges''' field gives the other client a list of the available transport layers which the client supports.&lt;br /&gt;
*The '''Conn-Type''' field tells the other client whether it's behind a ''Firewall'', ''Symmetric-NAT'', an ''Unknown-Connect'' or a ''Direct-Connect''.&lt;br /&gt;
*The '''UPnPNat''' field tells the other client whether it has UPnP-NAT enabled (''true'') or not (''false'').&lt;br /&gt;
*The '''ICF''' field tells the other client whether it has the internet connection firewall enabled (''true'') or not (''false'').&lt;br /&gt;
&lt;br /&gt;
===BYE Request===&lt;br /&gt;
&lt;br /&gt;
To end an active session, you should always send a message with &amp;quot;BYE&amp;quot; as method to the other client. The Content-Type should have the value ''application/x-msnmsgr-sessionclosebody'', the content should then be two times a CRLF. Also, if the session parameters where changed, you should just send one message with BYE as method.&lt;br /&gt;
&lt;br /&gt;
===Error Responding===&lt;br /&gt;
&lt;br /&gt;
When you receive an MSNSLP message, if some data is missing or wrong you should always send an error back. But in some cases errors are used to indicate that something processed with success or that a file transfer was declined.&lt;br /&gt;
&lt;br /&gt;
If the value of the '''&amp;quot;To&amp;quot;''' header contains email addresses which isn't yours, you should reply with a ''404 Not Found'' on the status line. The &amp;quot;From&amp;quot; should have the value ''&amp;amp;lt;msnmsgr:&amp;lt;u&amp;gt;wrong_mail@hotmail.com&amp;lt;/u&amp;gt;&amp;amp;gt;'' where wrong_mail@hotmail.com isn't your email address. The Content-Type should be ''null'' and it shouldn't have content, so the Content-Length is zero.&lt;br /&gt;
&lt;br /&gt;
If the '''Content-Type''' of the message received is not supported by your client, you should reply with a ''500 Internal Error'' on the status line. The Content-Type should be ''null'' and it shouldn't have content, so the Content-Length is zero.&lt;br /&gt;
&lt;br /&gt;
If some '''fields in the message body''' contain a value you don't agree with, you should also reply with a ''500 Internal Error'' on the status line, but the Content-Type should have the same value as the received message. The message body should now only have the field ''SessionID'' with the identifier of the session as value.&lt;br /&gt;
&lt;br /&gt;
===Status line codes===&lt;br /&gt;
&lt;br /&gt;
====200 OK====&lt;br /&gt;
&lt;br /&gt;
There are two different messages with 200 as Status-Code, namely one to accept an Invitation for a session via the server and one to accept an Invitation for a direct session between two clients.&lt;br /&gt;
&lt;br /&gt;
If it's a reply to accept an Invitation for a session via the server you should generate a new '''BranchUID''' and add it to the &amp;quot;''';branch='''&amp;quot; text. You should also set the value of the &amp;quot;'''Content-Type'''&amp;quot; to &amp;quot;'''application/x-msnmsgr-sessionreqbody'''&amp;quot;. And you also have to put the &amp;quot;'''SessionID'''&amp;quot; field into the Message Body with the Identifier of the Session as value.&lt;br /&gt;
&lt;br /&gt;
If it's a reply to accept an Invitation for a direct session between two clients, you should then also generate a new '''BranchUID''' and add it to the &amp;quot;''';branch='''&amp;quot; text. But now the Message Body contains more fields. The field it contains are: &amp;quot;'''Bridge'''&amp;quot;, &amp;quot;'''Listening'''&amp;quot;, &amp;quot;'''Nonce'''&amp;quot;, &amp;quot;'''IPv4External-Addrs'''&amp;quot; and &amp;quot;'''IPv4External-Port'''&amp;quot; or &amp;quot;'''IPv4Internal-Addrs'''&amp;quot; and &amp;quot;'''IPv4Internal-Port'''&amp;quot; or &amp;quot;'''IPv4ExternalAddrsAndPorts'''&amp;quot; or &amp;quot;'''IPv4InternalAddrsAndPorts'''&amp;quot; or &amp;quot;'''IPv6-Addrs'''&amp;quot; and &amp;quot;'''IPv6-Port'''&amp;quot; and &amp;quot;'''IPv6-global'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;'''Bridge'''&amp;quot; field tells the other client which transport layer was chosen.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;'''Listening'''&amp;quot; field tells the other client if it is already listening on the port and IP-address specified.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;'''Nonce'''&amp;quot; field value is being used by the other client to &amp;quot;Authorize&amp;quot; itself via the direct connection.&lt;br /&gt;
&lt;br /&gt;
If the client is behind NAT, the &amp;quot;'''IPv4Internal-Addrs'''&amp;quot; and &amp;quot;'''IPv4External-Addrs'''&amp;quot; fields contain the local and public IP-address. If the client is not behind NAT the &amp;quot;'''IPv4Internal-Addrs'''&amp;quot; field contains the public IP-address.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;'''IPv4Internal-Port'''&amp;quot; and the &amp;quot;'''IPv4External-Port'''&amp;quot; fields contain the port to which you need to connect.&lt;br /&gt;
&lt;br /&gt;
''' ''IMPORTANT:'' '''&lt;br /&gt;
At the time of writing no further information is known about the IPv6 fields nor the &amp;quot;'''IPv4ExternalAddrsAndPorts'''&amp;quot; and &amp;quot;'''IPv4InternalAddrsAndPorts'''&amp;quot; fields, if you have information about that, please edit this page.&lt;br /&gt;
&lt;br /&gt;
====603 Decline====&lt;br /&gt;
&lt;br /&gt;
When you receive an Invitation for a file transfer, you can choose to decline the Invitation. This can be done by sending a &amp;quot;'''603 Decline'''&amp;quot; message to the other client. After receiving the Invitation you should send a 603 Decline message instead of a 200 OK message. Also, you should not create a new '''BranchUID''' but add the one from the Invitation message to the &amp;quot;''';branch='''&amp;quot; text. You should also set the value of the &amp;quot;'''Content-Type'''&amp;quot; to &amp;quot;'''application/x-msnmsgr-sessionreqbody'''&amp;quot;. And you also have to put the &amp;quot;'''SessionID'''&amp;quot; field into the Message Body with the Identifier of the Session as value.&lt;br /&gt;
&lt;br /&gt;
[[Category:MSN]]&lt;br /&gt;
[[Category:Protocols/MSNP]]&lt;br /&gt;
[[Category:Work_In_Progress]]&lt;/div&gt;</summary>
		<author><name>AD</name></author>
	</entry>
</feed>