Bài viết mới nhất


Chào các bạn,

Đã lâu rồi mình không viết bài về C# nhỉ :D, hôm nay nhân lúc đang làm đồ án môn Thiết kế phần mềm, cần sử dụng OOPinheritance,.. khá nhiều, mình xin viết một article nho nhỏ về hàm dựng (constructor) trong tính kế thừa của C#.



Theo nguyên tắc, khi khởi tạo đối tượng của lớp con, thì hàm dựng (constructor) của lớp cha sẽ được gọi trước, sau đó mới tới đổi tượng của lớp con.

Ví dụ mình có class Base Child kế thừa từ lớp Base như sau:


Thì khi Run, chương trình sẽ cho kết quả như sau:


Rõ ràng constructor của lớp Base đã được gọi trước! 

Chúng ta có thể kiểm tra các trường hợp khác:
 - Cho lớp Base thành abstract.
 - Sửa lại hàm Main, khởi tạo đối tượng bằng Child c = new Child();

Tất cả đều cho kết quả tương tự.

Chúng ta tiếp tục thử một trường hợp đặc biệt khác, thêm một constructor mới chứa tham số vào class Base Child như sau:


Run chương trình, chúng ta được kết quả sau:


Ở đây bạn thấy, dù chúng ta tạo đối tượng với constructor có tham số, thì constructor cơ bản của lớp Base luôn được gọi.
Bây giờ nếu bạn xóa đi constructor cơ bản (không tham số) của lớp Base và Run chương trình thì sẽ bị lỗi ngay lập tức.


Từ đó ta rút ra các kết luận sau:

Về vấn đề lỗi khi xóa constructor cơ bản của lớp Base: Khi một class được tạo ra, nếu class đó chưa có constructor, Visual C# sẽ tự động generate một constructor mặc định (không tham số) cho chúng ta, vì nếu không làm vậy chúng ta sẽ không thể tạo một object mới thuộc class đó rồi :D. Tuy nhiên nếu bạn tạo thêm một constructor khác có tham số, và xóa constructor mặc định cơ bản đi, thì Visual C# sẽ cho rằng class của bạn đã có thể tự tạo một object mới và sẽ không generate constructor mặc định. Điều đó đồng nghĩa với việc các object được tạo bằng cách gọi "new Base()" sẽ không thể khởi tạo.

Về vấn đề chính về constructor trong kế thừa mình muốn nói là khi bạn khởi tạo một đối tượng lớp con Child, thì C# sẽ automatically gọi constructor mặc định-không tham số của lớp cha Base trước, sau đó mới gọi constructor của lớp con (constructor nào của lớp con thì còn tùy mình new đối tượng với tham số gì :D).


Tại sao lại như vậy?

Theo ý kiến chủ quan của cá nhân mình, thì bạn cứ tưởng tượng lớp con Child là một "cụ thể hóa" của một lớp cha, giống như một chiếc xe, trước khi thành một chiếc xe nó phải qua công đoạn lắp ráp khung xe, thì KhungXe đó chính là lớp cha. Mà để tạo khung xe thì phải dùng constructor của KhungXe, trong đó sẽ gọi các hàm ráp, hàn, bắt ốc,... Sau khi đã xong phần khung xe, ta gọi constructor của XeMay gọi các hàm gắn bánh, gắn yên xe,.. giúp tạo thành một chiếc xe hoàn chỉnh.
Vậy thứ tự gọi thực sự logic và thực tế đúng không nào?

Nếu bạn muốn gọi constructor có tham số cụ thể của lớp cha theo ý của mình thì sử dụng tự khóa "base" như sau:



Trên là một số kiến thức tổng quát về Lập trình hướng đối tượng (OOP) cho các bạn nào lỡ quên :D.
Minh xin nói luôn một cách tổng quát, trong Java thì hàm dựng của lớp cha cũng sẽ tự động được gọi khi khởi tạo đối tượng của lớp con. Các bạn có thể tham khảo tại đây.



Cuối cùng, mình có một câu hỏi cho các bạn, có cách nào để tạo một đối tượng thuộc lớp con mà không cần gọi hàm dựng (constructor) của lớp cha không? 

Chào các bạn, chúc các bạn học tốt!



Chào các bạn,



Đã lâu rồi mình không viết blog, phần vì cũng lười, phần vì vừa phải làm final project tại CoderSchool. Hôm nay vừa internal demo xong, mình ngồi refactor lại code thì thấy như sau


Nhìn vào đống item ở thư mục 'res/layout' kìa!
Horrible, right?

Lang thang search trên mạng cũng thấy nhiều người có vấn đề giống như mình, như article ở StackOverflow.

Thư mục 'res/layout' của bạn quá lớn? khó kiểm soát? khó tìm kiếm? Hãy tưởng tượng trong lúc đang chạy deadline đầu óc rối bời mà tìm hoài không thấy cái 'item_recently_search.xml' nằm ở đâu? (mình cũng vừa bị T.T)

Ok, dài dòng đủ rồi, mình sẽ hướng dẫn các bạn ngay đây.

Bước 1: Đầu tiên các bạn tạo folder tổng "layouts"
Right-click vào thư mục 'res' -> New -> Directory -> gõ "layouts" (nhớ là có 's' nhé, không là bị trùng đấy)



Bước 2: Tạo các Res Folder tương ứng với các category mà bạn muốn làm.
Chọn 'layouts' folder vừa tạo.
Right-click -> New -> Folder -> Res Folder



Đặt tên cho Res Folder theo category mà bạn muốn làm.
Ví dụ ở một chương trình chat bạn sẽ có các category là "home", "profile" và "chat". Ví dụ mình sẽ đặt tên nó là 'chat' nha.

Khi vừa add xong 1 folder, đợi 1 lát để Gradle update cấu trúc chương trình. Sau đó bạn sẽ thấy một folder 'char' màu vàng tương ứng với folder 'res' nhưng lại không năm trong folder 'layouts'.
Thực chất nó vẫn nằm trong 'layouts' tuy nhiên vì minh chỉ mới add một folder duy nhất là 'chat' nên nó chỉ show 'chat' ra thôi.

Tiếp tục bạn tạo thêm một Res Folder mới tên là 'home' thì cấu trúc cây sẽ bắt đầu hiện ra đúng theo những gì bạn mong đợi: 'home' và 'chat' nằm trong 'layouts'.

Tới đây bạn đã chia thành công thư mục ra thành các category riêng biệt rồi.

Bước 3: Thêm folder 'layout' (không có 's') vào từng sub-folder tương ứng với các category cần thiết và sử dụng chúng bình thường như folder 'res/layout' truyền thống. 
Bạn cũng có thể thêm các folder 'menu', 'drawable', 'anim',... vào từng Res Folder nha.

Bước 4: Build thử chương trình. Bạn sẽ thấy trong tag 'android' của file 'app/build.gradle' xuất hiện đoạn lệnh sau


Đoạn lệnh này tương ứng cho khi bạn add 2 category là 2 Res Folder 'home' và 'chat'.
Nếu không tìm thấy các bạn có thể thêm bằng tay vào tag 'android' nha.


Chúc các bạn thành công và quản lý tốt source code của mình. Bởi vì lập trình còn là một quá trình tạo ra sản phẩm cùng với team nên code style là rất quan trọng. Và những thứ như vậy thường không được dạy ở trường.



Chào các bạn,  ở phần trước mình đã nêu ra tổng quan và 2 ý kiến cho rằng Thiết kế = Hình mẫu và Chức năng. Hôm nay mình sẽ tiếp tục bài viết chia sẻ về thiết kế trong cuộc sống của chúng ta.



Thiết kế = Thương hiệu

Khi một công ty luôn cung cấp ra thị trường những sản phẩm thẩm mỹ và chất lượng, thì thiết kế của công ty đó bây giờ sẽ biến thành thương hiệu. Nó trở thành một phương tiện để kết nối giữa nhà sản xuất và khách hàng của họ. Người tiêu thụ thường chọn gắn bó với một thương hiệu nào đó lâu dài bởi vì những thương hiệu là hiện thân và đại diện cho những giá trị và ý tưởng của họ, thứ mà đã làm họ cảm thấy hấp dẫn và thoải mái khi sử dụng.



Thiết kế = Trải nghiệm

Về cuối thập nên 90s, một thiết kế được gọi là thành công khi nó gây được sự chú ý, và để lại ấn tượng trong ký ức của khách hàng, và những thứ đấy đã trở thành sản phẩm - "sự trải nghiệm"
Hãy lấy những con búp bê làm ví dụ. Nó không chỉ là "mua" một con búp bê nữa, mà bây giờ trẻ em có thể thiết kế búp bê cho riêng mình, trang điểm nó giống như bản thân, cho nó đi shopping, đi spa, nuôi tóc dài,... Nó không còn là "mua" một con búp bê nữa, mà là tạo ra cả một không gian trải nghiệm riêng xung quanh việc mua và sở hữu con búp bê này.
Thiết kế đã vươn lên khỏi tầm của một sản phẩm độc lập hay một thương hiệu, mà nó còn bao gồm cả trải nghiệm của khách hàng!



Trải nghiệm: hãy nghĩ về lần gần đây nhất mà bạn đến rạp xem phim. Trong suốt 2-3h của bộ phim, bạn bị cuốn hút hoàn toàn vào màn ảnh, câu chuyện và những cảm xúc vui buồn của nhân vật. Khi bộ phim kết thúc bạn cảm thấy mình vừa lấy được một giá trị gì đấy cho cuộc sống của mình: bạn nên trân trọng cuộc sống này hơn? Bạn nên đỗi xử tốt hơn với gia đình và những người mình yêu quý? Hay đơn giản bạn cảm thấy sảng khoái tinh thần.Dù cảm xúc đó là gì đi nữa thì bạn bữa "trải nghiệm" qua một bộ phim, và trải nghiệm đó đã làm bạn hoàn toàn hài lòng vào số tiền đã bỏ ra.

Hiện nay trong lĩnh vực thiết kế nói chung và thiết kế trang web, phần mềm nói riêng, việc lưu tâm tới trải nghiệm của người dùng (User Experience) đã trở thành một vấn đề thực sự lớn và quan trọng. Nó dẫn trở thành một nhóm ngành mới, các nhà thiết kế UX sẽ nghiên cứu và đánh giá cách người dùng cảm nhận về sản phẩm như tính dễ sử dụng, tiện ích, sự hiệu quả, linh hoạt,..
Ví dụ: cái ghế trong rạp có thoải mái hay không, âm thanh quá to hay nhỏ, phòng chiếu có đủ tối hay không,...có ảnh hưởng đến việc xem phim của bạn không?
Lại nhìn rộng thêm nữa, trải nghiệm người dùng không chỉ bắt đầu khi bạn bước vào phòng chiếu mà là khi bạn vừa vào đến cửa rạp bạn đã được chào đón nồng nhiệt bởi đội ngũ nhân viên. Đập vào mắt bạn sẽ là poster và các nhân vật của bộ phim đang chiếu lôi cuốn và gây ấn tượng cho bạn. Khi đó bạn vừa có ý định mua vé xem một bộ phim thì ngay phía trên quầy bán vé là những tấm bảng đen lớn với tên phim, giờ chiếu và tình trạng phòng rõ ràng với nền chữ sáng màu vàng làm bạn cảm thấy ấm áp và được chào đón

Tất cả, tất cả mọi thứ đều tạo nên một hệ sinh thái, một không gian trải nghiệm người dùng



Tư duy thiết kế = Giải quyết vấn đề

Thuật ngữ "design thinking" được phổ biến bởi IDEO và đại học Stanford trong vòng 10 năm trở lại đây. Design thinking liên quan đến một tập hợp các quá trình nhận thức hướng vào giải quyết vấn đề. Các công đoạn của quá trình design thinking bao gồm: Định nghĩa vấn đề, xây dựng sự đồng cảm với người dùng, sinh ra nhiều ý tưởng, tạo mẫu, đưa ra prototype các giải pháp khả thi, thu thập phản hồi, cứ vậy và lặp đi lặp lại. Với cách hiểu này, Design là những thứ gì đó xoay quanh việc giải quyết vấn đề


Tóm lại, Thiết kế là một thuật ngữ dùng để chỉ một sản phẩm hoặc một dịch vụ nào đó trông như thế nào, cách nó hoạt động, cảm xúc của người dùng khi tương tác với nó, những trải nghiệm nào mà khách hàng nhận được, và cách suy nghĩ, tư duy và hành động để giải quyết vấn đề. Đó cũng là sự biểu hiện của Con người!


Bài viết dựa trên "Design and the Self" của blogger Irene Au


Chào các bạn!

Khi bắt đầu với lập trình Android, chúng ta đều được học rằng KHÔNG THỂ truyền tham chiếu của một đối tượng (object references) tới các Activity hoặc fragment. Để đối mặt với vấn đề khó khăn này chúng ta phải "gói" chúng vào một Intent/Bundle.

Truyền những tham số có kiểu nguyên thủy (primitive data types) như là string, integer, float,... qua Intents thì khá dễ dàng trong Android. Tất cả những gì bạn cần làm là "put" dữ liệu với một key duy nhất làm từ khóa vào Intent và gửi nó đến một Activity bất kỳ.

Nhìn vào API, ta nhận ra rằng có hai cách để truyền Java object qua Intent: một là implements Java class đó từ Percelable interface, hai là implements từ Serializable interface. Là một lập trình viên Java/C# chúng ta chắc hẳn đã biết rõ cơ chế hoạt động của Serializable, vậy tại sao ta lại phải bận tâm với Parcelable?

Để trả lời câu hỏi đó, hay tiếp cận rõ hơn để xem tại sao như vậy nhé!




SERIALIZABLE - BẬC THẦY CỦA SỰ ĐƠN GIẢN

Serializable là một interface chuẩn của Java. Vẻ đẹp của Serializable là việc bạn đơn giản chỉ cần đánh dấu một class Serializable bằng cách implements interface đó lên nó và các class con của nó, sau đó máy ảo Java (Java Virtual Machine) sẽ tự động serialize class theo từng trường hợp khác nhau. Đây là một marker interface, nghĩa là không cần phải cài đặt lại bất cứ method nào của khi implements.


Vấn đề xảy ra với hướng tiếp cận này là Java Reflection được sử dụng, và nó làm tiến trình của phần mềm bị chậm đi. Cơ chế này thường hay tạo rất nhiều đối tượng tạm (temporary object) và khi đó cơ chế dọn rác Garbage Collection của Java sẽ hoạt động và tốn tài nguyên máy tính.


PARCELABLE - ÔNG VUA TỐC ĐỘ

Parcelable là một interface riêng của Android, nơi mà bạn phải tự cài đặt các hàm serialization một cách thủ công mà không được sự hỗ trợ từ JVM. Parcelable được tạo ra cải tiến từ Serializable, nó hiệu quả hơn và khắc phục được một số vấn đề tồn tại ở Java Serializable, đó là lý do tại sao đa phần lập trình viên Android ưu tiên sử dụng Parcelable hơn là Serializable.


Theo những gì mình đọc trên StackOverflow, hay theo các google engineers thì đoạn code trên sẽ chắc chắn thực thi nhanh hơn. Một trong các lý do đó là chúng ta đã cài đặt tường minh các hàm thể hiện quá trình serialization thay vì sử dụng Java Reflection. Khi tối ưu hóa như vậy thì cơ chế dọn rác GC của Java sẽ làm việc ít hơn làm chương trình "nhanh" hơn.

Tuy nhiên, rõ ràng cái gì cũng có cái giá của nó. Với hướng tiếp cận này chúng ta sẽ sinh ra một "đống" code khá phức tạp và làm cho những class này rất khó đọc và fix bug, bảo trì.


KẾT QUẢ KIỂM TRA TỐC ĐỘ

Dĩ nhiên, chúng ta đều muốn biết Parcelable nhanh hơn tới mức nào!

Phương pháp:
- Mô phỏng quá trình truyền object vào activity
- Chạy quá trình đó trong vòng lặp 1000 lần
- Chạy trung bình 10 lần khác nhau để tính dung lượng bộ nhớ, cpu chiếm dụng,..
- Các object được test là HCMUSDeveloper IceTeaVietDeveloper ở trên.
- Test trong nhiều thiết bị android (LG Nexus 4 - Android 4.2.2, Samsung Nexus 10 - Android 4.2.2, HTC Desire Z - Android 2.3.3)

Kết quả:

Thời gian thực thi của bộ test (hình ảnh và dữ liệu theo developerphil.com)

Nexus 10
Serializable: 1.0004ms, Parcelable: 0.0850ms - 10.16x improvement.


Nexus 4
Serializable: 1.8539ms - Parcelable: 0.1824ms - 11.80x improvement.


Desire Z
Serializable: 5.1224ms - Parcelable: 0.2938ms - 17.36x improvement.



TỔNG KẾT

Trong ví dụ trên, Android Parcelable tỏ ra nhanh hơn nhiều so với kỹ thuật Java Serializable. Một trong những lý do chính là do Parcelable hoàn toàn tùy chỉnh code, cho phép lập trình viên convert dữ liệu cần thiết thành Parcel trong khi Serialazation convert đối tượng thành một data stream sử dụng Java Reflection API.

Nếu bạn muốn trở thành một lập trình viên giỏi, hãy bỏ thời gian để cài đặt Parcelable bởi vì nó có thể thực thi nhanh hơn từ 4 - 10 lần và sử dụng ít tài nguyên hơn, khiến GC hoạt động ít hơn.

Tuy nhiên trong nhiều trường hợp, sự "chậm chạp" của Serializable không đáng nhắc tới. Hãy thoải mái sử dụng nó đối với những class nhỏ, nhưng hãy nhớ là nó luôn "ngốn tài nguyên" nên hãy giảm thiểu đến mức đáng kể khi cần những đoạn code đẹp - dễ đọc và bảo trì. Còn nếu bạn đang muốn truyền một List với hàng nghìn object, thì sự "chậm chạp" đó sẽ lên tới con số nhiều giây. Và khi đó chuyển động giao diện cũng như hiệu năng của ứng dụng sẽ trở nên khá tồi tệ và đó cũng là lúc bạn cần dùng đến vị cứu tinh dành riêng cho lập trình viên Android - Parcelable.

________________________________________________________________________

Trên là những chia sẻ của mình về hai hướng tiếp cận cho việc truyền object ref. Cảm ơn các bạn đã theo dõi, chúc các bạn học tốt và hãy để lại bình luận bên dưới nhé! 
Bonus cho các bạn 1 tấm hình từ slide của anh Huynh Q. Thao về những tip trong Android Perfomance, đó cũng là lý do và động lực để mình viết bài này :D



Bất cứ nơi đâu chúng ta đến, ta đều bị vây quanh bởi những thiết kế tồi tệ - từ chỗ ngồi của máy bay làm biến dạng tư thế ngồi của chúng ta đến một chiếc xe máy với thiết kế khiếm nhã. Những cảnh quan đã từng là màu xanh của sự sống và bây giờ một màu xám xịt đang dần phủ lên. Môi trường xung quanh của chúng ta chứa đầy những cơ hội bị bỏ lỡ để đem đến sự hài lòng, phấn khích và niềm vui cho cuộc sống con người!

Chỗ ngồi máy bay làm biến dạng tư thế ngồi

Những đồ vật với thiết kế tồi tệ làm chúng ta chậm lại, và làm phiền lòng mọi người - giống như tòa nhà xấu xí của ông hàng xóm làm bạn nhăn nhó mỗi khi nhìn thấy nó, hay cái remote TV với quá nhiều nút bấm, hay chỉ là một phần mềm không thể hoạt động đúng như chức năng của nó.
Những thứ như vậy đa phần là hậu quả của sự hiểu lầm, tham lam, không đồng cảm, thiếu tập trung. Những thiết kế tồi tệ đặc biệt làm phiền lòng con người khi ảnh hưởng rất nhiều tới hành tinh xanh này. Nói có hơi quá, nhưng đôi khi nó có vẻ như đang lấp đầy thế giới này bằng rác rưởi linh tinh.



Cùng với sự trưởng thành của nền công nghiệp thông tin, chúng ta đã chứng kiến sự quan tâm và đầu tư nhiều hơn cho việc thiết kế. Nhiều công ty hiện giữ vững quan điểm cho rằng thiết kế có thể trở thành lợi thế trong việc cạnh tranh với các đối thủ khác. Những hiểu biết của con người về ý nghĩa của "thiết kế" ngày càng trở nên sâu sắc qua từng năm tháng, vượt qua cả thẩm mỹ để đến với những kỹ năng giải quyết vấn đề. Trong những thập kỷ gần đây, trong ngành công nghiệp phần mềm chúng ta cho rằng một sản phẩm là "thiết kế toàn diện" khi sản phầm đó được cho rằng hữu dụng, dễ dùng và hấp dẫn khách hàng. Chúng ta có thể làm tốt hơn vậy - chúng ta cần làm tốt hơn vậy!

Tôi đang muốn ám chỉ điều gì? Trước khi chúng ta đi sâu vào vấn đề, hay để tôi cung cấp cho bạn một vài bối cảnh bằng cách quay trở lại và review những cấp độ khác nhau mà thiết kế có thể được hiểu.


Thiết kế = Hình mẫu

Hầu hết mọi người đều cho rằng thiết kế thì thường liên quan đến thẩm mỹ. Những nguyên tắc phổ quát của cái đẹp, như là Tỉ lệ vàng (Golden Ratio), quy tắc 1/3 (Rule of Thirds) hay là những quy tắc của sự tương đối, căn chỉnh liên kết, tương phản và sự lặp lại thông báo cho tiềm thức của chúng ta rằng vật đó có đẹp hay không. Ở mức độ hiểu biết này đối với thiết kế, chúng ta sẽ nghĩ rằng thiết kế là vẻ ngoài của đồ vật, ví dụ như chiếc xe hơi trông có vẻ chạy nhanh, có vẻ đắt hay có vẻ rất cứng cáp,...




Thiết kế = Chức năng

Tuy nhiên thiết kế không phải chỉ là vật thế đó trông như thế nào mà còn là nó hoạt động như thế nào. Chúng ta xem một vật thể là "thiết kế toàn diện" không chỉ khi nó đẹp mà còn khi nó dễ sử dụng. Thiết kế tốt sẽ giúp cuộc sống chúng ta dễ dàng hơn. tiết kiệm thời gian hơn, và giúp ta không cần phải suy nghĩ nhiều, từ đó giảm thiểu stress trong cuộc sống và giữ gìn ý chí và thiện chí đối với những người xung quanh. Trong trường hợp này, thiết kế  giống như là một cái tủ lạnh - khi nó hoạt động thì mảy may chẳng ai chú ý, nhưng khi nó ngừng hoạt động thì mọi thứ trở nên tệ hại cả lên!

Ở bài tiếp theo mình sẽ đưa đến một khía cạnh hoàn toàn khác của thiết kế, các bạn hay đón xem nhé!
Bài viết dựa trên "Design and the self" của blogger Irene Au


Chào các bạn!

Hôm nay nhân dịp chuẩn bị ôn thi Mạng máy tính, mình xin chia sẻ một số thứ cơ bản về Private và Public IP.


Một địa chỉ IP (Internet Protocol) dùng để nhận biết mỗi máy tính, thiết bị trong mạng. Khi máy tính giao tiếp với nhau trên Internet hoặc trong mạng LAN cục bộ, thông tin được gửi thông qua địa chỉ IP của các thiết bị. Bạn phải cần một địa chỉ IP nếu bạn đang host một server cho phần mềm vừa làm - các máy trạm (client) cần biết địa chỉ IP đó nếu muốn kết nói đến server để sử dụng phần mềm.

Địa chỉ IP thường được chi làm 2 loại: Public và Private. Nếu bạn đang tự hỏi không biết giữa chúng khác nhau như thế nào, thì xin mời đọc tiếp phần tiếp theo.


PUBLIC IP

Public IP là địa chỉ được ISP (nhà cung cấp dịch vụ Internet) cấp và có thế được "nhìn thấy" và truy cập từ Internet. Giống như địa chỉ nhà dùng để nhận thư tín, bưu phẩm vậy. Mỗi public IP chỉ tồn tại độc nhất trên mạng Internet cho cả toàn cầu, vì đó không thể tồn tại hai thiết bị (server, máy tính, router,...) có cùng địa chỉ public IP.
Có thể tìm public IP của mình bằng cách search Google

Đa phần người dùng phổ thông không có quyền kiểm soát địa chỉ public IP của mình, quyền đó thuộc về ISP.

Một public IP có thể là tĩnh (static) hoặc động (dynamic) tùy theo loại dịch vụ của người dùng. Một địa chỉ public IP tĩnh không thay đổi và thường được dùng cho hosting các trang web, hoặc dịch vụ trên Internet. Mặt khác, địa chỉ động được chọn từ một "hồ chứa" các địa chỉ có sẵn và thay đổi mỗi lần người dùng kết nối đến Internet.
Đa số ISPs hiện nay cung cấp địa chỉ IP động cho người dùng!

Ví dụ: Các web server, email server, hay các server game bất kì đa số đều được kết nối trực tiếp từ Internet thông qua địa chỉ public IP. Hoặc ở các mạng gia đình, ký túc xá,... thì router giữ public IP để kết nối trực tiếp đến Internet. Các máy tính, smartphones,... và các thiết bị "đằng sau" của router chỉ sử dụng các địa chỉ private IP để kết nối đến router. Router bây giờ hoạt động như một người trung gian, forward lưu lượng dữ liệu đến các địa chỉ IP cục bộ theo yêu cầu, và đảm bảo dữ liệu gửi/nhận đến các địa chỉ chính xác!
Router - "bộ não" của các mạng gia đình thường gặp

PRIVATE IP

Private IP là các địa chỉ được cấp phát bởi InterNIC cho phép các công ty, tổ chức có thể tạo cho họ một mạng cục bộ riêng. Có ba dãy IP ở class A, class Bclass C được IANA (Tổ chức cấp phát số hiệu trên Internet) dành riêng để đánh địa chỉ private IP.
Các dãy địa chỉ được cung cấp để làm private IP

Private IP dùng để phân biệt các máy tính và thiết bị trong một mạng "riêng" bao gồm mạn
g gia đình, trường học, hoặc các tổ chức, công ty, bussiness LANs trong các sân bay, khách sạn,... Và nhờ đó các thiết bị trong mạng có thể giao tiếp được với nhau.


Một ví dụ khác, một mạng X bao gồm 10 máy tính, mỗi máy được gán địa chỉ IP từ 192.168.1.1 đến 192.168.1.10. Không như public IP, quản trị mạng cục bộ có thể tự do gán IP theo ý thích (nhưng phải thuộc dãy private IP ở trên và theo đúng class đang sử dụng)

Khi một máy tính kết nối đến router và được gán một địa chỉ private IP, các thiết bị cục bộ trong mạng "nhìn thấy" máy tính này qua private IP. Tuy nhiên với private IP thiết bị sẽ không thể kết nối trực tiếp đến Internet được, tương tự các thiết bị "bên ngoài" của mạng cũng không thể kết nối trực tiếp đến thiết bị giữ private IP, mà tất cả phải thông qua router. 
Vì vậy với ví dụ mạng gia đình ở trên, thì ở góc nhìn từ bên ngoài, mọi thiết bị trong mạng gia đình, ký túc xá,.. đều đang giao tiếp với Internet thông qua một địa chỉ IP duy nhất - địa chỉ public IP của router!


Để cho phép truy cập trực tiếp đến thiết bị cục bộ bằng private IP, bạn phải cần sự hỗ trợ của NAT (Network Address Translationhoặc kết nối trực tiếp thiết bị đến Internet mà không thông qua bất kỳ router nào!

Bạn có thể tìm thấy địa chỉ private IP của mình bằng cách mở Command Prompt và gõ ipconfig. Vì hầu hết mạng hiện nay vẫn đang sử dụng IPv4 nên con số xuất hiện ở dòng "IPv4 Address" chính là private IP của bạn. Với mạng gia đình, hầu hết sẽ là 192.168.1.1 hoặc 192.168.1.2.
Private IP class A của nhà mạng ký túc xá

NHỮNG HIỂU LẦM THƯỜNG GẶP VỀ PRIVATE IP


Nhiều người cho rằng private IP là địa chỉ được dùng cho các hành động lén lút trên Internet, và do đó nó không thể bị phát hiện. Nhưng điều đó KHÔNG ĐÚNG!

Không như nhiều người nghĩ, địa chỉ private IP không giống như số điện thoại riêng tư, nó chỉ là một địa chỉ thuộc về một mạng "riêng tư". Trong thực tế không một địa chỉ public IP nào mà không thể bị "trace" - theo dõi, bởi vì chính giao thức TCP/IP này được thiết kế nhằm mục đích công khai và minh bạch!


Contact Form

Name

Email *

Message *

Powered by Blogger.
Javascript DisablePlease Enable Javascript To See All Widget