简体   繁体   English

TCP客户端/服务器数据包丢失

[英]TCP Client / Server packet loss

I'm currently developing a TCP Client and Server in NodeJS. 我目前正在使用NodeJS开发TCP客户端和服务器。 But why do I have a "packet loss" here? 但是,为什么在这里出现“丢包”现象? Look at the screenshot: http://i.imgur.com/YoCtAAV.png 看截图: 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. TCP只是不会发送您期望的数据包。 It sends a stream - like a file. 它发送一个流-就像一个文件。 A file isn't made of packets, it's made of bytes. 文件不是由数据包组成,而是由字节组成。 TCP emulates this behavior. TCP模拟此行为。 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. 因此,当您发送两个“数据包”时,TCP层(TCP库,操作系统,路由器或ISP)可能会将它们组合为一个TCP数据包,或者将它们分解为多个TCP数据包。

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. 正是这种类似于文件流的行为,这就是人们创建更高层协议(例如HTTP或FTP或Bittorrent)的原因,以便对数据包的开始和结束位置进行编码。

TCP doesn't do it for you. TCP不会为您做这件事。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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