Facebook uses asynchronous javascript calls (ajax) with responses in javascript object notation (JSON) over an HTTP connection (port 80).

Login is HTTP posted to https://login.facebook.com/login.php with POST data md5pass=0&noerror=1&email={email}&pass={pass} where {email} and {pass} are the user who is logging in's facebook email and password respectively. The cookies that are set by the server must be sent during every POST and GET request to the server(s) below

Every user on Facebook has it's own unique id (UID) number which can be found easiest in the URL of their profile eg "http://www.facebook.com/profile.php?id=1234567890" but can also be done via a search query to http://www.facebook.com/srch.php?nm={search termhere} and is stored in the cookie with name "c_user". Facebook chat uses these UID's for sending and receiving instant messages.

Visibility is updated by sending an HTTP POST to htttp://apps.facebook.com/ajax/chat/settings.php with the POST data visibility=true&post_form_id=1234 where post_form_id is an arbitrary id that will be used throughout the process of communication (the facebook response normally modifies the html that is contained within this form, and needs this id to target it)

The buddy list is fetched via POST to http://apps.facebook.com/ajax/presence/update.php with POST data notifications=1&popped_out=false&force_render=true&buddy_list=1

Previous history of chat with another user is requested via POST to http://apps.facebook.com/ajax/chat/history.php with POST data id=596176850&post_form_id=1234 where id is set to the UID of the user you wish to download history of

Messages are sent via HTTP POST to http://www.facebook.com/ajax/chat/send.php with POST data msg_text={message}&msg_id=3409501070&client_time={timestamp}&to={uid}&popped_out=true&num_tabs=1&post_form_id=1234 where {message} is the urlencoded text that is being sent, {timestamp} is the local unix timestamp of the sender and {uid} is the UID of the user to send to

Messages are retreived by polling http://{1-30}.channel{1-20}.facebook.com/x/{UID}/false/p_{yourUID}={requestnumber}& using an HTTP GET request (not sure what the false bit is, but it can be true too), where the {UID} is the uid of the buddy to download messages from and {requestnumber} is an incrementing number, probably to work around proxy/browser caches. The message that is returned from the server is like

for (;;);{"t":"msg","c":"p_800753867","ms":[{"type":"msg","msg":{"text":"i'm sending u a message","time":1209548203464,"clientTime":1209548202312,"msgID":"3409501070"},"from":800753867,"to":596176850,"from_name":"Eion Robb","to_name":"Jeremy Lawson","from_first_name":"Eion","to_first_name":"Jeremy"}]}

and are in JSON. Messages that are sent to a buddy are also returned back by the server.

Setting a status message is done by POSTing status={status_message_here} to www.facebook.com/updatestatus.php

It has been announced that Facebook will expose an XMPP interface to Facebook's chat and presence.