views:

189

answers:

5

I was wondering that how application like skype ( a popular chat client ) works in local network with one router, How it can listen on particular port?

for example:= In one network A and B are two machines running skype , gateway of both is G1,

now how A and B will have same IP on internet that is of G1, but how can they ensure that they are listening on different ports? How can they ask to router G1 for unique port.

I want to make a simple text chat server on linux. How can I have connections between two different computers in two different networks?

A: 

Unless A and B are actually "listening" to the responses to outgoing requests, your router will need to be cofigured to forward the relevant port numbers to the relevant hosts. This isn't something that you can request in the code, it's something you need to configure on the router itself.

David M
@David M , but how skype or other peerToPeer clients work without configuring routers?
Sunny
They try to listen to every well known port, such as 80 or 433, and, if not successful, switch to "passive" mode, connecting to other clients via server
alemjerus
You have described a "listening" client as alemjerus says - this is the way they would need to be configured.
David M
+2  A: 

Solution to your problem is to have a forwarding server somewhere in the net.

Different programs use different means to connect to each other. But every chat server, including Skype, has a server, which forwards data or information about subnet IP/port availability.
There are two types of clients: "listening" clients and "passive" ones. Listening clients have direct access to Internet via router port forwarding, and "passive" ones have to use additional tricks to get their hands on external data, line external servers or additional ports to listen.

The point is, not clients connect to each other, but they connect to a server, which then connects back to them to verify they are available, and, if at least one of them is not firewalled, direct another on to connect to the first one, excludint itself from further communication. And if both are firewalled, then is has to forward their messages through itself.

alemjerus
+1  A: 

You need a central UDP Rendezvous Server.

After the initial connection from the client to the server the UDP clients can be redirected to talk to eachother directly even if firewalled.

The trick is to open an UDP connection from the inside.

  1. Check out Real-Time Media Flow Protocol and how they use it.
  2. Check out UDP Hole Punching

alt text

zproxy
+1  A: 

Traditional NAT servers replace the source address and port with the address and a random port number of the external interface of the NAT server. This works well for simple protocols such as HTTP and SMTP, but it can create problems for more complex protocols that require multiple response ports on the external interface of the NAT server. NAT servers also aren’t aware of information stored in the data portion of the application layer header without the help of NAT editors and similar software fixes.

Windows XP’s answer to these problems is NAT Traversal, which can automatically allow the UPnP-enabled NAT client application to communicate with a UPnP NAT device. NAT Traversal provides methods to allow the UPnP client to learn the public IP address of the NAT server and to negotiate dynamically assigned port mappings for UPnP NAT client applications.

NAT Traversal features can be built into any hardware device or software application. Applications that commonly cause troubles for NAT devices but work well when UPnP-enabled include the following:

Multiplayer Internet games Audio and video communications Terminal Services clients and servers Peer-to-peer file sharing applications

When these applications are UPnP-enabled, access through the Windows XP ICS allows them to work seamlessly.

Jigar Shah
+1  A: 

Host Discovery

  • Manual discovery, client A knowns who client B is

  • Discovery through broadcast UDP which is used by lot of games for LAN play. A client sends out a packet to the broadcast address for their subnet. The peers can choose to pick up this broadcast and respond. The downside is that this is limited to the current subnet. The more general INADDR_BROADCAST (255.255.255.255) works for all subnets on the local-link, but it cannot be routed, so won't work over internet (this is what DHCP auto-configuration uses).

  • Discovery through a central (Rendezvous) server. Each individual client knows the address of the server, and the latter informs them about each other. This technique is used by IRC, Voip, IMs and by most 'peer-to-peer' networks.

Communication

After the initial discovery is done you want to be able to talk to eachother. On the internet this can get tricky. Most people nowadays have their own router and sit behind a NAT, so direct connections are impossible.

Using a Rendezvous server, you can possibly talk to each other using the server itself. client A tells the server what to say, and it in turn tells client B, since both clients have an outbound connection to the server.

It is possible for the clients to talk to each other without the server proxying. This requires either DMZ, port forwarding or UPnP. DMZ will basically forward all incoming connections on all the ports to a given local IP. Port forwarding only forwards certain ports to local IPs. UPnP is a bit more advanced, the client requests that the router temporarily forwards a port to it, and you tell the other client via the rendezvous server where to connect.

Chatting app implementation

The easiest solution to your problem is most likely to use a central server, which is known by all the clients, that proxies host discovery and possibly the communication between the clients. If you want the clients to communicate directly, you can just proxy host discovery, and then let either DMz, manual port forwarding or UPnP do the rest.

Another solution would be to just have direct communication through NAT traversal techniques discussed above, and do manual host discovery.

Yet another solution would be to use a public webserver and 'abuse' its ability to insert content to chat with each other.

Yannick M.
what about UDP hole punching?
Sunny
The success of UDP hole punching is strongly dependent on the type ofNAT the client has. For example symmetric NAT, where the source ip:port pair chosen is unique for every destination ip:port, does not allow for UDP hole punching. I would advise against trying this, as you are at the mercy of the NAT's implementation.
Yannick M.
So for direct client to client connections, by which method I can do it without user involvement, the way skype does it?
Sunny
Discovery through a publicly available server which is known by all the clients, and for direct p2p communication UDP hole punching or UPnP. However neither guarantee success.
Yannick M.
Skype has a number of fallbacks, and in the end if a direct connect cannot be made the call is proxied: http://www.cs.columbia.edu/techreports/cucs-039-04.pdf
Yannick M.