[ENC28J60] Bài 13: Giao thức TCP – truyền nhận dữ liệu

Trong bài trước, chúng ta đã làm quen với việc đóng mở kết nối của giao thức TCP, tiếp tục bài này mình sẽ hướng dẫn các bạn truyền nhận dữ liệu trong giao thức TCP

Nhận dữ liệu từ client gửi lên

Khi client gửi dữ liệu lên cho server, nó sẽ set cờ PSH|ACK, chúng ta sẽ kiểm tra cờ này trong hàm TCP_read nhé

Tính độ dài của dữ liệu gửi đến

Căn cứ vào trường IP->Totolength để tính độ dài, IP->Totolength là độ dài của gói IP + TCP. Do đó mình sẽ trừ đi 20 ( độ dài mặc định của gói IP) và căn cứ vào trường TCP->dataOfset để tính độ dài phần header của gói TCP

Trường TCP->dataOfset có độ dài 4 bit và là 4bit cao nên mình >>4. Mỗi giá trị trong dataOfset tương ứng 4byte nên ta nhân 4 lên. ( TCP->dataOfset >> 4)* 4 = TCP->dataOfset >> 2

Tóm lại: Độ dài của trường TCP data = Totolength – 20 – ( dataOfset >> 2 )

Sau khi tính được độ dài thì mình sẽ in từng byte data ra màn hình debug bằng lệnh UART_putChar

Phản hồi lại ACK cho client

Khi nhận được gói tin, chúng ta bắt buộc phải phản hồi lại cho client bằng cờ ACK, mình sẽ tận dụng luộn gói dữ liệu client vừa gửi đến và cắt bỏ đi trường TCP->Data và remake lại 1 vài thông tin, cụ thể như sau:

  • Totolength phải giảm đi 1 lượng bằng dữ liệu của TCP vì mình cắt bỏ đi mà
  • Acknowledgement sẽ không phải là + thêm 1 nữa mà phải cộng thêm độ dài của trường TCP->data Như vậy bên client nhận được gói tin ACK sẽ biết chắc chắn là sever đã nhận được đúng từng này data rồi. Còn nếu sai client tự động gửi lại. Bởi cơ chế phản hồi này nên giao thức TCP rất đáng tin cậy

Toàn bộ code xử lí cờ PSH|ACK, các bạn khai báo thêm các biến cục bộ i,datalength trên đầu hàm nhé !

Tiếp tục test gửi thử bằng chức năng TCP Client của phần mềm Hercules

WireShark cũng đã bắt được đầy đủ các gói tin

Viết bản tin phản hồi

Ngay khi nhận được tin nhắn và gửi tra ACK, mình sẽ gọi hàm repply lại

Phần mềm Hercules đã nhận được gói tin phản hồi, tuy nhiên, ở hàm trên, mình mới phản hồi như kiểu UDP chứ chưa kiểm tra lại xem đã gửi thành công chưa, vì như đã nói lúc nãy, TCP có cơ chế gửi và kiểm tra rất chặt chẽ, gửi 1 lúc chưa thấy cờ ACK phản hồi sẽ phải gửi lại. Tuy nhiên vấn đề này không dễ , chúng ta sẽ hoàn thiện nó trong các bài tiếp.

Dowload

Tải code cho bài này tại đây

 

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện 80 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

2 bình luận

Đã đóng bình luận.