Unterschiedliches Maximum von TCP

  • Hallo,

    Ich hab mal eine Frage. Ich dachte die Maximum von TcpSend sind 1024 bytes, aber dann habe ich etwas über TCP mit nem freund gemacht und da war die Maximale länge 536 bytes.
    Kann das unterschiedlich sein? Und wenn ja wie kann man die Maximale länge rausfinden?

    THX im Vorraus

    mfg. Jam00

  • Hallo,
    google doch mal nach "MTU" oder schau bei wikipedia nach.
    Das Problem ist, die Länge der Pakete so groß einzustellen, daß möglichst wenig "overhead" entsteht und gleichzeitig im Fehlerfall (verlorenes Paket, miss) ein möglichst kleines Paket angefordert werden muß.

    Zitat

    Kann das unterschiedlich sein?

    Ja, das kann je nach Server/Client unterschiedlich sein.

    Zitat

    Und wenn ja wie kann man die Maximale länge rausfinden?

    s. MTU, ist dein Paket größer, dann wird es vor dem Versenden aufgeteilt, dann kann es sein, daß im Extremfall deine netto Datenubertragungsrate halbiert wird!
    Mit 1024 bist du aber idR auf der sicheren Seite.
    Schreib doch ein Script, welches die "optimale" Paketgröße bzgl. der Geschwindigkeit herausfindet!

    • Offizieller Beitrag

    Mir ist gerade aufgefallen, dass bei Win7 die MTU standardmäßig auf 1500 gestellt ist.
    Da lieferte mein Testscript nämlich lediglich Werte von nur 978 Bytes zurück (Fragmentierung). Jetzt habe ich die MTU auf 1492 gestellt und mein Script gibt die korrekten 1464 Bytes (28 Bytes für Header) zurück. :)
    Und so nebenbei ist mein Internet auch noch schneller geworden. :D

    Spoiler anzeigen
    [autoit]


    MsgBox(0, 0, _GetMaxTCPLen('t-online.de'))

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetMaxTCPLen($sUrl, $iTimeout = 1000)
    Local $objWMIService, $colItems, $iStatus
    $objWMIService = ObjGet('winmgmts:\\.\')
    For $i = 1500 To 1 Step -1
    $iStatus = 0
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_PingStatus WHERE Address="' & $sUrl & _
    '" and NoFragmentation=True and Timeout=' & $iTimeout & ' and BufferSize=' & $i, 'WQL', 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $iStatus = Number($objItem.StatusCode)
    Next
    Else
    Return 'Error, Win32_PingStatus failed!'
    EndIf
    If $iStatus = 0 Then ExitLoop
    Next
    Return $i & ' Bytes'
    EndFunc ;==>_GetMaxTCPLen

    [/autoit]
  • OK ich hätte einfach den Namen eingeben müssen, aber ich habe das Subinterface eingegeben :D
    Aber wie soll ich jetzt mehr Geschwindigkeit messen? DSL ist schon 27MBit :D

    EDIT: Oh Oh Oh ...... das ist ja der Hammer. Ich mache das ganze über WLAN vorher zu meiner FritzBox mit ca 1MBit nun sind das 2 - 2,5 8|8o:thumbup:
    Danke Euch allen.

    MfG
    Der_Doc

  • ja, aber wi is tdas jetzt? wenn einer z.B. ein max vonn 1024 hat und der andere 536 und der mit 1024 ihm ein paket über 1024 schreibt epfängt er das dann in einem odler in 2? Und andersrum also der 536 zu 1024 ein 1024Paket?

    mfg. Jam00

  • Irgendwas stimm nicht. Ich habe mit einem Freund was über TCP gemacht, da konnte er mir maximal 536 Bytes senden, jetzt hab ich ihm diese Func geschickt und es kam 1451 bytes raus :S

    Edit:
    Und jetzt das Beste, der Wert verändert sich als, mal 1401 mal aber auch 1470
    Kann das daran liegeh das er internet viva Satelit hat?

    mfg. Jam00

  • Zitat

    Kann das daran liegeh das er internet viva Satelit hat?

    Ja, das könnte sein! Ich vermute daß mit dem Satelliten nicht uber das "normale" Protokoll gesprochen wird, sondern daß die Übertragungsrate je nach Anzahl der Anwender angepasst wird. D.h. wenn sehr viele User die Satellitenleitung nutzen, dann bekommen zwar alle etwas, aber dafür etwas weniger. Und hier auf der Erde wird dann wieder "normal" in Pakete umgesetzt.

  • Am besten du machst die Funktion von Oscar mit in deinen Script rein
    um der Lösung des Rätzels ein stück näher zu kommen

    Spoiler anzeigen
    [autoit]


    Func _GetMaxTCPLen($sUrl, $iTimeout = 1000)
    Local $objWMIService, $colItems, $iStatus
    $objWMIService = ObjGet('winmgmts:\\.\')
    For $i = 1500 To 1 Step -1
    $iStatus = 0
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_PingStatus WHERE Address="' & $sUrl & _
    '" and NoFragmentation=True and Timeout=' & $iTimeout & ' and BufferSize=' & $i, 'WQL', 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $iStatus = Number($objItem.StatusCode)
    Next
    Else
    Return 'Error, Win32_PingStatus failed!'
    EndIf
    If $iStatus = 0 Then ExitLoop
    Next
    Return $i & ' Bytes'
    EndFunc ;==>_GetMaxTCPLen

    [/autoit]