💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
* 三次握手 [![](https://github.com/KeKe-Li/data-structures-questions/raw/master/src/images/75.jpg)](https://github.com/KeKe-Li/data-structures-questions/blob/master/src/images/75.jpg) 假设 A 为客户端,B 为服务器端。 * 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。 * A 向 B 发送连接请求报文段,`SYN=1`,`ACK=0`,选择一个初始的序号`seq = x`。 * B 收到连接请求报文段,如果同意建立连接,则向 A 发送连接确认报文段,`SYN=1`,`ACK=1`,确认号为`x+1`,同时也选择一个初始的序号`seq = y`。 * A 收到 B 的连接确认报文段后,还要向 B 发出确认,确认号为`ack = y+1`,序号为`seq = x+1`。 * A 的 TCP 通知上层应用进程,连接已经建立。 * B 收到 A 的确认后,连接建立。 * B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。 为什么TCP连接需要三次握手,两次不可以吗,为什么? TCP是一个双向通信协议,通信双方都有能力发送信息,并接收响应。如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认 * 四次挥手 [![](https://github.com/KeKe-Li/data-structures-questions/raw/master/src/images/76.jpg)](https://github.com/KeKe-Li/data-structures-questions/blob/master/src/images/76.jpg) 数据传输结束后,通信的双方都可释放连接。现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP连接。 * A 把连接释放报文段首部的`FIN = 1`,其序号`seq = u`,等待 B 的确认。 * B 发出确认,确认号`ack = u+1`,而这个报文段自己的序号`seq = v`。(TCP 服务器进程通知高层应用进程)。 * 从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。A 不能向 B 发送数据;B 若发送数据,A 仍要接收。 * 当 B 不再需要连接时,发送连接释放请求报文段,FIN=1。 * A 收到后发出确认,进入`TIME-WAIT`状态,等待`2 MSL(2*2 = 4 mins)`时间后释放连接。 * B 收到 A 的确认后释放连接。 四次挥手的原因: 客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,