Open dushaoshuai opened 1 year ago
TCP 报文段结构
sequenceDiagram Client ->> Server : SYN=1, seq=client_isn Server ->> Client : SYN=1, seq=server_isn, ack=client_isn+1 Client ->> Server : SYN=0, seq=client_isn+1, ack=server_isn+1
第一步:客户端发送 SYN 报文段。该报文段不包含应用层数据。首部中的 SYN 比特被置为 1;首部中的序号字段是一个随机选择的序号,称为客户端初始序号。
第二步:服务器发送 SYNACK 报文段。该报文段不包含应用层数据。首部中的 SYN 比特被置为 1;首部中的序号字段是一个随机选择的序号,称为服务器初始序号;首部中的确认号字段是客户端初始序号 + 1。
第三步:客户端发送 ACK 报文段。该报文段可以携带应用层数据。首部中的 SYN 比特被置为 0;首部中的序号字段是客户端初始序号 + 1;首部中的确认号字段是服务器初始序号 + 1。
TCP 把数据看成是无结构的、有序的字节流。为了实现可靠数据传输服务,TCP 对流中的字节进行编号。3 次握手就是为了交换初始序号(流中的第一字节的编号)及对对方的序号做出确认。
TCP 将字节流分割为大小为 MSS(最大报文段长度,其实是报文段中数据字段的最大长度)的段,并将每一段放在一个 TCP 报文段的数据字段中,该段的首字节的字节流编号是 TCP 报文段的序号。
此外,报文段中的确认号字段也对实现可靠传输非常重要。确认号是当前主机期望从对方那里收到的下一字节的编号。
因此,通过 3 次握手的第 3 步,客户也可以对服务器的初始序号进行确认,否则单单服务器确认客户的初始序号是无法建立可靠连接的。
// TODO.
计算机网络 自顶向下方法 3.5 面向连接的运输:TCP
TCP 报文段结构
三次握手(three-way handshake)
三次握手过程
第一步:客户端发送 SYN 报文段。该报文段不包含应用层数据。首部中的 SYN 比特被置为 1;首部中的序号字段是一个随机选择的序号,称为客户端初始序号。
第二步:服务器发送 SYNACK 报文段。该报文段不包含应用层数据。首部中的 SYN 比特被置为 1;首部中的序号字段是一个随机选择的序号,称为服务器初始序号;首部中的确认号字段是客户端初始序号 + 1。
第三步:客户端发送 ACK 报文段。该报文段可以携带应用层数据。首部中的 SYN 比特被置为 0;首部中的序号字段是客户端初始序号 + 1;首部中的确认号字段是服务器初始序号 + 1。
为什么需要三次握手,而不是两次握手?
TCP 把数据看成是无结构的、有序的字节流。为了实现可靠数据传输服务,TCP 对流中的字节进行编号。3 次握手就是为了交换初始序号(流中的第一字节的编号)及对对方的序号做出确认。
TCP 将字节流分割为大小为 MSS(最大报文段长度,其实是报文段中数据字段的最大长度)的段,并将每一段放在一个 TCP 报文段的数据字段中,该段的首字节的字节流编号是 TCP 报文段的序号。
此外,报文段中的确认号字段也对实现可靠传输非常重要。确认号是当前主机期望从对方那里收到的下一字节的编号。
因此,通过 3 次握手的第 3 步,客户也可以对服务器的初始序号进行确认,否则单单服务器确认客户的初始序号是无法建立可靠连接的。
四次挥手
四次挥手过程
// TODO.
四次挥手必要性
// TODO.
参见
计算机网络 自顶向下方法 3.5 面向连接的运输:TCP