TCP 三次握手如何运转
在传输任何数据之前,TCP 先用三条消息打开连接。跟着 SYN、SYN-ACK 与 ACK 走过两条生命线,看客户端与服务器如何商定各自数据流的起点。
在传输任何数据之前,TCP 先用三条消息打开连接。跟着 SYN、SYN-ACK 与 ACK 走过两条生命线,看客户端与服务器如何商定各自数据流的起点。
三次握手是 TCP 打开连接的方式。在客户端与服务器交换任何真实数据之前,它们先互发三条短消息——SYN、SYN-ACK 与 ACK——来商定起始序号,并确认彼此都能到达对方。
TCP 是可靠、有序的协议:它承诺数据完整、按序到达。握手正是让这个承诺成为可能的第一步,它把对话的两个方向同步起来。
握手是时间上的一段过程,而不是某台设备的形状。两条竖直生命线加三支箭头,正好说明谁在什么时候说了什么、每条消息从哪来——这是阅读协议交互最自然的方式。
客户端随机挑一个起始序号 x,放进 SYN 里发出。它不是来索要数据,而是在提议:“我的数据流将从 x 开始,我们能通信吗?”随后客户端进入“SYN 已发送”状态等待。
一直在监听的服务器作出回复。这条消息同时干两件事:用 ack = x + 1 确认客户端,并给出自己的起始序号 y。因为它既同步又确认,所以叫 SYN-ACK。
客户端用 ack = y + 1 确认服务器的序号。这第三条消息告诉服务器“我收到了你的回复”,于是这条链路双向都被确认可用。
随着消息来回传递,每个端点都会经过自己的状态——关闭、SYN 已发送、监听、已收到 SYN——直到双方都进入“已建立”。状态让每一方知道自己正处在握手的哪一步。
只有在第三条消息之后,应用数据才开始传输。从这时起,每个字节都被编号并确认,接收方因此可以重新排序、发现缺口。握手本身已经完成,不会每个数据包都重复。
两条只能让客户端确认服务器可达,却无法让服务器知道客户端收到了它的回复。第三条消息告诉服务器“我听到了”,于是双方都确认这条通道双向可用,才会开始发送数据。
SYN 意为“同步”:它携带一个起始序号,用来对齐两条数据流。ACK 意为“确认”:它表示发送方已收到此前的全部内容,并期待下一个编号。一条消息可以同时承担两者,这就是 SYN-ACK。
TCP 给每个字节编号,接收方据此把数据重新排好、并发现缺口。握手先商定起始序号,这样双方都知道该期待什么,一旦有缺失就能请求重传。
会重发。SYN 没有回应,客户端超时后会重试;最后一条 ACK 丢了,服务器会重发它的 SYN-ACK。握手本身是可靠的,丢一条消息只会多花一点时间。
不用。握手只在连接打开时发生一次。之后数据包可以直接传输,不必重复握手,直到连接在结束时被关闭。