资讯专栏INFORMATION COLUMN

你需要知道的网络冷知识

Sourcelink / 2862人阅读

摘要:因为这些端口号都是从端口号派生出来的,即网络控制协议,是的运输层协议,是的前身。当和成为标准的运输层协议时,每个应用程序只需要一个端口号,因此就使用了中的奇数。

你需要知道的网络冷知识

为什么你应该知道网络冷知识?为了吹牛灌水?

当然不系,了解这些冷知识有利于我们对体系知识差缺补漏,建立建全知识体系。

废话不多说,让我们来看下哪些是平常不易被注意到的冷知识。

端口 端口分类

1~1023的端口都是被系统使用的(由 Internet 号分配机构(Internet Assigned Numbers Authority, IANA)来管理),为了防止冲突我们一般使用大于10000的端口号。看起来似乎有些不对,那之间的端口号干什么用了?

1024~5000的端口号是用于临时分配给服务器与客户端的。

大于5000的端口用于分配给一些知名的服务器。(如:tomcat 8080等)

标准简单服务

这些标准服务从Unix时代开始就被规定好了,但是在现实中却并没有发现它们被使用过。可能的原因是过于简单实际中没什么用,那么我为什么要介绍它。因为是个冷知识。。。也不全是,我觉得如果将这些服务作为TCP与UDP的测试服务,就不需要自己费力的编写一个测试服务了,直接掌握他们就好了。

名字 TCP端口号 UDP端口号 描述
echo 7 7 服务器返回客户发送的所有内容
discard 9 9 服务器丢弃客户发送消息的所有内容
daytime 13 13 服务器以可读形式返回时间和日期
chargen 19 19 当客户发送一个数据报时:TCP服务器发送一串连续的字符流,直到客户中断连接;UDP服务器发送一个随机长度的数据报
time 37 37 服务器返回一个二进制形式的32bit数,表示从UTC时间1900年1月1日午夜至今的秒数

然而使用Linux查询端口占用情况命令netstat -ntulp却发现这些服务都不存在,原因是这些服务都没有被内置到Linux系统中。在CentOS下需要安装xinetd(wiki:一个运行于类Unix操作系统的开放源代码的超级服务器守护进程),然后进行相关的配置后即可使用服务,步骤如下:

安装sudo yum install xinetd

修改目录/etc/xinetd.d/中的配置文件(stream代表tcp配置,dgram代表udp配置),将其中的disable的yes修改为no即可。

启动服务service xinetd start

做完以上的步骤后,使用tcp或udp进行访问云服务器,你可能会发现并不成功。原因是云服务器为了保证安全只开放了一些特定的端口(类似于防火墙的功能),要想这些服务能被访问到,需要将这些端口配置到安全规则中才行。

以下是实验需要用到的TCP与UDP客户端,使用nodejs编写。代码比较简单就不介绍了。

TCP客户端

var net = require("net");

var client = new net.Socket();
//19代表端口号,xxx请换成自己的服务器端地址
client.connect(19, "xxx.xxx.xxx.xxx", function() {
    console.log("Connected");
    client.write("Hello, server! I"m Client.");
});

client.on("data", function(data) {
    console.log("Received: " + data);
    client.destroy(); // kill client after server"s response
});

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

UDP客户端

var dgram = require("dgram");
var mess = Buffer.from("Hello, server! I"m Client.");
var client = dgram.createSocket("udp4");
//19代表端口号,xxx请换成自己的服务器端地址
client.send(mess,0,mess.length,19,"xxx.xxx.xxx.xxx",function (err, bytes) {
    if(err) console.log("Send Err!");
});
client.on("message",function (msg, rinfo) {
    console.log("Received:%s",msg);
    console.log("Server address:%s",rinfo.address);
    console.log("Server port:%s",rinfo.port);
    client.close();
});
client.on("close",function () {
    console.log("onClose");
});

以下是访问标准服务器的结果,能够被预测到的echo和discard就不写出来了

daytime

12 MAY 2019 22:53:57 CST

chargen

TCP

Connected
Received: YZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;<=>?@ABC

Connection closed

UDP

Received:KLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./012345
LMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456
MNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./01234567
NOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./012345678
OPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789
PQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:
QRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;
RSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;<
STUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;<=
TUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;<=>
UVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;<=>?
VWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;<=>?@
WXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456789:;<=>?@A
XYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&"()*+,-./0123456

Server address:xxx.xxx.xxx.xxx
Server port:19
onClose

time

如果按照上面的代码直接进行访问会返回一串乱码。因为其返回的是__4位无符号整形数__代表从__1900年1月1日0时__(不是1970)至今的__秒数__,需要将数据解析部分按照如下方式修改才能获得正确的数值。

var buf = new ArrayBuffer(4);
var view = new DataView(buf);
for (let i = 0; i < 4; i++) {
    view.setUint8(i, data[i]);
}
console.log("Received: " + view.getUint32(0));

结果:3766664509

认真观察,这些端口号都是奇数的。因为这些端口号都是从NCP端口号派生出来的(NCP,即网络控制协议,是ARPANET的运输层协议,是TCP的前身)。 NCP是单工的,不是全双工的,因此每个应用程序需要两个连接,需预留一对奇数和偶数端口号。当TCP和UDP成为标准的运输层协议时,每个应用程序只需要一个端口号,因此就使用了NCP中的奇数。

IP

大家都知道IP地址分为内网IP和外网IP,然而按照这样的划分方式太宽泛。IP地址其实是按照A、B、C、D、E五类进行的划分。如下所示:

其中A、B、C又可以分为一类,它是我们常见的IP地址段。其中绝大部分都是__公有地址__(能够通过公网访问的),每一类又划分一部分作为__私有地址__(作为局域网地址,常见的192.168就在其中)。

D类地址

范围:224.0.0.0-239.255.255.255
作为组播地址之用,其中又可分为三类:

专用地址(局部多播地址,224.0.0.0-224.0.0.255),为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。是被IANA规定的知名多播地址(224.0.0.1:所有组播主机;224.0.0.2:所有组播路由器)

公用地址(预留多播地址,224.0.1.0-238.255.255.255),可用于全球范围(如Internet)或网络协议。

私用地址(管理权限多播地址,239.0.0.0-239.255.255.255),可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

E类地址

范围:240.0.0.0-247.255.255.255
保留,仅作为搜索、Internet的实验和开发之用。

规范

internet(全小写):是用一个共同的协议族把多个网络连接在一起。
Internet(首字母大写):指的是世界范围内通过 TCP/IP 互相通信的所有主机集合

Internet是一个internet,但是internet不等于Internet。

RFC

RFC(Request for Comment)是指所有关于Internet的正式标准(可以认为是标准文档),它又分为:

赋值RFC(Assigned Numbers RFC):列出了所有Internet协议中使用的数字和常数。

Internet 正式协议标准:描述了各种 Internet 协议标准化的现状。

主机需求RFC:详细描述网络的各个层(链路层、网络层、传输层、应用层)

路由器需求RFC:多带带描述了路由器的需求。

标准化组织

Internet协会(ISOC,Internet Society):推动 Internet发展。

Internet体系结构委员会(IAB,Internet Architecture Board):负责 Internet 标准的最后编辑和技术审核

Internet研究专门小组(IRIF,Internet Research Task Force):主要对长远的项目进行研究。

Internet工程专门小组(IETF,Internet Engineering Task Force):负责互联网标准的开发和推动

就如以上的层级关系那样:IRIF与IETF属于IAB,IAB属于ISOC。

总结

本篇文章介绍了:

约定俗称的端口号规则

标准简单服务及检验

IP地址分类

规范:标准化组织、RFC

什么?你说这些知识不够冷,并且你都知道了。

( ̄ω ̄;)emmmm...别打我的脸就行。

公众号二分之一程序员,专注计算机基础的学习,欢迎关注 :)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/11690.html

相关文章

  • android开发案例 - 收藏集 - 掘金

    摘要:在开发者官网栏目中,关于的那些开源掘金摘要自从推出后,其对布局的灵活控制是让开发者们称赞不已。贝塞尔曲线根据年最值得学习的五大开源项目掘金,演示的平移缩放动画,进入和退出动画,界面间元素共享。 安卓开发终极指南: 50 多个初高级开发资源(译) - Android - 掘金编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Androi...

    Shimmer 评论0 收藏0
  • 如何理解比特币和区块链?

    摘要:比特币区块链无疑是当今业界的最热门的。目前,每个成功的矿工获得可能每年更换一次或通过比特币社区决策作为成功向区块链添加一块交易的奖励。填写其他详细信息,例如比特币金额和可选说明。 比特币区块链无疑是当今业界的最热门的。通过这篇博客,我将尽力向大家介绍加密货币比特币的概念,以及它如何创造我们称之为区块链的革命性技术。 这个问题经常引起混淆。这篇文章可以快速解释和清理这方面的混乱! 什么是...

    Kosmos 评论0 收藏0
  • 总结一些JavaScript知识

    摘要:例如要删除数组的第个元素,可以使用这样的语句不过对于大型数组来说,这个函数的效率可能不高。可选参数可以限制被分割的片段数量。看代码吧下面的代码利用的来实现垂直居中和水平居中转自快乐人生,积极进取总结的一些的冷知识 1、!!将一个值方便快速转化为布尔值 console.log( !!window===true ); 2、不声明第三个变量实现交换 var a=1,b=2; a=[b...

    lingdududu 评论0 收藏0
  • 关于css动态样式注入,知道那些知识

    摘要:以上三种动态样式注入,不同的使用场景,各有利弊,至于你想用哪一种,需要你自己权衡,睡觉去啦。。。。 前言 作为一个前端,我们都听过结构,样式,行为分离;关于样式,我们都听过外联样式,内联样式和行内样式;关于这三者,什么权重啊,啊,对了,这些都不会出现在这篇文章里,这篇文章就说一些那些我们不怎么使用的,动态引入css样式的方法; 静态样式引入 前面说过外联样式,内联样式和行内样式,所谓外...

    ztyzz 评论0 收藏0
  • 比特币钱包安全

    摘要:要点提醒确保比特币钱包安全的全部在于确保钱包私钥安全,好消息是,这个你可以采取措施。 本文是有关比特币相关的系列文章,发布于GIT-HUB,地址如下:https://github.com/junahan/JU... 比特币钱包安全概要 有关比特币钱包安全,可以简单的分为两类,一类是做为用户的你不可控制的安全问题,一类是做为用户的你可以控制的安全问题。之所以这样看似废话的区分,提醒你...

    付永刚 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<