I think the best example for TCP session hijacking is the attack from Kevin Mitnick, which is explained very well on this page. The idea is that you guess the sequence number of a packet. However, nowadays this attack is not practical because most operating systems randomize this number, making it hard to predict.
For Man-in-the-Middle attacks on the other hand, you have a wide range of options. First you need to get in between the two nodes. This can be really simple when you own one of the nodes that route their traffic, like a wireless access point.
But you can also use attacks like ARP spoofing you mentioned. Other routing protocols also allow such behaviour, like BGP. Then there are more indirect attacks like DNS cache poisoning.
Once you are in control of the data traffic, you can passively sniff the traffic. I think you'll find scapy a nice Python module for things like this. It's quite powerful and can be used for all kinds of networking attacks.
Other passive sniffing can be done with libpcap. pcapy is a Python module that interfaces with this library. You can also just use Wireshark if you want a quick peek at the traffic.
Modifying traffic between nodes is harder. One way to do this is to route all traffic to a certain port. For the chat app example, let's say you route incoming traffic from port 12221 to localhost:1337 using iptables. Now you run a server on port 1337 that captures all this traffic, sniffs the packets, modifies them and sends them through to port 12221 to the correct host.
If you want to practice looking at traffic from another device, you can install a tool like Burp and set a proxy on a device like your phone. You'll see your HTTP traffic and you'll be able to modify it. But with TLS (HTTPS) websites you'll get a certificate warning, because these tools generate a fake TLS-certificate on-the-fly. If you want to get deeper into this, I recommend mitmproxy, because it's open source and has a nice Python API. Also, you can check out bettercap.