Code Listing
import socket
socket.setdefaulttimeout(30)
 
My_IP = '127.0.0.1'
My_PORT = 50000
Remote_IP='127.0.0.2'
Remote_PORT=56835
 
def start_task(sock,message):
    sock.send(message.encode('utf-8'))
    msg=sock.recv(1024)
    sock.close()
 
def start_server():
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind((My_IP, My_PORT))
    sock.listen(1)
    try:
        conn, addr = sock.accept()
        start_task(conn,"Thx for connecting!!!")
    except socket.timeout:
        pass
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    sock.connect((Remote_IP, Remote_PORT))
    start_task(sock,"Thx for accepting!!!");
except socket.error:
    start_server()
Execution AExecution B
127.0.0.2 127.0.0.1127.0.0.1 127.0.0.2

TCP Flag Cheat Sheet

FlagStands forMeaning in simple termsTypical trigger
SYNSynchronize“Hey, I want to start a connection.”connect() (client sends it)
ACKAcknowledge“I got your message.”Almost every response has this
SYN + ACKSync & Ack“Okay, let’s connect.”accept() responds to connect()
PSHPush“Here’s some data - process it immediately.”send()
PSH + ACKPush + Acknowledge“Here’s data AND I got your last message.”send() (usually with recv()
waiting on other side)
FINFinish“I’m done. I want to close the connection.”close()
FIN + ACKFinish + Acknowledge“I’m done too - I got your FIN.”close() (on the other side)
RSTReset“Something went wrong. Kill this connection.”Happens if one side tries to connect
but the other side isn’t listening
RST + ACKReset + Acknowledge“Hey, I got your message, but I’m not listening”Usually when connect() is called, but the other
side hasn’t called listen() or accept() yet.
Source
Nr.TimeSourceDestinationProtocolLengthSrc PortDst PortInfo
11,340127.0.0.2127.0.0.1TCP52568355000056835 > 50000 [SYN] Seq=0
21,340127.0.0.1127.0.0.2TCP40500005683550000 > 56835 [RST, ACK] Seq=1 Ack=1
31,842127.0.0.2127.0.0.1TCP525683550000[TCP Spurious Retransmission] 56835 > 50000 [SYN] Seq=0
41,842127.0.0.1127.0.0.2TCP40500005683550000 > 56835 [RST, ACK] Seq=1 Ack=1
52,342127.0.0.2127.0.0.1TCP485683550000[TCP Spurious Retransmission] 56835 > 50000 [SYN] Seq=0
62,342127.0.0.1127.0.0.2TCP40500005683550000 > 56835 [RST, ACK] Seq=1 Ack=1
73,646127.0.0.1127.0.0.2TCP52568375000056837 > 50000 [SYN] Seq=0
83,646127.0.0.2127.0.0.1TCP52500005683750000 > 56837 [SYN, ACK] Seq=0 Ack=1
93,646127.0.0.1127.0.0.2TCP40568375000056837 > 50000 [ACK] Seq=1 Ack=1
103,646127.0.0.1127.0.0.2TCP60568375000056837 > 50000 [PSH, ACK] Seq=1 Ack=1 Len=20
113,646127.0.0.2127.0.0.1TCP40500005683750000 > 56837 [ACK] Seq=1 Ack=21 Len=0
123,646127.0.0.2127.0.0.1TCP61500005683750000 > 56837 [PSH, ACK] Seq=1 Ack=21 Len=21
133,646127.0.0.1127.0.0.2TCP40568375000056837 > 50000 [ACK] Seq=21 Ack=22 Len=0
143,646127.0.0.1127.0.0.2TCP40568375000056837 > 50000 [FIN, ACK] Seq=21 Ack=22 Len=0
153,646127.0.0.2127.0.0.1TCP40500005683750000 > 56837 [FIN, ACK] Seq=22 Ack=22 Len=0
163,646127.0.0.1127.0.0.2TCP40568375000056837 > 50000 [ACK] Seq=22 Ack=23 Len=0
NrProzessFlagAusgelöst durchGrund für AbschlussInfo
1ASYNA26-A startet connect() und
sendet SYN an B
2BRST, ACK-A26 schlägt fehlB hat noch keinen Server laufen
→ OS antwortet automatisch mit RST
3ASYNA26-Wiederholung von Paket 1
(SYN wird erneut gesendet)
4BRST, ACK-A26 schlägt fehlB lehnt erneut ab
→ kein listen() aktiv
5ASYNA26-Letzter Verbindungsversuch
von A durch erneuten SYN
6BRST, ACK-A26 schlägt fehlLetzte automatische Ablehnung durch B
7BSYNB26-B startet nun selbst connect()
und sendet SYN an A
8ASYN, ACKA19B26 abgeschlossenA akzeptiert Verbindung über accept()
und antwortet mit SYN-ACK
9BACKautomatischA19 abgeschlossenB bestätigt mit ACK → Verbindung
ist nun vollständig aufgebaut
10BPSH, ACKB10A11 abgeschlossenB sendet Nachricht → A’s recv()
empfängt diese und kehrt zurück
11AACKautomatisch-A bestätigt den Erhalt der Nachricht von B
12APSH, ACKA10B11 abgeschlossenA sendet Antwort → B’s recv()
erhält Nachricht und kehrt zurück
13BACKautomatisch-B bestätigt den Empfang der Nachricht von A
14BFIN, ACKB12A11 abgeschlossen (EOF)B schließt Verbindung
→ A’s recv() bemerkt FIN und kehrt zurück
15AFIN, ACKA12B11 abgeschlossen (EOF)A schließt ebenfalls
→ B’s recv() bemerkt FIN und kehrt zurück
16BACKautomatisch-B bestätigt den FIN von A
→ Verbindung wird vollständig geschlossen