[英]Quitting client on localhost, without disconnecting a TCP connection to server on localhost (without FIN packet)
[英]TCP Client / Server packet loss
我目前正在使用NodeJS開發TCP客戶端和服務器。 但是,為什么在這里出現“丟包”現象? 看截圖: http : //i.imgur.com/YoCtAAV.png
客戶代碼:
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')
})
服務器代碼:
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')
如何解決此問題並在服務器日志中獲得預期的輸出?
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
可能沒有數據包丟失。 TCP只是不會發送您期望的數據包。 它發送一個流-就像一個文件。 文件不是由數據包組成,而是由字節組成。 TCP模擬此行為。 因此,當您發送兩個“數據包”時,TCP層(TCP庫,操作系統,路由器或ISP)可能會將它們組合為一個TCP數據包,或者將它們分解為多個TCP數據包。
要真正知道是否有數據包丟失,您必須檢查接收數據的總大小與發送數據的總大小。
正是這種類似於文件流的行為,這就是人們創建更高層協議(例如HTTP或FTP或Bittorrent)的原因,以便對數據包的開始和結束位置進行編碼。
TCP不會為您做這件事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.