[Day 29] 閑的沒事 - Fragmentation UDP

Code

udp封包分片

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package main

import (
	"fmt"
	"log"
	"net"
	"time"
)

func main() {
	targetIP := "10.211.55.10"
	targetPort := 12345

	udpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", targetIP, targetPort))
	if err != nil {
		log.Fatal(err)
	}

	conn, err := net.DialUDP("udp", nil, udpAddr)
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	payload := `又是熟悉的payload,總長1360`
	fmt.Println(len(payload))  # 1360

	chunkSize := 1000
	for i := 0; i < len(payload); i += chunkSize {
		end := i + chunkSize
		if end > len(payload) {
			end = len(payload)
		}

		_, err = conn.Write([]byte(payload[i:end]))
		if err != nil {
			log.Fatal(err)
		}

		fmt.Printf("Sent fragment: %s\n", payload[i:end])
		time.Sleep(1 * time.Millisecond)
	}

	fmt.Println("Packet sent successfully!")
}

測試

chunkSize不管是設定100還是1000的時候,通常只發送一次封包後下一次發送就會出現connection refused的錯誤訊息。因為我啟動一個Flask Web Endpoint監聽這個端口,Flask web service默認只支援HTTP over TCP。當我測試時使用UDP協議向目標主機發送請求時,由於Flask不處理 UDP 請求,因此不會有任何響應。當我的UDP客戶端再次嘗試發送時,就會收到一個connection refused的錯誤。

看起來做壞事分片發送不能常用UDP協議了,容易出現connection refused。用其他常用的PORT也是如此。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy