PDA

View Full Version : Tìm hiểu về TCP/IP



haidh
13-07-2006, 05:37 PM
TCP/IP

TCP/IP gồm 4 lớp giao thức, tương ứng với 7 lớp giao thức của chuẩn ISO OSI. Bốn lớp đó gồm (kể theo thứ tự từ trên xuống dưới): Application layer, Host-to-host layer, Internet layer, cuối cùng là Physical layer. TCP nằm ở lớp thứ 3 (Host-to-host layer), IP nằm ở lớp thứ 2 (Internet layer).

Tên Số thứ tự
Application layer 4
Host-to-host layer 3
Internet layer 2
Physical layer 1

Đi từ trên xuống dưới, lớp ứng dụng sẽ xử lý thông tin và ra lệnh gửi/nhận đến lớp TCP để truyền và nhận dữ liệu.

TCP là viết tắt của Transmission Control Protocol tạm dịch là Cách thức điều khiển truyền. TCP phụ trách việc truyền và nhận dữ liệu. TCP giúp cho lớp ứng dụng (Application layer) sử dụng lớp IP (lớp IP là vì lớp Internet chỉ có IP) (Internet Protocol, tạm dịch Giao thức liên mạng) một cách trong suốt. Điều này có nghĩa là lớp ứng dụng không cần biết đến phần cứng sẽ làm việc gì, ra sao, mà chỉ cần quan tâm đến việc xử lý dữ liệu của riêng mình. TCP cũng đảm trách việc nhận đúng dữ liệu và gửi dữ liệu đó đến đúng chương trình cần nhận. TCP còn có chức năng kiểm tra và sửa lỗi thông qua việc đồng bộ hoá (synchronize) thông tin 2 đầu truyền dữ liệu và lời nhận biết (acknowledgement) từ phía nhận dữ liệu.

Lớp IP đảm trách việc tìm đường tối ưu để gửi dữ liệu qua mạng và đưa dữ liệu xuống cho lớp vật lý (Physical layer).

Lớp vật lý chính thức chuyển dữ liệu thành các bit và truyền dữ liệu vào cáp (cable).
Khi dữ liệu đến thì lớp vật lý nhận dữ liệu, gộp lại thành các bit, byte và chuyển lại cho lớp IP. Đến lượt lớp IP sau khi đã kiểm tra dữ liệu là thuộc về giao thức TCP sẽ trả dữ liệu đó cho lớp TCP (lưu ý, tôi dùng từ "lớp TCP" để chỉ đến giao thức TCP, TCP/IP không có "lớp TCP" mà là "Host-to-host layer", bao gồm TCP và UDP. UDP sẽ được nói ở phần cuối bài).

Nguyên tắc hoạt động:
Mục này giới thiệu cách thức hoạt động của lớp TCP và lớp IP.

Các tính chất của TCP:

- Có tính kết nối (connection oriented) với giao tiếp 3 lượt (3-way handshake).
- Phát hiện và sửa lỗi (error detection & recovery).

TCP là một giao thức có tính kết nối. Điều này có nghĩa là mọi kết nối đều có sự thông tin trước. Ví dụ A muốn kết nối tới B thì A phải thong báo cho B biết trước và đợi trả lời đồng ý từ B. Sự thông tin này diễn ra theo 3 bước (3-way handshake) như sau:

1. A gửi thông điệp muốn kết nối tới B. (SYN)
2. B gửi thông điệp đồng ý kết nối lại cho A. (ACK, SYN)
3. A gửi thông điệp đã nhận được sự đồng ý lại cho B. (ACK)

SYN: synchronize, đồng bộ hoá kết nối.
ACK: acknowledgement, sự nhận biết.

Diễn giải quá trình:

Bước 1: A gửi một SYN message tới B, thông báo cổng (port) cần kết nối tới, dung lượng đường truyền của A, khả năng gửi bao nhiêu thông điệp không cần nhận biết (windowing, giải thích sau), và các thông tin khác.

Bước 2: B nhận được thông tin từ A, nếu chấp nhận kết nối sẽ gửi trả thông báo đã nhận được yêu cầu kết nối từ A và chấp nhận sự kết nối, đồng thời cũng gửi thêm thông tin về B như khả năng gửi bao nhiêu thông điệp không cần nhận biết v.v...

Bước 3: A gửi trả ACK message cho B thông báo rằng A đã nhận được. Kết nối thành công.
Ngoài ra, khi muốn chấm dứt kết nối, bốn bước sau sẽ được thực hiện:

1. A gửi tín hiệu chấm dứt kết nối. (SYN)
2. B nhận tín hiệu và gửi trả tín hiệu cho biết đã nhận. (ACK)
3. B gửi tín hiệu cho Application layer thông báo kết nối sẽ bị chấm dứt đồng thời gửi trả cho A tín hiệu thông báo đồng ý chấm dứt. (SYN)
4. A gửi lại cho B tín hiệu cho biết A đã nhận được thông điệp từ B. (ACK)
Nói tóm lại, TCP có tính kết nối.

TCP có tính phát hiện lỗi vì mọi thông điệp gửi theo TCP đều được kiểm tra thông qua một số nguyên 32 bit cho biết giá trị CRC (Cyclic Redundant Check) của thông điệp được gửi. Bên gửi sẽ tính giá trị CRC và gửi kèm trong thông điệp. Bên nhận sẽ tính lại giá trị đó và so sánh với giá trị do bên gửi gửi đi. Nếu không đúng có nghĩa là đã có sự sai sót xảy ra. TCP có tính sửa lỗi vì khi phát hiện ra sai sót, bên nhận sẽ gửi thông điệp báo sai tới bên gửi, đề nghị gửi lại thông điệp bị sai.

Không phải sau mỗi một thông điệp được gửi đi thì đều có một thông điệp thông báo đã nhận được từ bên nhận gửi trả về. Có thể sau 10 thông điệp được gửi đi thì mới có một thông điệp thông báo nhận được gửi trả. Đó gọi là khả năng gửi không cần nhận biết.
Ví dụ: A gửi cho B 6 lượt, mỗi lượt 1000 bytes, khả năng gửi không cần nhận biết của A là 3, B nhận được thông điệp đầu hoàn chỉnh, thông điệp thứ 2 bị sai, các thông điệp sau bình thường. Quá trình đó sẽ diễn ra như sau:
1. A gửi cho B 3 thông điệp lần lượt.
2. B gửi lại cho A ACK message với giá trị 2000. Nếu B nhận được tất cả các thông điệp hoàn chỉnh, B sẽ gửi lại cho A một ACK message với giá trị 4000 (là giá trị kế tiếp mà A có thể gửi).
3. A gửi lại cho B message thứ 2 (từ vị trí 2000 đến vị trí 2999) và chờ. Lúc này A hy vọng rằng B nhận được thông điệp thứ nhất và thông điệp thứ ba hoàn chỉnh, A sẽ không phải gửi lại toàn bộ các thông điệp từ chỗ bị sai mà chỉ gửi thông điệp bị sai.
4. B gửi lại cho A ACK message với giá trị 4000 cho biết B nhận được 3 thông điệp đầu hoàn chỉnh và A có thể gửi tiếp các thông điệp sau, bắt đầu từ vị trí 4000.
5. A gửi cho B thông điệp thứ 4, 5 và 6.
6. B gửi trả ACK message với giá trị 7000.
Giả sử trong khi gửi thông điệp 4, 5, 6, A chưa kịp gửi thông điệp thứ 5 thì đã nhận được ACK message từ B với giá trị 5000 thì lúc đó window của A sẽ được sửa thành giá trị 3. Nếu A đã gửi thông điệp 4, 5 và nhận được ACK message của B với giá trị 5000 thì window của A được sửa thành 2, A có thể gửi tiếp 2 thông điệp 6 và 7. Có nghĩa là tối đa A có thể gửi ‘window’ lần số thông điệp. Mỗi lần gửi, giá trị window giảm cho đến khi bằng 0. Khi nhận được ACK message, giá trị đó sẽ thay đổi, tăng lên cho đến khi số thông điệp đã gửi đi mà chưa nhận được ACK message bằng giá trị window chính).

Trong quá trình truyền tín hiệu như vậy, nếu bên B cảm thấy có thể nhận được tín hiệu nhanh hơn thì bên B sẽ gửi SYN message lại cho A, thông báo muốn tăng giá trị window lên (giảm thời gian và số ACK message được gửi đi). Bên A sẽ gửi trả ACK message và tự tăng giá trị window lên theo yêu cầu của bên B. Ngược lại, B sẽ đề nghị A giảm giá trị window xuống. Ngoài ra, số lượng thông tin được gửi đi trong mỗi thông điệp cũng có thể thay đổi tuỳ vào đường truyền. Với TCP, lượng thông tin này được đo bằng đơn vị byte. MTU (maximum transmission unit) là số transmission unit (đơn vị truyền) (với TCP được tính là byte) tối đa mỗi thông điệp có thể chứa. Nói tóm lại, sự liên lạc bằng TCP có tính phát hiện và sửa lỗi, cũng như có sự can thiệp một cách tự động của lớp TCP phụ thuộc vào điều kiện đường truyền.

TCP phân biệt các thông điệp gửi cho chương trình này và thông điệp gửi cho chương trình khác thông qua socket. Socket là một khái niệm để chỉ 2 giá trị cần thiết khi khởi tạo kết nối. Đó là địa chỉ IP (IP address) của máy và cổng (port). Giả sử B chạy một server, nhận kết nối ở cổng 80, có địa chỉ IP là 1.1.1.1. A là máy khách, chạy 2 chương trình client để kết nối tới B, A có địa chỉ là 1.1.1.2. Client đầu tiên dùng port 1024, client thứ 2 dùng port 1025. Khi B nhận tín hiệu kết nối từ client thứ 1, B hiểu rằng tín hiệu đó từ địa chỉ IP 1.1.1.2 và từ port 1024. Tương tự, B hiểu client thứ 2 từ socket khác. Như vậy, khi B trả lời A, B sẽ gửi thông tin tới socket tương ứng với client 1 hay 2 của A. Khi A gửi cho B, B cũng biết thông tin đó từ client 1 hay 2 gửi cho mình thông qua việc nhận biết thông tin đó xuất phát từ socket của client 1 hay 2. Quá trình chuyển thông tin cho lớp ứng dụng này được gọi là multiplexing.

Nói thêm về UDP. UDP là một giao thức truyền khác, cũng nằm ở lớp thứ 3 (Host-to-host layer), cũng làm nhiệm vụ như TCP. UDP khác TCP ở chỗ là một giao thức không có tính kết nối, không có sự kiểm tra và sửa lỗi. UDP dựa vào lớp trên (lớp ứng dụng) để làm việc này. UDP viết tắt của Unreliable Datagram Protocol (tạm dịch giao thức truyền không đáng tin). Chương trình sử dụng UDP phải tự cài đặt phần kiểm tra dữ liệu. Tuy nhiên, điểm mạnh của UDP là ở chỗ vì không có nhiều tính toán và các thông tin kiểm tra khác nên UDP nhanh hơn TCP, sử dụng ít bộ nhớ cũng như thời gian của CPU hơn. UDP cũng dùng địa chỉ IP và port để nhận biết và chuyển thông tin cho lớp trên.

IP có chức năng chuyển thông tin đi qua mạng đến nơi cuối. IP làm được việc này nhờ vào một bảng chỉ đường (routing table) dựa trên địa chỉ mạng (network address), không phải dựa trên địa chỉ máy tới) và chuyển thông tin đó tới máy cuối. Trên đường đi, thông tin có thể qua nhiều trạm trung gian (tài liệu cũ dùng từ gateway, tài liệu mới dùng từ router), cũng sử dụng lớp IP để chuyển tiếp (forward) các tín hiệu đó tới các trạm khác gần máy đích hơn.

Cách tính địa chỉ mạng, địa chỉ máy (host address), địa chỉ mạng con (subnet address) và các vấn đề liên quan đến việc đánh địa chỉ sẽ được trình bày trong bài khác.

Tài liệu tham khảo:
- Internetworking with TCP/IP volume I
- TCP/IP illustrated volume I
- Sybex CCNA Study Guide v2.0
__________________
( VNH)