dushaoshuai / dushaoshuai.github.io

0 stars 0 forks source link

TCP: 三次握手、四次挥手 #127

Open dushaoshuai opened 1 year ago

dushaoshuai commented 1 year ago

TCP 报文段结构

TCP 报文段结构

三次握手(three-way handshake)

三次握手过程

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.

四次挥手必要性

// TODO.

参见

计算机网络 自顶向下方法 3.5 面向连接的运输:TCP