爲何你應該知道網絡冷知識?爲了吹牛灌水?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...別打個人臉就行。
公衆號二分之一程序員,專一計算機基礎的學習,歡迎關注 :)