TCP đã được chỉ ra trước đây với nhiều vấn đề chất lượng nghiêm trọng trong mạng không dây. Liên kết giao tiếp trong mạng cảm biến không ổn định do nhiều nguyên nhân như là nhiễu tín hiệu vô tuyến, tranh chấp kênh truyền và tốc độ gói đến của các node. Hơn nữa đặc tính đa hop cũng làm tăng tranh chấp kênh truyền đáng kể dẫn đến lỗi bít tăng. Trong mạng cảm biến tỷ lệ lỗi bít cao hơn và băng thông thấp hơn các mạng cố định khác. Giao thức chuỗi byte tin cậy TCP được thiết kế cho mạng có dây nơi mà lỗi bít không phổ biến và tắc nghẽn là nguyên nhân chính của việc mất gói tin. TCP xem sự mất gói tin như là dấu hiệu của sự tắc nghẽn, giảm tốc độ gửi và truyền lại gói tin bị mất từ nguồn. Việc mất gói tin trong mạng cảm biến thường do lỗi bít, điều này dẫn đến TCP hiểu các gói bị mất do tắc nghẽn. Vì vậy, TCP sẽ giảm tốc độ gửi thậm chí cả trong trường hợp mạng không bị tắc nghẽn. Hơn nữa, do tỷ lệ lỗi cao nên rất khó để phân phát gói tin tới đích, phải mất vài lần truyền lại để phân phát một gói tin đến đích thành công. Việc truyền lại và cơ chế báo nhận end to end làm cho chi phí truyền lại tốn kém dọc theo các hop trên đường đi giữa nơi gửi và nơi nhận. Việc mất gói tin cũng kích hoạt cơ chế điều khiển tắc nghẽn của TCP dẫn đến quá nhiều quá trình bắt đầu chậm (slow start) làm giảm chất lượng phân phát gói tin. Quá trình này sẽ làm lưu lượng hiệu quả thấp hơn nhiều và thời gian chuyển phát gói trung bình dài hơn.
Trong thực tế, hầu hết các ứng dụng trong mạng cảm biến yêu cầu chuyển phát gói tin cậy và nhanh hơn là lưu lượng cao. Tuy nhiên, hầu hết các phiên bản của TCP đều được thiết kế để đạt lưu lượng cao hơn không phải là chuyển phát gói tin nhanh hơn. Vì vậy cần thiết phải thiết kế lại TCP cho mạng cảm biến để đạt sự chuyển phát gói tin nhanh hơn và tin cậy hơn.
Cơ chế lưu trữ TCP phân tán (DTC) [9] khắc phục các vấn đề trên bằng cách lưu trữ các segment TCP trong mạng cảm biến và truyền lại nội bộ các segment TCP.
2.2.5.1 Giới thiệu chung
Vấn đề cốt lõi của lưu trữ TCP phân tán (DTC) là tránh việc truyền lại end-to-end tiêu tốn năng lượng bằng cách lưu trữ segment TCP trong mạng và truyền lại segment nội bộ từ bộ nhớ các node cảm biến trung gian khi mất gói tin. Về mặt lý tưởng, mỗi node sẽ lưu trữ tất cả các segment và thực hiện truyền lại một cách chính xác từ node cuối cùng đã truyền segment đó trước khi nó bị mất. Tuy nhiên, do nguồn tài nguyên hạn chế của các node cảm biến, ta giả sử rằng mỗi node chỉ có thể lưu trữ một segment. Các node dự đoán để lưu trữ các segment có thể không nhận được bởi các node tiếp theo. DTC chỉ thực hiện trên các node trung gian và không yêu cầu bất cứ sự thay đổi nào trên các điểm cuối TCP. Mỗi node cảm biến đóng vai trò như bộ nhận có thể sử dụng các tính năng TCP tiêu chuẩn sau: Bộ nhận thông báo kích thước gói tin lớn nhất để tránh segment TCP lớn vượt quá dung lượng của các node cảm biến và bộ nhận cũng thông báo kích thước cửa sổ nhỏ để ràng buộc số segment truyền đi.
Hình 2.11: Lưu trữ TCP phân tán
Hình 2.11 chỉ ra ví dụ đơn giản về DTC. Trong ví dụ này, giả sử rằng các node có khả năng phát hiện khi một segment DTC mà chúng đã truyền bị mất. Bộ gửi TCP truyền 3 segment. Segment 1 được lưu trữ bởi node 5 ngay trước khi nó bị loại bỏ trong mạng. Bởi vì node 5 không nhận được báo nhận mức liên kết, nó khóa segment 1 trong bộ nhớ. Tương tự segment 2 cũng được lưu trữ và khóa bởi node 7 trước khi bị loại bỏ. Khi nhận được segment 3, bộ nhận TCP gửi một báo nhận (ACK 1). Ở đây, ta giả sử rằng node 7 không phải truyền lại segment 2 khi nó nhận ACK 1 vì báo nhận này đến quá sớm.
Khi nhận ACK 1, node 5 lưu một bản copy của segment 1 và thực hiện truyền lại nội bộ. Node 5 không phải forward báo nhận về phía bộ gửi TCP vì vậy segment báo nhận không phải di chuyển trên tất cả các tuyến trong mạng. Khi nhận được segment 1 được
truyền lại, bộ nhận TCP báo nhận segment này bằng cách truyền ACK 2. Khi nhận ACK 2, node 7 thực hiện truyền nội bộ segment 2 được lưu trữ trước đó. Theo cách này, bộ nhận TCP thu được hai segment bị loại bỏ bằng cách truyền lại nội bộ giữa các node trong mạng mà không đòi hỏi việc truyền lại từ bộ gửi TCP. Khi báo nhận ACK 4 được forward về phía bộ gửi TCP, các node cảm biến trên tuyến này có thể xóa bộ nhớ và sẵn sàng cho việc lưu trữ các segment TCP mới.
2.2.5.2 Thực hiện DTC
Phần này trình bày phương pháp DTC và đặc biệt là thuật toán lưu trữ và truyền lại các segment.
a, Lưu trữ segment
Vì bộ nhớ của các node cảm biến bị giới hạn, điều quan trọng về mặt hiệu quả của cơ chế là tìm ra phương pháp phù hợp để các node lựa chọn segment để lưu trữ. Hiệu quả mong muốn của thuật toán lựa chọn là các segment được lưu trữ tại các node gần với bộ nhận nhất có thể và các node gần với bộ nhận hơn lưu trữ các segment với số thứ tự thấp hơn. Để đạt được điều này, mỗi node lưu trữ các segment TCP với số thứ tự lớn nhất và quan tâm đến các segment lưu trữ có khả năng sẽ bị loại bỏ dọc theo tuyến đường về phía bộ nhận. Mỗi node sử dụng phản hồi từ lớp liên kết dữ liệu nơi sử dụng báo nhận tích cực để suy ra các segment bị loại ở các hop tiếp theo. Một segment TCP được forward nhưng không nhận được báo nhận lớp liên kết dữ liệu có thể đã bị mất trong quá trình chuyển tiếp. Vì vậy, segment này bị khóa trong bộ nhớ và sẽ không bị ghi đè bởi một segment TCP với số thứ tự cao hơn. Một segment bị khóa bị loại bỏ từ bộ nhớ chỉ khi một báo nhận báo rằng segment lưu trữ đã được nhận hoặc khi các segment hết hạn.
b, Phát hiện gói bị lỗi và truyền lại nội bộ
Để tránh việc truyền lại end to end, DTC cần phải đáp ứng nhanh hơn với các gói bị loại bỏ so với TCP thông thường. DTC sử dụng timeout (thời gian chờ) và báo nhận lặp lại trong cơ chế TCP thông thường để phát hiện mất gói tin. Mỗi node tham gia DTC duy trì một trạng thái TCP mềm trong liên kết giữa các node. Ta giả sử các tuyến tương đối ổn định và đối xứng và vì vậy các node có thể ước lượng trễ giữa các node và các điểm cuối kết nối. Mỗi node đo thời gian khứ hồi (RTT) tới bộ nhận và thời gian chờ (timeout) tương ứng là 1.5 RTT. Điều này đảm bảo giá trị timeout truyền lại nhỏ hơn đối với node gần đích và cao hơn so với node gần nguồn. Khi giá trị RTT ước lượng bởi các node thấp hơn so với ước lượng bởi điểm cuối TCP, các node trung gian có thể sử dụng giá trị timeout thấp hơn và thực hiện việc truyền lại sớm hơn so với các điểm cuối liên kết. Node DTC đặt bộ định thời cho truyền lại nội bộ khi chúng khóa một segment trong bộ nhớ.
Trong TCP, báo nhận lặp lại báo hiệu cả việc mất gói tin và gửi lại gói tin. Một bộ gửi TCP sử dụng ngưỡng của 3 báo nhận lặp lại để báo hiệu mất gói tin. Khi mỗi node DTC kiểm tra số thứ thự TCP của các segment được chuyển tiếp, các node này có thể phỏng
đoán về tổng số gói tin gửi lại. Nếu nhận thấy yêu cầu gửi lại gói tin không thông dụng trong mạng, các node có thể giảm ngưỡng báo nhận lặp lại. Hơn nữa, DTC cố gắng tránh việc truyền lại lỗi do báo nhận sai về dữ liệu mới cũng như báo nhận báo hiệu mất gói tin như được chỉ ra trong hình 2.12.
Hình 2.12: Việc truyền lại sai
Các node ước lượng thời gian khứ hồi để phân biệt giữa báo nhận báo phát hiện mất gói tin và báo nhận dữ liệu mới.
c, Báo nhận lựa chọn
DTC sử dụng lựa chọn TCP SACK để vừa phát hiện mất gói tin vừa đóng vai trò như cơ chế báo hiệu giữa các node DTC. DTC thông tin cho các node khác về các segment bị khóa trong bộ nhớ của chúng. Khi nhận một ACK TCP với số báo nhận nhỏ hơn số thứ tự của segment lưu trong bộ nhớ, node sẽ thực hiện các hành động sau:
- Nếu số thứ tự (cached) của segment lưu trữ của một node không có trong khối
SACK, node sẽ truyền lại segment lưu trữ. Trước khi truyền ACK TCP về phía bộ
gửi, node thêm cached vào khối SACK. Hơn nữa, cached đầy các khe, ví dụ tất cả
các segment với số thứ tự lớn nhất trong khối SACK đã được báo nhận, node có thể xóa báo nhận.
- Node xóa bộ nhớ nếu số thứ tự của segment có trong khối SACK. Điều này có nghĩa là bộ nhận đã nhận được segment tương ứng hoặc segment đó được lưu trữ và khóa bởi một node gần bộ nhận hơn.
Thậm chí nếu bộ gửi không hỗ trợ SACK, trạm cơ sở hoặc node đầu tiên trong mạng cảm biến có thể thêm hoặc xóa lựa chọn SACK để cho phép báo hiệu SACK cho DTC.
d, Tóm tắt thuật toán
Thuật toán chúng ta đang sử dụng hiện tại cho các node DTC như sau: 1. Nhận gói dữ liệu với số thứ tự seqNr:
Nếu bộ nhớ không bị khóa lưu trữ với tần suất nhất định
Nếu bộ nhớ rỗng lưu trữ
chuyển tiếp trừ khi node đã truyền lại có cùng seqNr trong khoảng thời gian giới
hạn.
đặt timeout ACK mức liên kết
2. Hết thời gian chờ ACK mức liên kết: khóa bộ nhớ
đặt bộ định thời truyền lại
3. Nhận ACK với số báo nhận ackSeq và số thứ tự cached trong bộ nhớ:
cập nhật RTT nội bộ
Nếu ackSeq > cached
Tắt bộ định thời đếm lại Xóa bộ nhớ
3.2 Nếu ackSeq = cached
Nếu thời gian từ lần truyền cuối cùng > RTT nội bộ * hệ số Truyền lại segment được lưu trữ
3.3 Nếu ackSeq < cached đặt lựa chọn SACK Xóa bộ nhớ nếu cached có trong khối SACK Nếu cached không có trong khối SACK
Truyền lại
Thêm seqNr được lưu trữ vào khối SACK
Nếu các khe đầy Bỏ ACK
3.4 Nếu ackSeq < cached và không có lựa chọn SACK và bộ nhớ bị khóa Thêm lựa chọn SACK với seqNr được lưu trữ như khối SACK
4. Trong thời gian timeout truyền lại nội bộ: Truyền lại segment lưu trữ
Đặt bộ định thời truyền lại
Khi một node trung gian nhận được một segment và bộ nhớ không bị khóa, node lưu trữ segment chỉ với xác suất 50%. Điều này dẫn đến sự phân bố các segment được lưu trữ tốt hơn so với lưu trữ mọi segment mới khi bộ nhớ không bị khóa.
DTC xem thời gian timeout mức liên kết như một chỉ báo rõ về segment dữ liệu đã bị mất. Khi hết thời gian chờ báo nhận mức liên kết, DTC khóa bộ nhớ và đặt bộ định thời truyền lại cho việc truyền lại nội bộ các segment lưu trữ.
Hình 2.13: DTC - SACK
Hình 2.13 là ví dụ trong hình 2.11 sử dụng SACK. Khi nhận được segment 3, bộ nhận gửi báo nhận ACK 1 với khối SACK cho segment 3. Khi nhận được báo nhận này, node 7 truyền lại segment 2. Theo hoạt động 3.3, node 7 thêm khối SACK cho segment 2 và forward báo nhận. Cuối cùng node 5 nhận báo nhận này và truyền lại segment 1. Khi tất cả các khe đầy, node 5 loại bỏ báo nhận. Khi đã nhận được segment 1 và segment 2, bộ nhận truyền ACK 4.
Việc sử dụng tùy chọn SACK cho thấy bộ nhận đã nhận segment không theo thứ tự hoặc node gần với bộ nhận hơn đã lưu trữ segment này trong bộ nhớ của nó. Nếu bộ nhận và bộ gửi không hỗ trợ cơ chế SACK, các node DTC có thể thêm vào tùy chọn này.
2.3 Kết luận
Chương này tập trung đã xử lý các vấn đề cụ thể để TCP/IP trở thành một giao thức có thể hoạt động trong mạng cảm biến không dây với các cảm biến có nguồn tài nguyên hạn chế. Một số vấn đề nảy sinh khi sử dụng TCP/IP cho mạng cảm biến không dây: gán địa chỉ IP, chi phí tiêu đề TCP/IP, định tuyến địa chỉ trung tâm, giới hạn node và hiệu quả về năng lượng và hiệu suất TCP. Các giải pháp để giải quyết các vấn đề này là: cơ chế gán địa chỉ IP theo không gian trong đó các node xây dựng địa chỉ dựa vào vị trí không gian của chúng, nén tiêu đề theo ngữ cảnh dựa vào bản chất chia sẻ ngữ cảnh trong mạng cảm biến, định tuyến ứng dụng phủ cho phép thực hiện định tuyến dữ liệu trung tâm và tập trung dữ liệu và cơ chế lưu trữ TCP phân tán cải thiện chất lượng TCP và hiệu quả năng lượng. Sự tích hợp TCP/IP vào mạng cảm biến không dây cho phép truyền thông thông suốt giữa WSN và mạng TCP/IP mà không cần các thiết bị trung gian như proxy hay gateway dẫn đến giảm thời gian xử lý và chi phí thực hiện.
CHƯƠNG 3: PHÂN TÍCH, ĐÁNH GIÁ CÁC GIẢI PHÁP ĐỀ XUẤT
3.1 Đánh giá các giải pháp để sử dụng TCP/IP cho mạng WSN 3.1.1 Gán địa chỉ IP theo không gian
Gán địa chỉ IP cho mỗi node mạng là một vấn đề quan trọng khi áp dụng TCP/IP trong mạng cảm biến không dây. Các cơ chế gán địa chỉ trong mạng IP thông thường không phù hợp với mạng cảm biến phạm vi rộng. Ở chương II ta đã giới thiệu hai cơ chế gán địa chỉ IP: gán địa chỉ theo không gian (SIPA) và gán địa chỉ quét dòng (SLIPA) dựa vào vị trí tọa độ của mỗi node.
Với cơ chế SIPA, mỗi node tập trung và gửi thông tin về vị trí của nó tới trạm cơ sở. SIPA chọn tọa độ (x,y) của node để tạo hai octet cuối cùng trong địa chỉ IP. Trong phương pháp này, SIPA đã tận dụng được mối quan hệ giữa các vị trí không gian để tạo ra giao thức định tuyến và không cần server trung tâm hoặc giao tiếp giữa các node cảm biến. Tuy nhiên, trong cơ chế này không có sự đảm bảo địa chỉ mỗi node là duy nhất vì hai hoặc nhiều hơn các node cảm biến lân cận có thể có cùng địa chỉ IP. Cơ chế gán địa chỉ theo đường quét đã khắc phục được nhược điểm của cơ chế SIPA với mỗi node có một địa chỉ duy nhất. Trong phần này ta sẽ so sánh hai cơ chế này thông qua các đồ thị trong mô phỏng của tác giả Ray-I Chang [5] và đánh giá hiệu quả của cơ chế gán địa chỉ trong mạng cảm biến so với các mạng IP truyền thống.
Thông qua ví dụ mô phỏng này, ta đánh giá và so sánh sự thành công trong việc gán địa chỉ của cơ chế SIPA và SLIPA. Việc gán địa chỉ không thành công nếu hai hoặc nhiều hơn các node có cùng địa chỉ. Thuật toán được thực hiện 1000 lần để tính toán tỷ lệ gán thành công và tăng số node cảm biến cho tới khi tỷ lệ thành công giảm 0%. Hai phân bố khác nhau của các node cảm biến áp dụng cho thuật toán này là phân bố ngẫu nhiên và phân bố theo chiều dọc. Dải phân bố của các node như sau:
- Phân bố ngẫu nhiên: Xm = 0~255, Ym = 0~255. - Phân bố theo chiều dọc: Xm = 122~131, Ym = 0~255.
Kết quả mô phỏng thu được thể hiện trong hình 3.1 và hình 3.2 với đồ thị màu xanh biểu diễn SIPA và đồ thị màu đỏ biểu diễn SLIPA. Với các node phân bố ngẫu nhiên, tỷ lệ gán thành công trong SIPA giảm dần với số node tăng từ 1 đến 1000 node và SLIPA