2013-04-28 30 views
15

Trong TCP bắt tay 3 chiều, 3 phân đoạn sẽ được gửi (SYN, SYN ACK, ACK). Điều gì xảy ra nếu đoạn thứ ba (ACK) bị mất? Người gửi có gửi lại phân đoạn hoặc từ bỏ việc thiết lập kết nối không? Và làm thế nào để hai máy chủ biết phân khúc bị mất?Điều gì xảy ra nếu đoạn bắt tay TCP bị mất?

+1

https://tools.ietf.org/rfc/rfc793.txt sẽ giải thích điều gì xảy ra. –

+0

@EdHeal: bạn có thể chỉ vào một phần cụ thể không? – skrtbhtngr

Trả lời

16

TCP có số thứ tự trong tất cả các gói. Do đó nó dễ dàng để biết nếu một gói tin bị mất hay không. Nếu một máy chủ không nhận được một ACK trên một gói, anh ta chỉ gửi lại nó.

Trong hầu hết các trường hợp, ngay cả khi ACK đó bị mất, sẽ không có sự gửi lại vì một lý do rất đơn giản. Ngay sau ACK, máy chủ đã mở giao thức TCP có khả năng bắt đầu gửi dữ liệu. Dữ liệu đó, vì tất cả các gói TCP, có một số ACK, do đó người nhận sẽ nhận được một ACK theo cách đó. Do đó, người gửi SYN-ACK nên hợp lý không quan tâm rằng nó không nhận được ACK, bởi vì nó nhận được một "ẩn" ACK trong gói sau.

Việc gửi lại SYN-ACK chỉ cần thiết mà không có dữ liệu nào được nhận.

Cập nhật: tôi thấy diễn ra trong RFC rằng quy định chính xác này:

Nếu SYN chúng tôi đã được công nhận (có lẽ trong phân khúc đến nay) mức độ ưu tiên của đoạn đến phải trận đấu mức độ ưu tiên địa phương chính xác, nếu không đặt lại phải được gửi.

Nói cách khác, nếu ACK bị loại bỏ nhưng gói tiếp theo không bị xóa, thì mọi thứ đều ổn. Nếu không, kết nối phải được đặt lại. Mà làm cho cảm giác hoàn hảo.

+2

ACK cuối cùng của cái bắt tay không phải là chính nó ACK'ed, mặc dù. –

+8

ACKing một ACK sẽ làm cho việc truyền dữ liệu thực tế là không thể. –

+0

Tôi có điểm. Cảm ơn bạn! – ZHOU

1

Tôi không phải là chuyên gia về tình huống cụ thể này, nhưng tôi nghi ngờ điều gì sẽ xảy ra là khách hàng sẽ nghĩ rằng nó được kết nối nhưng máy chủ sẽ không. Nếu máy khách cố gắng gửi dữ liệu đến máy chủ, máy chủ sẽ từ chối nó và gửi một gói RST tới máy khách để nó có thể thiết lập lại "kết nối" của nó.

+0

Máy chủ sẽ thấy kết nối được thiết lập khi gửi SYN-ACK. Nhưng điều này có thể là một chi tiết thực hiện, tôi đã không tìm thấy các thông số kỹ thuật thực tế để làm gì trong trường hợp này. Có lẽ không có. –

+0

@LennartRegebro: theo [RFC 793 Phần 3.4] (http://tools.ietf.org/html/rfc793#section-3.4), máy chủ không nhập trạng thái 'ESTABLISHED' cho đến khi nó nhận được ACK cuối cùng. Khi nó gửi 'SYN + ACK', nó vẫn ở trạng thái' SYN-RECEIVED'. Máy khách vào trạng thái 'ESTABLISHED' khi nó nhận' SYN + ACK'. –

+3

Tìm thấy: "Nếu SYN của chúng tôi đã được xác nhận (có lẽ trong phân đoạn đến này), mức độ ưu tiên của phân đoạn đến phải là khớp chính xác với mức độ ưu tiên của địa phương, nếu không phải đặt lại." Nói cách khác, nếu ACK và * chỉ * ACK bị ngắt, kết nối sẽ được thiết lập. Nếu có nhiều thứ bị bỏ đi, có một thiết lập lại. " –

Các vấn đề liên quan