TCP
概述
TCP(Transmission Control Protocol),传输控制协议
TCP协议传输的特点主要就是面向字节流、面向连接、传输可靠。
tcp的可靠性如何保证
- 分块传送:数据被分割成最合适的数据块(UDP的数据报长度不变)
- 等待确认:通过定时器等待接收端发送确认请求,收不到确认则重发
- 确认回复:收到确认后发送确认回复(不是立即发送,通常推迟几分之一秒)
- 数据校验:保持首部和数据的校验和,检测数据传输过程有无变化
- 乱序排序:接收端能重排序数据,以正确的顺序交给应用端
- 重复丢弃:接收端能丢弃重复的数据包
- 流量缓冲:两端有固定大小的缓冲区(滑动窗口),防止速度不匹配丢数据
标识
- SYN(synchronize),建立联机/请求同步
- SYN-SENT,同步已发送
- SYN-RCVD,同步收到
- ACK(acknowledgment),确认
- ISN(initial sequence number),初始化序列号
- Sequence number,顺序号码
- Acknowledge number,确认号码
- ESTABLISHED,已建立连接
- PSH(push),传送
- FIN(finish),结束
- RST(reset),重置
- URG(urgent),紧急
三次握手

流程
- 客户端发送SYN,表明要向服务器建立连接。同时带上序列号ISN
- 服务器返回ACK(序号为客户端序列号+1)作为确认。同时发送SYN作为应答(SYN的序列号为服务端唯一的序号)
- 客户端发送ACK确认收到回复(序列号为服务端序列号+1)
为什么是三次
- tcp连接是全双工的,数据在两个方向上能同时传递。
- 所以要确保双方,同时能发数据和收数据
- 第一次握手:证明了发送方能发数据
- 第二次握手:ack确保了接收方能收数据,syn确保了接收方能发数据
- 第三次握手:确保了发送方能收数据
四次挥手

流程
- 主动关闭的一方发送FIN,表示要单方面关闭数据的传输
- 服务端收到FIN (M)后,发送一个ACK作为确认(M+1)
- 等服务器数据传输完毕,也发送一个FIN (N) 标识,表示关闭这个方向的数据传输
- 客户端回复ACK (N+1) 以确认回复
为什么四次
- 因为tcp连接是全双工的,数据在两个方向上能同时传递。
- 同时tcp支持半关闭(发送一方结束发送还能接收数据的功能)。
- 因此每个方向都要单独关闭,且收到关系通知需要发送确认回复。
为什么要支持半关闭
- 客户端需要通知服务端,它的数据已经传输完毕
- 同时仍要接收来自服务端的数据
- 使用半关闭的单连接效率要比使用两个tcp连接更好
为什么客户端在TIME-WAIT阶段要等2MSL?
MSL(Maximum Segment Lifetime):一段 TCP 报文在传输过程中的最大生命周期。
2MSL 即是服务器端发出为 FIN 报文和客户端发出的 ACK 确认报文所能保持有效的最大时长。
为的是确认服务器端是否收到客户端发出的 ACK 确认报文,当客户端发出最后的 ACK 确认报文时,并不能确定服务器端能够收到该段报文。
所以客户端在发送完 ACK 确认报文之后,会设置一个时长为 2MSL 的计时器。
服务器端在 1MSL 内没有收到客户端发出的 ACK 确认报文,就会再次向客户端发出 FIN 报文:
如果客户端在 2MSL 内,再次收到了来自服务器端的 FIN 报文,说明服务器端由于各种原因没有接收到客户端发出的 ACK 确认报文。
客户端再次向服务器端发出 ACK 确认报文,计时器重置,重新开始 2MSL 的计时。
否则客户端在 2MSL 内没有再次收到来自服务器端的 FIN 报文,说明服务器端正常接收了 ACK 确认报文,客户端可以进入 CLOSED 阶段,完成“四次挥手”。
参考
- TCP 协议详解 - 掘金
- 说说你对“三次握手”、“四次挥手”的理解 - 前端面试题宝典
- “三次握手,四次挥手”你真的懂吗? - 知乎