I. Các module chính
I.6. Module giao thức TCP
Cấu trúc header :
Hình IV. 7. Cấu trúc header giao thức TCP
- Để 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 :
SVTH : 57
SVTH : 58
Giải thích :
- 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ạ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 (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
SVTH : 59
- Đế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).