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.

No comments:

Post a Comment