[路由器][TCP][断开][连接]
TCP详细的连接过程
三个阶段:连接建立 -> 数据传送 -> 连接释放
一、TCP 建立连接:采用三报文握手
服务器端“被动打开”:服务器已经启动了服务进程并监听着某个接口,被动接收客户端请求。

1、A 的 TCP 向 B 发出连接请求报文段,其首部中的 同步位 SYN = 1,并选择序号 seq = x,表明传送 数据时的第一个数据字节的序号是 x。
2、B 的 TCP 收到连接请求报文段后,如同意,则 发回确认。 B 在确认报文段中应使 SYN = 1,使 ACK = 1, 其确认号 ack = x + 1,自己选择的序号 seq = y。
3、A 收到此报文段后向 B 给出确认,其 ACK = 1, 确认号 ack = y +1。 A 的 TCP 通知上层应用进程,连接已经建立。
4、B 的 TCP 收到主机 A 的确认后,也通知其上层 应用进程:TCP 连接已经建立。
除了建立连接,其过程还交互了那些信息?
MSS值(我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节),当前接收窗口值。

为什么不使用两个报文确定握手?
二、TCP断开连接,四报文握手

1、数据传输结束后,通信的双方都可释放连接。 现在 A 的应用进程先向其 TCP 发出连接释放 报文段,并停止再发送数据,主动关闭 TCP 连接。 A 把连接释放报文段首部的 FIN = 1,其序号 seq = u,等待 B 的确认。
2、B 发出确认,确认号 ack = u + 1, 而这个报文段自己的序号 seq = v。 TCP 服务器进程通知高层应用进程。 从 A 到 B 这个方向的连接就释放了,TCP 连接 处于半关闭状态。B 若发送数据,A 仍要接收。
3、若 B 已经没有要向 A 发送的数据, 其应用进程就通知 TCP 释放连接。A 收到连接释放报文段后,必须发出确认。B发出报文释放B->A方向的“链路”。
报文FIN=1,ACK = 1, 自己的序号seq=w,确认号 ack = u + 1。
4、在确认报文段中 ACK = 1,确认号 ack w 1, 自己的序号 seq = u + 1。
为什么A 必须等待 2MSL 的时间?
第一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B。
第二,防止 “已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
假设A和B正确建立了TCP连接,交互数据一段时间后,A断电了,B怎么知道?
保活计时器。若两个小时没有收到客户端的数据,服务器就发送一个探测报文段,以后每隔75分钟发送一次。10次后客户端没有反应,就认为客户端出现故障。
浙公网安备 33010602011771号