From d4c5d68c6ba418ca111ea358fd419e058a29531e Mon Sep 17 00:00:00 2001 From: TiagoRG Date: Sun, 17 Dec 2023 18:04:20 +0000 Subject: [PATCH] [RC1] fix Signed-off-by: TiagoRG --- 2ano/1semestre/rc1/pratica05/pratica05.html | 72 ------------ 2ano/1semestre/rc1/pratica06/pratica06.html | 115 -------------------- 2ano/1semestre/rc1/pratica06/pratica06.pdf | Bin 3903 -> 26655 bytes 3 files changed, 187 deletions(-) delete mode 100644 2ano/1semestre/rc1/pratica05/pratica05.html delete mode 100644 2ano/1semestre/rc1/pratica06/pratica06.html diff --git a/2ano/1semestre/rc1/pratica05/pratica05.html b/2ano/1semestre/rc1/pratica05/pratica05.html deleted file mode 100644 index 39c8e9e..0000000 --- a/2ano/1semestre/rc1/pratica05/pratica05.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - -

GUIÃO 5

-

Ex 2

-

By analyzing the captured packets, there is a big amount of them, so we'll have to use filters for the packets.

-

Assossiation

-

The filters used to see the association packets are:

- -

After each connection, there is an exchange of Authentication packets between PC2 and the Router.

-

Authentication

-

The filters used to see the association packets are:

- -

Since we're connecting to a network with no password, the Authentication process uses an Open System algorithm.

-

On the other hand, on the Deauthentication process, it disconnects with a reason behind it.

-

Probe

-

These packets are constantly transmitted so that the router may know how many clients are currently connected, and where they are connected.

-
-

Ex 3

-

As mentioned before, association packets are exchanged on a new connection, and responsible for informing the router about the information of the connecting device.

-

After pinging the Router and applying the filter icmp, on PC1 while keeping the MAC address filter, we can see that they exchange ARP packets. During pinging process, after each request, we get Request to Send (RTS) and Clear to Send (CTS) packets.

-
-

Ex 4

-

Since now we are sending larger packets, the connection elapsed time will be higher and it's also more unstable.

-

Since the limit of the RTS and CTS packets is 1000 bytes and we are trying to send packets larger than that, it ends up resulting on that unstability.

-

Those packets are used to limit the bandwidth used by each user, otherwise it could overwhelm the router and cause connection issues for other users.

-
-

Ex 5

-

During the authentication process, since now we are using a private network, instead of having just the association packets, we will also have authentication packets with keys to validate the connection.

-

We also won't be able to capture ICMP packets from this connection.

- - diff --git a/2ano/1semestre/rc1/pratica06/pratica06.html b/2ano/1semestre/rc1/pratica06/pratica06.html deleted file mode 100644 index 11f174c..0000000 --- a/2ano/1semestre/rc1/pratica06/pratica06.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - -

GUIÃO 6

-

Ex 1.2.

-

On the server's source code, the server is always wating for a message from a user, on the IPv4 address 0.0.0.0, on the UDP port 5005.

-

On the client's source code, there are two functions for user interaction, and its IPv4 address is 127.0.0.1, using the same UDP port as the server. Then, it waits for a message to then send to the server using that IP address and port, so that the server receives the message (which is constantly listening).

-

On Wireshark, per message, we can capture a UDP packet, which contains the information of the message (length, content), and it also has the port information.

-

The client uses the UDP port defined by the server to send the message. The client's UDP port is defined automatically on the socket creation.

-

Ex 2.2.

-

After analyzing the server's source code, we define the IP and port of the server (same as before). After that, the socket is created, and starts listening for incoming clients (maximum is 5). Then, after a client connects, it stores the address and socket of the connected client. It now creates a thread to listen for messages, while still being able to accept more clients. When receiving a message from a client, echoes the message back to it.

-

On the client, it defines its IP and port (same as before), and creates a socket, which then connects to the server. Then, it waits for a message to then send to the server using that IP address and port, so that the server receives the message (which is constantly listening). Finally before allowing the user to send another message, awaits for the server to echo the sent message.

-

On both ends, there is a exception handler, in case of one of them disconnects, it clears the used socket, and allows the server to listen to a new client.

-

On Wireshark, we first capture 3 TCP packets when the client connects to the server:

- -

We then capture 4 more TCP packets per message exchange in the following order:

- -

Ex 3.2.

-

The difference between this and the previous server, is that now all clients are handled by a single thread, using the selectors module.

-

After registering a client, it will look for activity/events (which will be in this case messages), so it can then trigger the handle_data function.

-

The handle_data function works similarly as the function handle_client_connection in the previous file. It waits for a message and sends it back, and if the connection closes or loses connection, it closes the socket.

-

Every single client has a key, provided by the selector, which is printed everytime it establishes a connection, it receives data, or disconnects.

-

Ex 4.2.

-

On both the server the client, there are a few changes. Now, instead of sending a simple message, the client sends a structured message using the struct python module. This is still a normal message, but we define how it should later be decoded.

-

If we take the example of this code, the struct '!BLL20s' represents a struct that contains the following:

- -

This way we are able to send not only the message, but we are also sending the version of the message, the order number of the client and the message size, this one being important for the server to unpack the struct since the message is a character (byte) array of variable size and the server needs to know how many characters to unpack.

-

On the TCP packet, we still see all the data compacted into its Data field.

-

Ex 4.3.

-

To adapt the code, we first edit the server. When receiving a message, it then sends back the struct to the connected client.

-

On the client, after we send the packet, we then await the response from the server and once the replies comes, we unpack it and print it.

-

Ex 5.2.

-

In this case, the packet is still similar to the previous one.

-

The difference now is, instead of sending the struct at once, we first send the struct header. This header contains the version, order and size (the first elements of the structs used before). The server then requests the number of bytes passed as the size. This way, we can now send a message with whatever size we want.

-

Ex 5.3.

-

For this, we adapt the code the same way we did in 4.3.

- - diff --git a/2ano/1semestre/rc1/pratica06/pratica06.pdf b/2ano/1semestre/rc1/pratica06/pratica06.pdf index b1e6a7467200cef7486c2aa198c17c9335b591db..be200a196fabd8d2bd70e83b39711d3359d3635e 100644 GIT binary patch literal 26655 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 C2b;72 delta 8 PcmbP#fpNdw277)05rzXy