Đến đây vẫn chưa ping được nhé, vì ta vẫn chưa viết ngắt timer để phục vụ cho các hàm kiểm tra thời gian timeout và nội dung cho chương trình chính (main()).

Một phần của tài liệu ATMEGA32 GIAO TIẾP VỚI ENC28J60 QUA SPI – AVR WEBSERVER (Trang 54 - 63)

- Gọi hàm ethSendFrame của giao thức ethernet để gửi frame ethernet đị Cuối cùng là 1 hàm dùng cho mục đích debug:

Đến đây vẫn chưa ping được nhé, vì ta vẫn chưa viết ngắt timer để phục vụ cho các hàm kiểm tra thời gian timeout và nội dung cho chương trình chính (main()).

thời gian timeout và nội dung cho chương trình chính (main()).

Giao thức TCP (Transport Control Protocol):

Tiếp theo là giao thức khó chịu nhất trong chồng giao thức TCP/IP. Đó chính là giao thức TCP (Transport Control Protocol)

Nhiệm vụ chính của TCP là đảm bảo dữ liệu đến đích đúng và đủ trên một môi trường truyền tải không đáng tin cậy (IP).

Đến đây có 3 trường hợp xảy ra:

- TH 1: mọi việc suôn sẻ, thư ký bên B nhận được thư, gửi thư trả lời báo đã nhận được thông điệp. Thư ký bên A sẽ hủy bản photo còn lưu dữ, việc gửi thông điệp thành công.

- TH2: bưu điện làm mất thư, bên B không nhận được. Như vậy thư ký bên A chờ 1 thời gian không thấy phản hồi sẽ lấy bản photo ra gửi lại lần nữạ

- TH 3: thư ký bên B đã nhận được và gửi thư báo nhận, nhưng bưu điện lại làm thất lạc thư nàỵ Thư ký bên A được một thời gian không thấy cũng sẽ gửi lạị Khi bên B nhận được thông điệp một lần nữa cũng sẽ gửi báo nhận một lần nữạ

Chú thích:

- Số port đích và số port nguồn: để phân biệt các tiến trình ứng dụng đang xảy ra trong máy tính - Các số sequence và Acknowledgement: số sequence để phân biệt các segment khác nhau trong một dòng dữ liệu, các số Acknowledgement dùng trong cơ chế xác nhận

- Vùng Data offset: chiều dài của Header tính theo đơn vị 32 bit - Một số cờ (flags):

. URG (Urgent): thiết lập 1 khi có dữ liệu quan trọng cần truyền ngaỵ . ACK: cho biết có số xác nhận nằm trong vùng Acknowledgement

. PSH (Push): được thiết lập trong trường hợp dữ liệu nên được giao tức thời . RST (Reset): chỉ thị một lỗi sai và hủy bỏ phiên làm việc

. SYN (Synchronize): trong các bản tin khởi tạo khi thiết lập một kết nối truyền dữ liệu . FIN (Finish): dùng đóng 1 phiên làm việc

- Vùng Window: chỉ ra số lượng không gian bộ đệm khả dụng để nhận dữ liệu - Vùng Checksum: vùng kiểm tra sai cho cả segment

- Vùng Urgent Pointer: chỉ ra chiều dài của dữ liệu urgent - Vùng Options: xác định kích thước cực đại của 1 segment

Cụ thể hơn, vai trò của TCP trong chồng giao thức TCP gồm 3 chức năng chính: điều khiển luồng, kiểm soát lỗi và báo nhận.

- Điều khiển luồng: điều phối tốc độ và kích thước luồng dữ liệu để đảm bảo phía nhận đủ khả năng nhận và xử lý luồng dữ liệụ

- Kiểm soát lỗi: đảm bảo các gói tin đến đúng và đủ

Để thực hiện được các chức năng đó, một quá trình truyền dữ liệu qua giao thức TCP (mà ta gọi là phiên truyền thông – session) gồm có 3 giai đoạn:

- Thiết lập kết nối - Truyền dữ liệu - Giải tỏa kết nối

Để có thể hình dung được quá trình đó, mời các bạn xem minh họa sau:

Thiết lập kết nối:

Để có thể giám sát chặt chẽ trạng thái và mọi sự kiện xảy ra trong 1 kết nối TCP, trạng thái của một kết nối TCP được chuyển đổi tuân theo một lưu đồ trạng thái như sau:

Đây chính là thuật toán chính mà ta phải lập trình cho giao thức TCP. Nhìn thấy sợ chưa .

Giải thích:

- TCP là giao thức hướng kết nối, dạng client – server. Tức là trong 1 phiên truyền thông thì sẽ có một phía đóng vai trò client (chính là phía khởi tạo kết nối, trong ví dụ minh họa trên là công ty A, bên trái), phía còn lại, lúc nào cũng ở trạng thái chờ đợi các client thiết lập kết nối tới chính là server.

- Ví dụ khi ta truy cập web, thì máy tính của ta là client, máy chủ chứa trang web chính là server, lúc nào cũng ở trạng thái đợi các máy tính client kết nối đến (và phải có khả năng thiết lập đồng thời nhiều kết nối, vì có thể có nhiều client kết nối tới cùng lúc).

- Đối với mạch mà chúng ta định làm, dĩ nhiên là thông thường nó đóng vai trò server rồị

- Trong lưu đồ trên, áp dụng cho cả client và server. Cả client và server đều bắt đầu bằng trạng thái “Close”. Client sẽ thiết lập kết nối theo con đường Active Open (nó chủ động thiết lập kết nối). Server sẽ thiết lập kết nối theo con đường Passive Open (thụ động, vì nó đợi client bắt đầu mà)

Quá trình chuyển trạng thái: ta hãy xem xét kịch bản thông thường nhất. - Cả hai bắt đầu bằng trạng thái close, không có kết nối nào tồn tạị

- Khi Server mở một port TCP để đợi client thiết lập kết nối, nó chuyển sang trạng thái “Listen”. - Khi client gửi đi bản tin SYN (bước số 1 trong ví dụ minh họa, giai đoạn thiết lập kết nối), nó chuyển sang trạng thái “SYN sent”.

- Lúc này khi server nhận được bản tin SYN từ client và gửi đáp lại 1 bản tin SYN (bước 2 trong VD), nó chuyển sang trạng thái “SYN Received”.

- Lúc này client gửi lại bản tin xác nhận ACK (bước 3 trong ví dụ), nó chuyển sang trạng thái thiết lập kết nối “Established”.

- Server nhận được bản tin ACK trên của client, nó cũng chuyển sang trạng thái “Established”. - Sau đó 2 bên tiến hành truyền dữ liệu, trạng thái cả 2 phía đều là “Established”.

- Một trong hai phía truyền xong dữ liệu, đến đây thì vai trò hai bên là như nhau, ta giả sử client truyền xong dữ liệu trước, nó sẽ gửi bản tin FIN, và chuyển sang trạng thái “FIN wait 1”.

- Phía server nhận được bản tin này, gửi xác nhận ACK, và chuyển sang trạng thái “Close wait”. - Khi client nhận được xác nhận từ server (nhận được bản tin ACK trên) thì nó chuyển sang trạng thái “FIN wait 2”.

- Đến lúc này server vẫn có thể tiếp tục gửi dữ liệu và client vẫn tiếp tục nhận (vì chỉ có client báo là gửi xong dữ liệu).

- Đến khi nào server cũng gửi hết dữ liệu, nó sẽ gửi đi bản tin FIN, cho biết nó cũng đã gửi xong dữ liệu và chuyển sang trạng thái “LAST ACK”.

- Khi client nhận được bản tin FIN trên từ server, nó gửi xác nhận (ACK) và chuyển sang trạng thái “Time wait”, sau đó chờ 1 khoảng thời gian Timeout và đóng kết nối, quay lại trạng thái “Close”.

- Khi server nhận được nó cũng chuyển từ “Last ACK” sang “Close” (không cần đợi Timeout) Trên đây chỉ là kịch bản thông thường nhất. Lưu đồ trên còn giải quyết cho các kịch bản khác.

Một phần của tài liệu ATMEGA32 GIAO TIẾP VỚI ENC28J60 QUA SPI – AVR WEBSERVER (Trang 54 - 63)