Das Problem ist, dass nach dem Versenden eines verbindungstrennenden
RST-Paketes die Verbindung formal nicht mehr besteht, dieses Paket aber
dennoch bestätigt werden muss. Außerdem können ja auch noch andere
Pakete über diese Verbindung eintrudeln, die vor der Trennung
abgeschickt wurden. Daher hält jeder bessere TCP-Stack eine Verbindung
nach ihrem Ende noch eine gewisse Zeit lang in einem "Verbindung tot,
aber noch reserviert"-Zustand (TIME_WAIT), um solche Pakete schnell
korrekt einordnen (und wegwerfen) zu können.
Eine Verbindung besteht aus (Source-IP, Source-Port, Destination-IP,
Destination-Port). Wenigstens eines davon musst du ändern, um eine
neue Verbindung aufbauen zu können, und das ist sinnvollerweise der
Source-Port. Ansonsten bist du für den Empfänger nämlich nur das
verrauschte, vorgeschichtliche Echo einer früheren Verbindung, die er
erst nach TIME_WAIT vergessen wird.