IPv4/v6 数据报文(datagram)的最大长度依赖于MTU (Maximum Transmission Unit)和 Payload Length 的长度。 Payload Length 内容为 16 位宽,它意味着 Payload 的最大字节说不超过 64k,其中包括了头信息和数据(65,507 字节 = 65,535 − 8 字节 UDP 头 − 20 字节 IP 头);对于环回接口(loopback interfaces)这是真的,但对于多数主机和网络来说不太现实。 MTU 能支持数据报文(datagram)的最大值(以目前链路层技术来说)。对于任何连接,IPv4 允许的最小值为 68 的 MTU,推荐值为 576(通常推荐作拨号应用的 MTU),无论他们是完整接收还是碎片接收。 对于 IPv6,MTU 的最小值为 1280 字节,最小碎片缓存大小为 1500 字节。16 字节实在是太小,所以目前链路层一般最小 MTU 大小为 1500。
我们不可能知道一个包可能进过的每个连接的MTU。通常发送一个超过接收端 MTU 大小的数据报文(datagram)会失效。(数据包会被悄悄的抛弃,不会通知发送端数据包没有到达接收端)。 socket.bind(port[, address][, callback])- port 整数
- address 字符串, 可选
- callback 没有参数的函数, 可选。绑定时会调用回调。
对于 UDP socket,在一个端口和可选地址上监听数据报文(datagram)。如果没有指定地点,系统将会参数监听所有的地址。绑定完毕后,会触发 "listening" 事件,并会调用传入的回调函数。指定监听事件和回调函数非常有用。 一个绑定了的数据报文 socket 会保持 node 进程运行来接收数据。 如果绑定失败,会产生错误事件。极少数情况(比如绑定一个关闭的 socket)。这个方法会抛出一个错误。 以下是 UDP 服务器监听端口 41234 的例子: - var dgram = require("dgram");
- var server = dgram.createSocket("udp4");
- server.on("error", function (err) {
- console.log("server error:\n" + err.stack);
- server.close();
- });
- server.on("message", function (msg, rinfo) {
- console.log("server got: " + msg + " from " +
- rinfo.address + ":" + rinfo.port);
- });
- server.on("listening", function () {
- var address = server.address();
- console.log("server listening " +
- address.address + ":" + address.port);
- });
- server.bind(41234);
- // server listening 0.0.0.0:41234
复制代码
|