29
Nhiệm vụ của tầng là thiết lập phiên truyền thông giữa các máy tính và quy định cách truyền dữ liệu. Hai giao thức chính trong tầng này gồm UDP (User Datagram Protocol) và TCP (Transmission Control Protocol). Do UDP cung cấp các kênh truyền thông phi kết nối nên nó không đảm bảo truyền dữ liệu một cách tin cậy nên trong phạm vi đồ án chúng ta sử dụng thức TCP.Ngược lại với UDP, TCP cung cấp các kênh truyền thông hướng kết nối và đảm bảo truyền dữ liệu 1 cách tin cậy. TCP thường truyền các gói tin có kích thước lớn và yêu cầu phía nhận xác nhận về các gói tin đã nhận.
Cấu trúc gói TCP:
Hình 2.21: Cấu trúc gói TCP.
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 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
30
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ệu.
- Kiểm soát lỗi: đảm bảo các gói tin đến đúng và đủ.
- Báo nhận: khi nhận được dữ liệu và không có lỗi, phía nhận phải báo lại với phía gửi biết.
Để 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 và giải phóng 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 một 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:
31
Giải thích:
- TCP là giao thức hướng kết nối, dạng client – server. Tức là trong một phiên truyền thông thì sẽ có một phía đóng vai trò client, 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 – vi điều khiển, 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).
- 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:
- Cả hai bắt đầu bằng trạng thái close, không có kết nối nào tồn tại. 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, 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, 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 đó hai bên tiến hành truyền dữ liệu, trạng thái cả hai đề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”.
32
- 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)