Monday, June 28, 2010

FIle system trong Linux /dev

/dev
Các thiết bị trong Linux đều đc biểu diễn dưới dạng các file. Các file này được lưu tại path: /dev
Các thiết bị ở đây có thể là các thiết bị nhập/xuất. CHúng thường đc biểu diễn dưới dạng ký tự bao gồm 1 phần là ký tự biểu trưng cho thiết bị, còn 1 phần ký tự biểu trưng cho khối trong thiết bị đó. Nói chung, Linux có cách đặt tên các thiết bị sao cho khi ta nhìn vào có thể thấy đc rằng ký tự đó nói đến thiết bị nào!:D
Linux có cơ chế phân chia để đặt tên cho các thiết bị. Các thiết bị lưu trữ như hdd, floppy disk...đều có cách đặt tên để có thể phân biệt với nhau.

Thursday, June 24, 2010

TCP:Sequence & Acknowledgement Numbers

Như ta đã biết thì TCP là 1 giao thức hướng kết nối. 2 thông số Sequence and Acknowledgment number là 2 trong số những chi tiết nói lên sự hướng kết nối của TCP. Khi sử dụng TCP để truyền dữ liệu thì nó sẽ giúp cho dữ liệu đc liền mạch, ko bị mất mát dữ liệu trong quá trình truyền tin.
TCP sử dụng 1 số cơ chế như timout, retransmission, sequence để bảo đảm ko có lỗi trong quá trình truyền.Khi hết 1 khoảng thời gian quy định mà vẫn chưa nhận đc ACK thì dữ liệu sẽ đc truyền lại với ACK là ACK ngay sau ACK cuối cùng đc truyền.
Mỗi hệ điều hành có 1 cách để tính toán sequence number khác nhau. Mỗi hệ điều hành có thuật toán riêng để tạo ra các số đó, số này sẽ đc dùng để đảm bảo việc truyền dữ liệu.
Cả Acknowledgment and sequence number đều sử dụng 32bit cho nên sẽ có 2^32~4,3 tỉ trường hợp có thể có của các số này.
-Initial sequence number(ISN)
Khi 2 host muốn có 1 kết nối, điều đó cũng đồng nghĩa với việc sẽ phải tạo ra 1 số ban đầu để có thể bắt đầu một phiên kết nối, số này gọi là Initial sequence number(ISN)
ISN là giá trị của sequence number đc khởi tạo khi bắt đầu 1 phiên kết nối. Đây là 1 mối nguy cơ của việc session hijacking.
Ý tưởng của việc này đó là:
Hacker là kẻ "đứng giữa" 2 máy đang kết nối với nhau, 2 host này muốn kết nối thì trước tiên sẽ phải tao ra ISN để có thể đạt được 1 kết nối thành công giữa 2 host này. Việc của hacker là đứng ở giữa, sniff các gói tin, đoán đc thuật toán tạo ra ISN, sau đó tấn công chiếm đoạt phiên kết nối!
Giả sử ta có 2 host là hostA-client, hostB-server chuẩn bị khởi tạo kết nối với nhau.Ở đây host muốn khởi tạo kết nối là hostA.
Khi muốn tạo 1 kết nối với hostB, hostA sẽ dùng 1 thuật toán của riêng OS nó đang sử dụng để tạo ra sequence number, gói tin TCP này sẽ bật cờ SYN lên, với sequence number đã đc tạo ra, nó sẽ gửi đến hostB.
Lúc này hacker là kẻ đứng ở giữa, nó sẽ cố gắng sniff gói tin, sao cho có thể đoán đc thuật toán của việc khởi tạo này.Một khi đã thấy đc thuật toán thì việc đoán đc gói tin tiếp theo với sequence number nào la ko khó.
Khi đã có đc thuật toán và đoán đc sequence number tiếp theo thì nó sẽ tiến hành hijack phiên kết nối. THời gian đóng vai trò khá quan trọng, cho nên nó sẽ cùng lúc tiến hành việc gửi các gói tin trông có vẻ đúng tới hostB, đồng thời cũng sẽ gửi các thông tin rác đến hostA, làm hostA ko thể có khả năng tiếp tục phiên kết nối với hostB. Như vậy hacker đã thành công trong việc chiếm đoạt phiên kết nối!
-Ví dụ về ACK number and SYN number
Bây giờ ta sẽ xem xét về tính kết nối tin cậy của TCP

Xét ví dụ 2 host truyền tải thông tin sử dụng TCP với nhau
hostA--------------------------------------hostB
step1: ------------------------------------>
step2: <-----------------------------------
step3: ------------------------------------>
step4: ------------------------------------>
đây là quá trình bắt tay 3 bước giữa 2 hostA và hostB.
Ta sẽ xem xét theo từng bước
Step1:
HostA muốn khởi tạo 1 phiên kết nối, nó sẽ gửi 1 gói tin với cờ SYN đc bật lên và 1 số sequence number(A) đc tạo ra. Lúc này ACK =0
Ta có thể hiểu ngắn gọn rằng hostA nói:'Tôi có thể có 1 phiên kết nối với anh ko?Sequence number của tôi là A'
Step2:
Khi hostB nhận đc yêu cầu từ hostA, nó sẽ xem xét khả năng của nó có thể đáp ứng đc yêu cầu của hostA hay ko!?Nếu đc nó sẽ gửi trả lại 1 gói tin hồi đáp với Sequence number là B và ACK là A+1.Gói tin này sẽ có cờ SYN và ACK đc bật lên. Điều đó cũng nói rằng, hostB đã xác nhận là gói tin này nó gửi là để hồi đáp lại gói tin với sequence number mà hostA mới gửi cho nó!
Khi này thì hostB đã giống như:'Tôi đã nhận đc gói tin yêu cầu của anh, tôi có thể kết nối với anh. Sequence number tiếp theo so với sequence number của anh mới gửi cho tôi là A+1, và ACK của tôi là B'
Khi này rõ ràng hostA sẽ nhận ra đây là gói tin dành cho yêu cầu mới gửi thông qua sequence number mà hostB gửi trả lại cho nó!
Step3:
Khi hostA đã nhận đc gói tin mà hostB vừa gửi thì cũng là lúc nó sẽ tạo ra 1 gói tin để kết thúc việc xin xỏ kết nối này. HostA sẽ tạo ra gói tin với cờ ACK đc bật lên, sequence number lúc này sẽ là A+1 và ACK là 1 số C nào đó.
Khi mà hostB nhận đc gói tin này rồi, nó cũng sẽ hiểu rằng 2 bên đã thoả thuận xong, và sẽ bắt đầu kết nối với nhau. Đến đây quá trình bắt tay 3 bước đã hoàn thành. 2 bên có thể truyền gửi dữ liệu với nhau.
Step4:
Đây là giai đoạn truyền dữ liệu. HostA khi đã đc sự cho phép từ hostB thì sẽ gửi lại gói tin với SYN, ACK như ở Step3, những gói tin này sẽ chứa data để gửi sang hostB

Monday, June 21, 2010

Khái quát về TCP

Source: firewall.cx, các tài liệu liên quan trong cuốn TCP/IP Illustrated vol1.
Cung cấp 1 cái nhìn tổng quan về TCP sau đó sẽ đi sâu vào trọng tâm từng phần!
OSI là một mô hình chuẩn và thông minh, hiện tại thì OSI vẫn đc xem là chuẩn giao thức để dựa vào đó nghiên cứu về giao thức sâu hơn.
TRong OSI, mỗi tầng đều có nhiệm vụ riêng của nó, càng lên các tầng ở trên thì các giao thức càng trở nên thông minh hơn và phức tạp hơn
TCP là một giao thức vận chuyển, gọi là vậy bởi vì nó đc đặt tại tầng transport trong OSI và nhiệm vụ chính của nó là lấy dữ liệu từ nơi này đến nơi khác, ko quan tâm đến vị trí địa lý của mạng
Các chức năng chính của TCP:
1.Reliable TRansport
TCP có cơ chế kiểm soát lỗi, khi dữ liệu đc gửi đi, nó sẽ đc TCP bảo đảm rằng, dữ liệu này là hoàn toàn đầy và ko có lỗi. Các thông số đảm bảo này đc thể hiện qua các code trong TCP header sẽ đc đề cập sau.
2.Connection-Oriented
TRước khi truyền dữ liệu giữa các host thì sẽ có 1 kết nối được thiết lập. Khi kết nối đc thiết lập, điều đó cũng đồng nghĩa với việc rằng các hosts cũng đã sẵn sàng để truyền tải dữ liệu cho nhau. Điều này đc làm nổi bật lên bởi quá trình 3-way handshake.
STEP1:HOST A-------------SYN------------->HOST B
STEP2:HOST A<--------SYN,ACK-----------HOST B
STEP3:HOST A------------ACK-------------->HOST B
            HOST A<-----Con. Established--->HOST B


-Bước 1: hostA sẽ gửi 1 thông điệp đến hostB, với cờ SYN đc bật lên với dụng ý rằng 'tôi muốn có 1 kết nối với anh'
-Bước 2:hostB khi nhận đc thông điệp này sẽ xem xét xem có khả năng đáp trả lời yêu cầu đó ko, trong trường hợp đồng ý, hostB sẽ gửi lại cho hostA 1 gói tin với cờ SYN và ACK đc bật lên với dụng ý rằng:'tôi có thể kết nối với anh và đã xác nhận cái SYN mà anh đã gửi trước đó!'
-Bước 3: Sau khi cả 2 bên nhận đc thông điệp của nhau, hostA sẽ gửi 1 gói tin khác đến hostB với cờ ACK đc set lên 1 với dụng ý rằng:'OK, tôi đã xác nhận lại'
Đến lúc này cũng là lúc kết thúc 3-way handshake và kết nối đã đc thiết lập
3.Flow Control
Flow Control đc dùng để khiểm soát dữ liệu lưu thông giữa các hosts đang truyền tải với nhau. Vì 1 lý do nào đó mà 1 trong 2 host không thể ngay lập tức đáp ứng yêu cầu từ bên kia thì sẽ sử dụng flowcontrol để kiểm soát việc lưu thông này, có thể tạm dừng, dừng hẳn hay 1 vài thao tác đại loại vậy...
Ví dụ:
Một webserverA thì sẽ phải cùng lúc đáp ứng nhiều nhu cầu từ phía clients, ta ví dụ rằng ở đây, hostB sẽ là 1 client đóng vai trò là kẻ đc server phục vụ. Ta cũng biết rằng ko chỉ có hostB mới là kẻ đc phục vụ mà còn nhiều clients khác nữa. Khi đó, nếu trong quá trình truyền tải giữa hostB và server mà có nhiều yêu cầu từ clients khác thì rõ ràng server phải đưa ra 1 yêu cầu hostB tạm dừng truyền tải trong 1 khoảng thời gian để có thể đáp ứng đc nhu cầu của tất cả clients
Tổng quát:
HostA(receiver)-----------------------------------------------------HostB(sender)
1st: Data received<------------------------------------------------Data transmitted
2nd: Stop-buffer full, stop sending---------------------------------->(receive signal and stop transmitting)
3rd:Go!(buffer enough, continue transmitting)----------------------->hostB( retransmit)
Data receive<---------------------------------------------------
Khi 1 host nhận đc dữ liệu quá nhanh, nó sẽ ko có đủ khả năng để chứa một lúc hết toàn bộ dữ liệu, thay vào đó nó sẽ để vào 1 nơi trong bộ nhớ gọi là buffer để có thể xử lý đc thông tin. Khi mà buffer này đầy, nó sẽ gửi 1 tín hiệu yêu cầu dừng việc truyền tải lại để có thể xử lý hết đống thông tin trong buffer. Khi đã xử lý đc đống thông tin trong buffer, nó sẽ gửi thông tin sẵn sàng đáp ứng tiếp và có thể truyền tải lại
4.Windowing
Windowing điều khiển xem bao nhiêu thông tin sẽ đc truyền tải giữa 2 điểm cuối
Thử xem xét ví dụ:
Với windowing=1,hostA là host nhận, hostB là host gửi.

Receive 1: hostA<------------------------------------------hostB
Ack 2 :hostA------------------------------------------>hostB
Receive 2:hostA<------------------------------------------hostB
Ack3 :hostA------------------------------------------>hostB

hostB sử dụng window size là 1, điều đó có nghĩa là mỗi lần gửi 1 segment tới hostA thì nó sẽ kèm theo 1 ACK.Khi hostA nhận đc segment thứ nhất, nó sẽ gửi một ACK2 tới cho hostB. ACK2 ở đây đc hiểu rằng hostA đã nhận đc segment1 mà hostB vừa mới gửi cho nó, bây giờ nó đã sẵn sàng để nhận segment tiếp theo....Cứ như thế, lần lượt từng segment đc gửi qua cho hostA, để ý rằng ở đây window size=1 cho nên mỗi lần gửi thì chỉ có 1 segment đc gửi giữa 2 nơi. Còn nếu bị thất lạc hay có lỗi nào đó xảy ra mà hostA ko nhận đc đầy đủ thông tin từ hostB thì sẽ yêu cầu hostB gửi lại thông tin đó. Ví dụ, khi hostB đã gửi segment2 mà lại nhận đc 1 ACK2 từ phía hostA, nó sẽ phải gửi lại thông tin đã vừa mới gửi cho hostA
Bây giờ xem xét đến window size=3:
receive1:hostA<------------------------------------hostB receive2:hostA<------------------------------------hostB receive3:hostA<------------------------------------hostB
ACK4 :hostA------------------------------------>hostB

Với ví dụ trên thì hoàn toàn khác hẳn. Ta có window size=3, điều đó có nghĩa rằng hostB có thể gửi cùng lúc 3 segment đến hostA, sau đó hostA sẽ gửi lại cho hostB 1 ACK là ACK=4, điều đó cũng đồng nghĩa với việc hostA đã xác nhận là nó đã lấy đc đầy đủ thông tin của 3 segments vừa rồi!Khi đã nhận đc ACK4 thì hostB sẽ tiếp tục gửi 3 segment tiếp theo...
5.Acknowledgements
Đây là cơ chế để TCP đc gọi là 1 giao thức đáng tin cậy. Acknowledgments là cách để 2 bên truyền/nhận có thể nhận đc đúng dữ liệu mà ko bị lỗi hay bị chồng chéo lên nhau.Với bất kỳ lỗi nào xảy ra trong quá trình truyền gây mất mát dữ liệu phải truyền lại khi đủ/đúng dữ liệu
Khi các segments đc gửi đi, bên gửi phải nhận đc 1 thông tin xác nhận rằng dữ liệu đã đc gửi thành công thì nó mới truyền tải thông tin tiếp theo.
received:hostA<------------------------------------hostB send1 received:hostA<------------------------------------hostB send2 received:hostA<------------------------------------hostB send3 ACK4------------------------------------------------>ACK received
received:hostA<------------------------------------hostB send4
received:hostA<------------- LOST-------------hostB send5
 received:hostA<------------------------------------hostB send6
ACK5------------------------------------------------>ACK received
received:hostA<------------------------------------hostB send5 ACK7------------------------------------------------>ACK received
.....
Ở trên ta thấy rằng 2 host truyền với nhau với window size=3. Khi đó, hostA sẽ nhận 1 lúc 3 segment từ hostB, khi đã nhận đủ 3 segments nó sẽ gửi lại ACK4.Đến lần thứ 2, tiếp tục như lần thứ 1, nhưng lần này có lỗi xảy ra với segment thứ 5, hostA ko thể nhận đc và đã gửi lại ACK5 cho hostB, với dụng ý rằng:'segment thứ 5 chưa nhận đc, gửi lại cho tôi!'. Khi đó hostB nhận đc ACK5 từ hostA và sẽ gửi lại thông tin trong segment thứ 5 cho hostA, sau đó hostA gửi lại ACK7, tiếp tục với 3 segments tiếp theo...
Đây chính là cách mà TCP đảm bảo dữ liệu truyền tải sẽ ko bị mất mát hay bị lỗi trong quá trình truyền.

Saturday, June 5, 2010

Bookmark các câu lệnh trong Linux

Đây là nơi tôi ghi nhớ các câu lệnh khi làm việc với LInux.
+fuser: to identify processes using file or socket.
---Usage---
When you try to umount some mount point, maybe receive an error alert like: Device is busy...So, you can identify what processes using mount point, and use kill to kill that process...
+df: disk free
---Usage---
To view the space and state of all partitions
+rpm: install/uninstall software with rpm package
---Usage---
Some useful and often using option:
-Try to uninstall a software when unknown the full name of that package.
use: rpm -qa | grep
ie:when you want to uninstall VMware
command: rpm -qa | grep VM
+ldd
---Usage---
syntax:
ldd [program]
This command will show what library is neccessary for this program.
ex:
[cuong@CentOS5 Ebooks and Documents]$ ldd /bin/bash
linux-gate.so.1 => (0x00e74000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x07471000)
libdl.so.2 => /lib/libdl.so.2 (0x0076d000)
libc.so.6 => /lib/libc.so.6 (0x005e8000)
/lib/ld-linux.so.2 (0x005c9000)
+fsck
---Usage---
Check error for filesystem
+ln
---Usage---
make a link between files
syntax:
ln filename newname
when make link with the path, ln called symbolic link or symlink.
syntax:
ln /path/to/old/file /path/to/new/file
+find
---Usage---
To find files
ex:
find /bin -name ls
How the command above works?!
that command will look up in /bin firectory and find any file that named ls, when found, it will display to screen
+wc
---Usage---
wc-word count-the command to display the whole file. It will display the line, words, bytes of file
ex:
[cuong@CentOS5 27-6]$ ls
text1.txt
[cuong@CentOS5 27-6]$ wc text1.txt
1 6 25 text1.txt

As you see, wc counts the line, words, and bytes of text1.txt: 1 line, 6 words, 25 bytes
+tail
---Usage---
Print the last 10 lines of file to standard output
ex:

[cuong@CentOS5 27-6]$ wc tex2.txt
15 13 30 tex2.txt
[cuong@CentOS5 27-6]$ tail tex2.txt
t
y
u
w
d
x
h
j
ky
+split: split file into smaller parts 

usage: this command will split a file into smaller parts tha you can specific some characteristics for each parts. Assume i have a file of 12GB, i want split that file into some parts that each part is 4GB to burn into DVD disk, so i could use this option for split command:
#split 4048M myfile  mypart

This command will devide myfile into some smaller files and each file is 4048M(~4gb) and the splitted files name are begin with mypart( mypartaa, mypartab...).

Mount NTFS trong CentOS

CentOS là distro đang sử dụng phiên bản kernel 2.6.18. Mặc định, nó ko hỗ trợ hệ thống file NTFS. Vì vậy, nếu muốn có nhu cầu sử dụng thêm NTFS, bạn sẽ phải làm một số bước.
Đây là thông tin về bản distro tôi đang sử dụng
[root@CentOS5 sdb5]# uname -a
Linux CentOS5 2.6.18-194.3.1.el5 #1 SMP Thu May 13 13:09:10 EDT 2010 i686 i686 i386 GNU/Linux

Chúng ta sẽ xem thử kernel hiện tại mà CentOS đang dùng có hỗ trợ NTFS hay ko?!

[root@CentOS5 /]# ls /lib/modules/2.6.18-194.17.1.el5/kernel/fs/ | grep ntfs
[root@CentOS5 /]#

Như vây, hiện tại thì CentOS chưa hỗ trợ NTFS. Bây giờ chúng ta sẽ cùng làm một số bước để có thể mount các phân vùng NTFS.

-Step1:Cài đặt fuse.
Fuse là gì, các bạn hãy tìm hiểu thêm ở đây http://fuse.sourceforge.net/
Download và cài đặt từ source:
Sourceforge page: http://fuse.sourceforge.net/
Mirror:http://easynews.dl.sourceforge.net/sourceforge/fuse/fuse-2.7.1.tar.gz
-Step2: Cài đặt ntfs-3g
TÌm hiểu thêm về ntfs-3g tại homepage:http://www.tuxera.com/
Mirror:http://tuxera.com/opensource/ntfs-3g-2010.5.22.tgz


Sau khi đã hoàn thành việc cài đặt 2 công cụ trên, chúng ta sẽ thực hiện lệnh mount. Đây là cấu trúc câu lệnh để mount các phân vùng ntfs
[root@CentOS5 /]# mount -t ntfs-3g /dev/sdb5 media/sdb5/

Bây giờ bạn có thể sử dụng các phân vùng này một cách bình thường.


Friday, June 4, 2010

Một số việc cần làm sau khi cài đặt CentOS5

-Add repositories:
Thêm các repo cho CentOS.
http://wiki.centos.org/AdditionalResources/Repositories/RPMForge
-Playing multimedia:
Thêm các codec để chơi multimedia
http://wiki.centos.org/TipsAndTricks/MultimediaOnCentOS
-Một số công cụ:
Scim
Pidgin
Thunderbird
Stardict:dic for stardict:http://www.box.net/shared/cebk3e7q42
VirtualMachine: VirtualBox, VMWare Player(free)
Screen Recording: gtk-recordMyDesktop
PDF reader: evince(included), Adode Reader 9
Remote Desktop: Teamviewer
.CHM Reader: khcmviewer
....