Multiple Switches in a Line|Mininet
Multiple Switches in a Line
The next example creates the topology below. All hosts are on the same subnet.
The Mininet-CLI command links can be used to determine which switch interface is connected to which neighboring switch interface.
The full Python2 program is switchline.py; to run it use
python switchline.py |
This configures the network and starts the Mininet CLI. The default number of host/switch pairs is 4, but this can be changed with the -N command-line parameter, for example python switchline.py -N
5.
We next describe selected parts of switchline.py. The program starts by building the network topology object, LineTopo, extending the built-in Mininet class Topo, and then call Topo.addHost() to create the host nodes. (We here override __init()__, but overriding build() is actually more common.)
class LineTopo( Topo ): for key in kwargs: |
An Introduction to Computer Networks, Release 2.0.4
Method Topo.addHost() takes a string, such as “h2”, and builds a host object of that name. We immediately append the new host object to the list h[]. Next we do the same to switches, using Topo. addSwitch():
# add N switches s1..sN for i in range(1,N+1): s.append(self.addSwitch('s' + str(i))) |
Now we build the links, with Topo.addLink. Note that h[0]..h[N-1] represent h1..hN. First we build the host-switch links, and then the switch-switch links.
for i in range(N): # Add links from hi to si for i in range(N-1): # link switches |
Now we get to the main program. We use argparse to support the -N command-line argument.
def main(**kwargs): parser = argparse.ArgumentParser() parser.add_argument('-N', '--N', type=int) args = parser.parse_args() if args.N is None: N = 4 else: N = args.N |
Next we create a LineTopo object, defined above. We also set the log-level to ‘info’; if we were having problems we would set it to ‘debug’.
ltopo = LineTopo(N=N) setLogLevel('info') |
Finally we’re ready to create the Mininet net object, and start it. We’ve specified the type of switch here, though at this point that does not really matter. It does matter that we’re using the DefaultController, as otherwise the switches will not behave automatically as Ethernet learning switches. The autoSetMacs option sets the host MAC addresses to 00:00:00:00:00:01 through 00:00:00:00:00:04 (for N=4), which can be a great convenience when manually examining Ethernet addresses.
net = Mininet(topo = ltopo, switch = OVSKernelSwitch, ) |
The next bit starts /usr/sbin/sshd on each node. This command automatically puts itself in the background; otherwise we would need to add an ‘&’ to the string to run the command in the background.
for i in range(1, N+1): hi = net['h' + str(i)] hi.cmd('/usr/sbin/sshd') |
An Introduction to Computer Networks, Release 2.0.4
Finally we start the Mininet CLI, and, when that exits, we stop the emulation.
CLI( net) net.stop() |
Using sshd requires a small bit of configuration, if ssh for the root user has not been set up already. We must first run ssh-keygen, which creates the directory /root/.ssh and then the public and private key files, id_rsa.pub and id_rsa respectively. There is no need, in this setting, to protect the keys with a password. The second step is to go to the .ssh directory and copy id_rsa.pub to the (new) file authorized_keys (if the latter file already exists, append id_rsa.pub to it). This will allow passwordless ssh connections between the different Mininet hosts.
Because we started sshd on each host, the command ssh 10.0.0.4 on h1 should successfully connect to h4. The first time a connection is made from h1 to h4 (as root), ssh will ask for confirmation, and then store h4’s key in /root/.ssh/known_hosts. As this is the same file for all Mininet nodes, due to the common filesystem, a subsequent request to connect from h2 to h4 will succeed immediately; h4 has already been authenticated for all nodes.
Running a webserver
Now let’s run a web server on, say, host 10.0.0.4 of the switchline.py example above. Python includes a simple implementation that serves up the files in the directory in which it is started. After switchline.py is running, start an xterm on host h4, and then change directory to /usr/share/doc (where there are some html files). Then run the following command (the 8000 is the server port number):
python -m SimpleHTTPServer 8000 |
If this is run in the background somewhere, output should be redirected to /dev/null or else the server will eventually hang. The next step is to start a browser. If the lxde environment has been installed (30.1 Installing Mininet), then the chromium browser should be available. Start an xterm on host h1, and on h1 run the following (the --no-sandbox option is necessary to run chromium as root):
chromium-browser --no-sandbox |
Assuming chromium opens successfully, enter the following URL: 10.0.0.4:8000. If chromium does not start, try wget 10.0.0.4:8000, which stores what it receives as the file index.html. Either way, you should see a listing of the /usr/share/doc directory. It is possible to browse subdirectories, but only browser-recognized filetypes (eg .html) will open directly. A few directories with subdirectories named html are iperf, iptables and xarchiver; try navigating to these.
Frequently Asked Questions
Recommended Posts:
- Uses of Computer Networks
- Network Hardware
- Installing and Running ns-3|THE NS-3 NETWORK SIMULATOR
- A Single TCP Sender| The ns-3 Network Simulator
- Wireless|The ns-3 Network Simulator
- The ns-2 simulator|NETWORK SIMULATIONS: NS-2
- A Single TCP Sender| The ns-3 Network Simulator
- Two TCP Senders Competing|THE NS-3 NETWORK SIMULATOR
- Wireless Simulation|NETWORK SIMULATIONS: NS-2
- Epilog|NETWORK SIMULATIONS: NS-2
- THE THEORETICAL BASIS FOR DATA COMMUNICATION
- GUIDED TRANSMISSION MEDIA
- WIRELESS TRANSMISSION
- COMMUNICATION SATELLITES
- DIGITAL MODULATION AND MULTIPLEXING