Port 3000 là gì
Port có thể là một thuật ngữ còn lạ lẫm đối với những bạn không làm trong ngành công nghệ. Vậy thì Port nghĩa là gì và nó dùng để làm gì, giúp được gì cho bạn thì hãy cùng tìm hiểu trong bài viết này. Show Port là gì?Port là giao thức bit 16 đứng đầu (chèn vào phần đầu header) của mỗi gói tin trong giao thức TCP, UDP hay còn gọi là cổng port, nơi quy định các tập dữ liệu riêng biệt. Port là một dạng thuật toán đã được định sẵn và mỗi máy tính cần phải có thì mới có thể nhận và gửi các gói tin đi được. Khi hoạt động Port cũng được quy đổi giống với số bit của bất kì một mã dữ liệu nào đó. Đơn giản thì đây giống như cánh cổng có quyền cho vào hay không với các dữ liệu muốn ra vào hệ thống máy tính của bạn.
Cần 1 địa chỉ IP, bạn xác định được một máy trong một mạng, nhưng nếu chúng chạy cùng nhiều dịch vụ khác nhau thì phải có cách để phân biệt được chúng và lúc này bạn cần đến Port.
Cổng port giúp ngăn chặn, kiểm soát gói thông tin Ví dụ, Server A chạy dịch vụ website, DNS và FTP server, có địa chỉ IP là 211.445.026.16. Máy tính nào khác muốn truy cập vào server A thì đến địa chỉ IP hoặc tên miền của máy chủ A. Nhưng cần phải biết Port để đi đúng đến đích đến website A chẳng hạn hay vì đi sai đến DNS hay FTP của A. Lúc này gói tin gửi đi có IP là 211.445.026.16 kèm địa chỉ Port là 80. Tương tự máy B muốn đến FTP của A thì lúc này địa chỉ IP vẫn thế những Port sẽ là 21. Máy C muốn truy cập DNS của A thì Port là 53, IP giống nhau. Trên thực tế, các ứng dụng thường ẩn Port để giảm sự phức tạp của giao thức TCP/IP. Những chức năng của cổng Port là gì?Tìm hiểu những nhiệm vụ mà Port xử lý trong hệ thống máy tính chủ của bạn. Giúp chọn lọc tinLà một thuật toán mà các máy đều cần phải đăng ký để sử dụng, Port quy định chỉ những tập tin nào mới được phép đi vào máy, tương tự với các tập tin được phép xuất ra khỏi máy. Thao tác kiểm tra khớp cổng bit sẽ giúp bạn kiểm soát và chọn lọc được đâu là tập tin an toàn, đâu là tập đang có vấn đề, từ đó từ chối quyền truy cập. Có khả năng bảo vệ xâm nhập có hại cho máy tínhTừ tác dụng chọn lọc thì điều đương nhiên là Port có một khả năng để chống lại trước những xâm nhập vào máy bạn. Những phần mềm virus, tệp tin xấu, thông tin gây nhiễu sẽ bị loại bỏ ngay lập tức.
Tuy là những chức năng vô cùng cơ bản nhưng lại đóng vai trò rất quan trọng, bạn thử tưởng tượng nếu hệ thống máy chủ thiếu đi Port, thông tin độc hại ra vào tự do và phá hủy đi dữ liệu của bạn. Truy cập FTP server cần qua cổng Port 21 Những loại Port phổ biến hiện nayPort có tổng cộng là 65535 cổng, được chia làm 3 phần: Well Known Port (WKP) bao gồm các Port quy định từ 0 – 1023, quy định cho các ứng dụng như website (Port 80), FTP (Port 21), email (Port 25); Registered Port (RP) bao gồm các Port từ 1024 – 49151; Dynamic/Private Port (D/PP) bao gồm các Port từ 49152 – 65535. Theo quy định của IANA thì WKP và RP phải được đăng ký với IANA trước khi sử dụng.
Thông qua bài viết này, phần nào bạn đã có thể hiểu được cơ bản những thông tin, định nghĩa, công năng của Port là gì, đồng thời đó là yếu tố quan trọng trong hệ thống máy tính của bạn. Hãy nhớ đón đọc thêm các bài viết khác trên blog của Bkhost nhé! Nodejs là một flatform để thiết kế phần mềm, đặt biệt là webserver. Chương trình được chạy trên node sẽ được viết bằng JS. Node chạy trên nền của Chrome's Javascript runtime Engine cho phép việc xây dựng ứng dụng web server nhanh, dễ dàng mở rộng. Node.js sử dụng kĩ thuật điều khiển theo sự kiện (event - driver) và nhập xuất bất đồng bộ (non-blocking I/O) giúp nó nhẹ và efficient, hoạt động tốt cho các ứng dụng sử lý dữ liệu data-intensive realtime. Node bao gồm V8 JS engine của Google và libUV và một số thư viện khác. Nó sử dụng kĩ thuật CommonJS. Ngoài ra nó còn cung cấp môi trường REPL kiểu shell language như python. Mã nguồn webserver đơn giản const http = require('http'); const hostname = '127.0.0.1'; const server = http.createServer((req, res) => { res.setHeader('Content-Type', 'text/plain'); server.listen(port, hostname, () => { console.log(`server running at http://${hostname}:${PORT}/`); Một ứng dụng web Nodejs có thể xử một lúc nhiều request nhờ kết hợp của event loop và stack call của engine. Với mỗi connection được xử lí, callback sẽ được gọi, các connection tới sau có thể sẽ chờ trong event loop tới ghi call stack của connection hiện tại xử lí xong sẽ là connection tiếp theo nằm trong queue. Và Event loop sẽ cứ chạy từ dòng code đầu tiên tới cuối cùng., nếu không có connection nào Nodejs sẽ đơn giản là sleep và để event loop chạy. Cách hoạt động của node không giống với các mô hình web server hiên nay (Các mô hình hiện nay sử dụng cơ chế thread base, gồm nhiều thread để xử lí đồng thời các request của client) vì các mô hình đó rất khó sử dụng và không hiểu quả lắm. Trong Nodejs chỉ có 1 thread duy nhất → không lo bị deadlock bởi vì trong Nodejs nó không có lock và rất ít thứ trong node chạy mà lock chương trình. → Dễ dàng mở rộng. Ngoài webserver HTTP thì Node còn làm được nhiều thứ như là máy chủ TCP chẳng hạn var net = require('net'); net.createServer(function(stream) { stream.write('hello\r\n'); stream.on('end', function(){ stream.end('goodbye\r\n'); Event-Loop, Callback queue, Call-Stack, ... etc ... Là thành phần trong bộ nhớ runtime , chưa thông tin về một subroutine - tập các cấu lệnh giúp chạy một task cụ thể - của chương trình, call stack là kiến trúc trong hầu hết các ngôn ngữ. Vì theo cấu trúc stack → LIFO , các hàm được gọi vào sau sẽ nằm trên cùng của call stack và được sử lí trước , rồi mới xuống dần tới cuối stack. Thường khi chạy một chương trình hàm main() sẽ là hàm nhảy vào stack đầu tiên → Hàm main chạy xong thì cũng là lúc chương trình kết thúc. Nếu trong quá trình chạy hàm main() mà gặp một hàm khác hoặc một opration nào khác thì nó sẽ được push vào call stack và xử lí (nếu là hàm con thì sẽ nhảy vào load hàm con đó, nếu là operation thì xử lí nó). Mỗi một thread có thể chứa một call stack cho thread đó. Javascipt là một ngôn ngữ chỉ một 1 thread (single thread), đồng nghĩa với việc nó chỉ có một call-stack → Trong 1 thời điểm chỉ làm được một việc. Ta đã thấy call-stack chỉ có thể làm được một việc một lúc 😱😱😱, vậy nếu bị blocking thì sao - môt hàm hay một chứ năng nào đó chạy chậmm (for loop 1 → 1B, request network...), thì sẽ ra sao → Call-Stack sẽ bị đứng → App sẽ bị treo cho tới khi task đó hoàn thành (╯°□°)╯. → Nghĩa là ta không thể làm gì được hết, nếu trên browser thì nó sẽ đứng máy, nếu trên node thì nó cũng đứng app luôn. Vậy làm sao 😭😭😭 Ta sẽ quăng cho nó một hàm call-back tới khi nào xong thì nó sẽ gọi hàm đó và xử lí đúng không. Quan trong là nếu đưa vào bức tranh toàn cảnh ở trên, thì hàm call-back của chúng ta sẽ nằm ở đâu. Ở đây là lúc các thành phần như web API (trong node là c++ api) và event loop và callback queue hoạt động. Các hàm Async hay Promise or setTimeout là thuộc phần của API do Node hoặc trình duyệt cung cấp , nó chạy trong một thread khác với runtime của chúng ta. Khi nó chạy xong , nó sẽ đưa hàm call-back vào trong (enqueue) callback queue . Event-loop sẽ có việc là nó sẽ cứ loop, khi trong runtime call-stack rỗng → nó sẽ đưa thứ đầu tiên ( dequeue ) nằm trong callback queue vào trong call-stack ( push ). ES6 trong nodejs và express sử dụng babel-node cli npm install -g babel-cli nhớ là cùng dùng thêm npm install -save-dev babel-eslint import express from 'express'; import favicon from 'serve-favicon'; import logger from 'morgan'; import cookieParser from 'cookie-parser'; import bodyParser from 'body-parser'; import routes from './routes/index'; import users from './routes/users' app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, 'public'))); app.use('/users', users); app.use((req, res, next) => { let err = new Error('Not Found'); if (app.get('env') === 'development') { app.use((err, req, res, next) => { res.status(err.status || 500); app.use((err, req, res, next) => { res.status(err.status || 500); "description": "ES6/ES2015 Express Example", "start": "babel-node ./bin/www", "auto-start": "nodemon --exec \"npm run lint && npm start\" --ignore public/js" "body-parser": "~1.13.2", "cookie-parser": "~1.3.5", "serve-favicon": "~2.3.0" "babel-eslint": "^4.0.10", Cách cung cấp static file app.use(express.static(__dirname + '/public')); .env là file bash → không đuoc chứa khoảng trắng → MONGO = ABC là lỗi mà phải viết sát vào. Các tính năng học thêm được Dùng thư viện thêm file rất dễ dàng. Nếu muốn Id trong mongodb ngắn hơnー > dùng dns module của node, cho khả năng check trang web Để dns lookup được thì không nên có http hoặc https ... Tách url → regex = /^(.*:)\/\/(.*)/; Cách tạo trường tự tăng trong mongodb. onst mongoose = require('mongoose'); const counterSchema = mongoose.Schema({ _id: {type: String, required: true}, seq: {type: Number, default: 0} const Counter = mongoose.model('counter', counterSchema); //Counter({ _id: 'shortLinkShortUrl'}).save(); const shortLinkSchema = mongoose.Schema({ original_url: {type: String}, short_url: {type: Number} shortLinkSchema.pre('save', function(next){ Counter.findByIdAndUpdate( { _id: 'shortLinkShortUrl'}, function(error, counter){ doc.short_url = counter.seq; const ShortLink = mongoose.model('short-link', shortLinkSchema); module.exports = ShortLink; Tạo một model chưa các số thứ tự hiện tại của mỗi opject. (nhớ tạo document) dùng hook pre của schema. Người ta làm link thu gọn kiểu gì. Lấy link → lưu vào database cùng với chuỗi short của nó Khi truy cập vào link short thì redirect tới đường dẫn chính. Để redirect ra một service , website khác hệ thống → cần phải có thêm ‘http’ và ‘https’ Page 2Ở SQL có mối quan hệ 1 - N → bên nosql phải làm sao đây Ta cần chia nó ra thành 3 loại nhỏ hơn Ví dụ có thể là địa chỉ của một người, (ít) nên ta có thể gán nó vào trong model người luôn { street: '123 Sesame St', city: 'Anytown', cc: 'USA' }, { street: '123 Avenue Q', city: 'New York', cc: 'USA' } Ích lợi: không cần phải query nhiều để lấy các thông tin addr như trên Bất lợi: không thể query các thông tin addr một cách độc lập vd là một sản phần có nhiều thành phần được rắp láp lại. Và mỗi thành phần có một số thông tin Bạn có thể query một cách tốt hơn // Fetch the product document identified by this catalog number product = db.products.findOne({ catalog_number: 1234}); // Fetch all the Parts that are linked to this product_parts = db.parts.find({ _id: { $in: }}).toArray(); Ích lợi: vì product_parts nằm trong document riêng → có thể truy cập độc lập Disadvantage: Phải query 2 câu nếu muốn lấy hết các parts của một product ví dụ có thể là hệ thông log - một host có thể có rất rất nhiều log Cách tốt là lưu ObjectId của host trong mỗi log message: 'cpu is on fire!', Cách query có thể như sau host = db.hosts.findOne({ ipaddr: '127.0.0.1'}); last_5k_msg = db.logmsg.find({ host: host.id}).sort({time: -1}).limit(5000).toArray(); |