TCP Verständnisproblem (in go)

NemesisFS

Lt. Commander
Dabei seit
Sep. 2008
Beiträge
1.289
Hi,

ich versuche gerade einen kleinen IRC Client in go zu schreiben, dabei ist mir etwas merkwürdiges aufgefallen.

Ich öffne eine TCP Verbindung zu einem Server und schließe sie nach einer Sekunde wieder:
Code:
package main

import (
	"fmt"
	"net"
	"os"
	"time"
)

func main() {
	conn, err := net.Dial("tcp", os.Args[1])
	if err != nil {
		fmt.Println(err)
		return
	}

	time.Sleep(time.Second)

	err = conn.Close()
	if err != nil {
		fmt.Println(err)
		return packete 
	}
}
Die Verbindung zu einem "normalen Server" (zB google.de:80) läuft normal dh ich sehe den threeway handshake und das schließen (die letzten sechs Packete im Screenshot)
Wenn ich aber zu einem IRC Server Verbinde sendet mein Rechner ein RST statt dem FIN (die ersten 10 Packete).
wireshark.png

Ich kann mir das nicht erklären, habt ihr dazu ne Idee?
 

Joe Dalton

Lieutenant
Dabei seit
Dez. 2010
Beiträge
596
Hallo,

Die Verbindung zu einem "normalen Server" (zB google.de:80) läuft normal dh ich sehe den threeway handshake und das schließen (die letzten sechs Packete im Screenshot)
Wenn ich aber zu einem IRC Server Verbinde sendet mein Rechner ein RST statt dem FIN (die ersten 10 Packete).
Ich kann mir das nicht erklären, habt ihr dazu ne Idee?
Wenn ich das richtig sehe, dann erhält er auf seine Anfragen kein ACK und schickt wiederholt das Paket mit SEQ=1. Ich würde prüfen, was in den RESPONSE-Paketen steht bzw. warum kein ACK vom Server geschickt wird (z.B. Block durch Firewall).

Es ist spät...
Chris
 

NemesisFS

Lt. Commander
Ersteller dieses Themas
Dabei seit
Sep. 2008
Beiträge
1.289
Die Acks kommen durch, von meiner Seite. Die Gegenseite sendet ihre Acks in den IRC Packeten, ich hab das nicht in wireshark als tcp packet dargestellt gekriegt. SEQ von mir ist immer eins, da ich nur ein SYN Packet geschickt habe, der Rest sind leere ACKs gewesen.
Das Problem hat sich gelöst, nachdem ich in dem Code die empfangen Packete empfange:
Code:
go func() {
    buffer := [1024]byte{}
    for {
        _. _ := conn.Read(buffer[0:1024])
    }
}()
Dann löst sich die Verbindung korrekt auf (und ich sende SEQ=2 weil ich ja ein FIN Packet schicke.
Verstehen tue ich das leider immernoch nicht, aber ich kriege es behoben....
 
Top