본문 바로가기
golang

Golang network#2 tcp buffer

by PudgeKim 2021. 4. 12.
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
46
47
48
49
50
51
52
53
54
55
package main
 
import (
    "crypto/rand"
    "io"
    "net"
    "testing"
)
 
func TestReadIntoBuffer(t *testing.T) {
    payload := make([]byte1<<24// 16MB
    _, err := rand.Read(payload)  // generate a random payload
    if err != nil {
        t.Fatal(err)
    }
 
    listener, err := net.Listen("tcp""127.0.0.1:")
    if err != nil {
        t.Fatal(err)
    }
 
    go func() {
        conn, err := listener.Accept()
        if err != nil {
            t.Log(err)
            return
        }
        defer conn.Close()
 
        _, err = conn.Write(payload) 
        if err != nil {
            t.Error(err)
        }
    }()
 
    conn, err := net.Dial("tcp", listener.Addr().String())
    if err != nil {
        t.Fatal(err)
    }
 
    buf := make([]byte1<<19// 512KB
 
    for {  // buf 사이즈만큼만 최대로 읽을 수 있기 때문에 payload를 다 읽으려면 반복문 돌아야함  
        n, err := conn.Read(buf) 
        if err != nil {
            if err != io.EOF {
                t.Error(err)
            }
            break
        }
        t.Logf("read %d bytes", n) // buf[:n] is the data read from conn
    }
    conn.Close()
}
 
cs

"Network Programming With Go" 책에서 갖고온 예제 코드입니다.

랜덤한 16MB에 해당하는 바이트를 만들고 그것을 보내고 (rand.Read(payload)를 통해서 payload에는 랜덤한 16MB 바이트가 생성됩니다.)
읽는 입장에서는 512KB의 버퍼 사이즈를 가지고 읽어내는 코드입니다. 

해당 코드를 실행해보면 아래 같은 출력이 나오게 됩니다.

출려 내용을 보고 왜 버퍼 사이즈는 512KB로 고정되어있는데 출력되는 bytes가 다른지 라는 의문이 들 수 있습니다.

우선 버퍼 사이즈는 무조건 512KB씩 읽어내는게 아니라 최대 512KB까지 읽어내는 것을 뜻합니다.

그리고 tcp로 네트워크 통신을 할 때 패킷별로 전송을 하게 되는데 읽는 입장에서는 패킷 하나씩을 읽어내는 것입니다. 즉 패킷별로 사이즈가 조금씩 다를테니 읽는 입장에서도 읽어야하는 bytes가 달라지게 되는 것입니다.