zhangdizhangdi

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 阶段,完成“四次挥手”。

参考