Opening TCP Connection
Có hai cách để thiết lập một kết nối TCP: bắt tay hai bước và bắt tay ba bước.
Two – Way Handshaking
Đối với bắt tay hai bước: khi client gửi yêu cầu kết nối tới server, server sẽ thiết lập kết nối. Sau đó, server sẽ gửi lại gói tin chấp thuận kết nối cho client, client khi nhận được gói tin này thì cũng sẽ thiết lập kết nối.
Việc thiết lập kết nối bằng bắt tay hai bước cách này có một lỗ hổng. Đó là khi gói tin chấp nhận kết nối (
acc_conn(x)
) của server đến trễ hơn thời gian client gửi gói tin yêu cầu kết nối (req_conn(x)
) lần thứ hai.
Sau khi kết nối thứ nhất kết thúc, kết nối thứ hai sẽ được mở ra. Tuy nhiên, kết nối này chỉ mở ở phía server nhưng lại không có client (kết nối một bên), làm lãng phí tài nguyên của server.
Three – Way Handshaking
Để giải quyết vấn đề của bắt tay hai bước, ta cần phải sử dụng bắt tay ba bước.
Quá trình thiết lập kết nối diễn ra như sau:
- Đầu tiên, client sẽ gửi gói tin yêu cầu thiết lập kết nối đến server, bao gồm:
- Cờ
SYN = 1
(cờ SYN nằm trong header của TCP) - Số thứ tự gói tin ban đầu của client:
seq = m
(vớim
là một số ngẫu nhiên). - Do cờ SYN được bật lên 1 nên gói tin này được gọi là gói tin SYN.
- Cờ
- Khi nhận được gói tin yêu cầu thiết lập kết nối từ client, server sẽ gửi một gói tin SYNACK có:
seq = n
, là số thứ tự khởi tạo của server (vớin
là một số ngẫu nhiên).ack = m + 1
, là số phản hồi cho gói tin yêu cầu kết nối của client.- Vì cả hai cờ SYN và ACK được bật lên 1 nên gói tin này được gọi là gói tin SYNACK.
- Khi client nhận được gói tin này từ server, nó sẽ thiết lập kết nối, đồng thời thời gửi lại một gói tin ACK cho server với số thứ tự phản hồi cho gói tin chấp nhận kết nối của server là
ack = n + 1
.
Tất cả các gói tin trên đều không mang dữ liệu.
Closing TCP Connection
Để đóng một kết nối TCP, giao thức cần trải qua bốn bước:
- Client gửi gói tin FIN (gói tin yêu cầu đóng kết nối) kèm theo số thứ tự gói tin là
seq = x
. Trong khoảng thời gian chờ server phản hồi, client vẫn có thể nhận dữ liệu. - Server chấp nhận yêu cầu đóng kết nối bằng cách gửi lại gói tin ACK kèm theo số thứ tự phản hồi cho gói tin FIN là
ack = x + 1
. Trong thời gian này, server sẽ tiến hành gửi tất cả các gói tin còn sót lại ở buffer. Client sẽ ở trạng thái chờ server đóng kết nối. - Khi đã gửi hết tất cả các gói tin ở buffer, server sẽ gửi cho client gói tin FIN với số thứ tự gói tin là
seq = y
để client đóng kết nối. Server đóng kết nối. - Khi nhận được gói tin FIN từ server, client sẽ gửi lại gói tin ACK để phản hồi cho server với
ack = y + 1
. Client đóng kết nối.
Related
list
from outgoing([[TCP Connection Management]])
sort file.ctime asc