你須要知道的網絡冷知識

你須要知道的網絡冷知識

爲何你應該知道網絡冷知識?爲了吹牛灌水?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操做系統的開放源代碼的超級服務器守護進程),而後進行相關的配置後便可使用服務,步驟以下:學習

  1. 安裝sudo yum install xinetd
  2. 修改目錄/etc/xinetd.d/中的配置文件(stream表明tcp配置,dgram表明udp配置),將其中的disable的yes修改成no便可。
  3. 啓動服務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,然而按照這樣的劃分方式太寬泛。IP地址實際上是按照A、B、C、D、E五類進行的劃分。以下所示:

IP分類

其中A、B、C又能夠分爲一類,它是咱們常見的IP地址段。其中絕大部分都是__公有地址__(可以經過公網訪問的),每一類又劃分一部分做爲__私有地址__(做爲局域網地址,常見的192.168就在其中)。

ABC類IP地址

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。

總結

本篇文章介紹了:

  1. 約定俗稱的端口號規則
  2. 標準簡單服務及檢驗
  3. IP地址分類
  4. 規範:標準化組織、RFC

什麼?你說這些知識不夠冷,而且你都知道了。

( ̄ω ̄;)emmmm...別打個人臉就行。

公衆號二分之一程序員,專一計算機基礎的學習,歡迎關注 :)

公衆號

相關文章
相關標籤/搜索