为何你应该知道网络冷知识?为了吹牛灌水?node
固然不系,了解这些冷知识有利于咱们对体系知识差缺补漏,创建建全知识体系。程序员
废话很少说,让咱们来看下哪些是日常不易被注意到的冷知识。tomcat
1~1023的端口都是被系统使用的(由 Internet 号分配机构(Internet Assigned Numbers Authority, IANA)来管理),为了防止冲突咱们通常使用大于10000的端口号。看起来彷佛有些不对,那之间的端口号干什么用了?安全
1024~5000的端口号是用于临时分配给服务器与客户端的。服务器
大于5000的端口用于分配给一些知名的服务器。(如:tomcat 8080等)网络
这些标准服务从Unix时代开始就被规定好了,可是在现实中却并无发现它们被使用过。可能的缘由是过于简单实际中没什么用,那么我为何要介绍它。由于是个冷知识。。。也不全是,我以为若是将这些服务做为TCP与UDP的测试服务,就不须要本身费力的编写一个测试服务了,直接掌握他们就行了。tcp
名字 | 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编写。代码比较简单就不介绍了。ui
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地址实际上是按照A、B、C、D、E五类进行的划分。以下所示:
其中A、B、C又能够分为一类,它是咱们常见的IP地址段。其中绝大部分都是__公有地址__(可以经过公网访问的),每一类又划分一部分做为__私有地址__(做为局域网地址,常见的192.168就在其中)。
D类地址
范围:224.0.0.0-239.255.255.255
做为组播地址之用,其中又可分为三类:
E类地址
范围:240.0.0.0-247.255.255.255
保留,仅做为搜索、Internet的实验和开发之用。
internet(全小写):是用一个共同的协议族把多个网络链接在一块儿。
Internet(首字母大写):指的是世界范围内经过 TCP/IP 互相通讯的全部主机集合
Internet是一个internet,可是internet不等于Internet。
RFC(Request for Comment)是指全部关于Internet的正式标准(能够认为是标准文档),它又分为:
Internet协会(ISOC,Internet Society):推进 Internet发展。
Internet体系结构委员会(IAB,Internet Architecture Board):负责 Internet 标准的最后编辑和技术审核
就如以上的层级关系那样:IRIF与IETF属于IAB,IAB属于ISOC。
本篇文章介绍了:
什么?你说这些知识不够冷,而且你都知道了。
( ̄ω ̄;)emmmm...别打个人脸就行。
公众号二分之一程序员,专一计算机基础的学习,欢迎关注 :)