简体   繁体   中英

TCP Client / Server packet loss

I'm currently developing a TCP Client and Server in NodeJS. But why do I have a "packet loss" here? Look at the screenshot: http://i.imgur.com/YoCtAAV.png

Client Code:

console.log('Starting Client...')

var net = require('net')

var client = new net.Socket()

client.connect(3000, '127.0.0.1', function() {
    console.log('Connected to server on 127.0.0.1:3000')

    var packet
    for (i = 0; i <= 20; i++) {
        packet = new Buffer(4)
        packet.writeUInt32LE(i, 0)
        client.write(packet)

        console.log('Packet Counter sent: ' + i)
    }
})

client.on('error', function(e) {
    if(e.code == 'ECONNRESET') {
        console.error('Connection abnormally closed')
    } else if(e.code == 'ECONNREFUSED') {
        console.error('Connection refused. Server down?')
    } else {
        console.error('Unhandled error occured:')
        console.error(e)
    }
})

client.on('close', function() {
    console.log('Connection closed')
})

Server Code:

console.log('Starting Server...')

var net = require('net')

var server = net.createServer(function(session) {
    console.log('Connection opened')

    session.on('data', function(packet) {
        var packet_counter = packet.readUInt32LE(0)

        console.log('Packet Counter received: ' + packet_counter)
    })

    session.on('error', function(e) {
        if(e.code == 'ECONNRESET') {
            console.log('Connection closed')
        } else {
            console.error('Unhandled session error occured:')
            console.error(e)
        }
    })

    session.on('end', function() {
        console.log('Connection closed')
    })
})

server.on('error', function(e) {
    if(e.code == 'EADDRINUSE') {
        console.error('Port 3000 already in use')
    } else {
        console.error('Unhandled server error occured:')
        console.error(e)
    }
})

server.listen(3000, '0.0.0.0')

console.log('Server started on 0.0.0.0:3000')

How to resolve this issue and get the expected output in the Server log?

Packet Counter received: 0
Packet Counter received: 1
Packet Counter received: 2
Packet Counter received: 3
Packet Counter received: 4
Packet Counter received: 5
Packet Counter received: 6
Packet Counter received: 7
Packet Counter received: 8
Packet Counter received: 9
Packet Counter received: 10
Packet Counter received: 11
Packet Counter received: 12
Packet Counter received: 13
Packet Counter received: 14
Packet Counter received: 15
Packet Counter received: 16
Packet Counter received: 17
Packet Counter received: 18
Packet Counter received: 19
Packet Counter received: 20

There's probably no packet loss. TCP just doesn't send packets like how you expect. It sends a stream - like a file. A file isn't made of packets, it's made of bytes. TCP emulates this behavior. So when you send two "packets" the TCP layer (either your TCP library, or the OS or your router or your ISP) may combine them into one TCP packet or break them into multiple TCP packets.

To really know if there's packet loss you have to check the total size of received data vs the total size of sent data.

It is this file-stream-like behavior that is the reason people create higher layer protocols such as HTTP or FTP or Bittorrent - to encode where a packet start and end.

TCP doesn't do it for you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM