说说TCP的三次握手?

203 阅读4分钟

说说TCP的三次握手?

重要内容

三次握手是 TCP 连接建立的过程,目的是确保客户端和服务器之间可以可靠地通信,并同步彼此的序列号,以保证数据传输的可靠性

三次握手的建立过程

  • 最开始双方的TCP连接都处于close状态,服务端首先会监听一个端口,处于Listen状态
  • 第一次握手:客户端首先向服务器端发送一个特殊的TCP 报文段。该报文段中不包含应用层数据,但是在报文段的首部中将标志位 SYN 比特 被置为 1。另外客户会随机地选择一个 初始序号 并放置于特殊的TCP 报文段的序号字段中,并通过下层服务发送给服务器
  • 第二次握手:一旦特殊的TCP 报文段到达服务器主机,服务器将为该TCP连接分配TCP缓存和变量,并向该客户端发送允许连接的报文段(该允许连接的报文段被称为SYNACK报文段,该报文段也不包含应用层数据,但是在报文段的首部却包含3个重要的信息)
    • SYN 比特 被置为1
    • 该TCP报文段首部的 确认号字段 被置为客户端随机序号+1
    • 服务器选择自己的 初始序号 并将其放置到TCP报文段首部的序号字段中
  • 第三次握手:在收到 SYNACK 报文段后,客户端也要给该连接分配缓存和变量。然后向服务器发送另外一个确认报文段
    • SYN 比特 被置为 0(因为连接已经建立了)
    • 对服务器的允许连接的报文段进行了确认,确认号字段为服务端初始序号+1
    • 在报文段负载中可以携带客户端到服务器的应用层数据

注意:图中的 client_isn 为客户端的初始序号、server_isn 为服务端的初始序号

扩展知识

为什么需要三次握手,而不是二次握手?

  • 防止历史重复连接:当发送方发送连接的分组给接收方,但是由于阻塞原因导致触发了发送方超时重传的机制,重传了一个连接的分组,这个时候接收方的确认接收达到,建立连接,然后很快的终止连接,而这个时候那个重传的连接分组会再一次和接收方建立连接,但是没有办法终止

  • 双向通信能力验证:三次交互确保客户端和服务器均能发送和接收数据,两次握手无法验证客户端的接收能力

  • 初始序列号同步:序列号用于数据包排序和去重,三次握手确保双方初始序列号被正确确认

TCP 报文段结构

TCP 报文段由首部字段和一个数据字段组成(MSS 限制了报文段数据字段的最大长度)

  • MSS 通常根据最初确定的由本地发送主机发送的最大链路层帧长度(即所谓的最大传输单元 MTU 来设置);以太网 和 PPP 链路层协议都具有 1500 字节的MTU,因此MSS的典型值为1460字节(TCP/IP 首部长度通常为 40 字节,将适合单个链路层帧)

TCP 报文段主要包含以下字段

  • 32 比特的序号字段和32比特的确认号字段:被用于TCP发送方和接收方用来实现可靠数据传输服务
  • 4 比特的首部长度字段:指示了以32比特的字为单位的TCP首部长度(由于TCP选项字段的原因,TCP首部的长度是可变的)
  • 6 比特的标志字段
    • CWR和ECE:主要用于在明确拥塞通告中
    • ACK:用于指示确认字段中的值是有效的,即该报文段包括一个对已被成功接收报文段的确认
    • RST、SYN和FIN:用于连接建立和拆除
    • 在实践中,PSH、URG和紧急数据指针并没有使用
  • 16 比特的接收窗口字段:用于流量控制(该字段用于指示接收方愿意接受的字节数量)
  • 因特网校验和:检验和用于确定当UDP报文段从源到达目的地移动时,其中的比特是否发生了改变
  • 可选与变长的选项字段:用于发送方与接收方协商最大报文段长度 MSS 或在高速网络环境下用作窗口调节因子时使用
image-20241107183852102