day213-HTTP三次握手

要点

  1. 目的
  2. 名词
  3. 过程
  4. 疑问

目的

客户端连接服务端,建立TCP连接,交换窗口大小信息

名词

ISN(Initial Sequence Number):操作系统动态随机选取一个32位长的序列号,即初始序列号ISN。

SYN(SYNchronization):同步信号SYN,占用一个字节的编号。

在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。

对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。

ACKnum:确认序号。Inform the sending host that the transmitted data was received successfully.

过程

第一次握手(SYN=1, seq=x)

客户端发送,TCP的SYN标志位初始值为1的包,表明客户端向服务端发起连接。同时seq( sequence numbers 序列号)包含ISN序列号x,保存在发送包序列号字段里。

发送完毕后,客户端进入SYN_SEND状态。

第二次握手(SYN=1, seq=y, ACK=1, ACKnum=x+1)(注意ACKnum又写作ack)

服务器返回,SYN标志位和ACK标志位为1。服务端将ISN序列号放入Seq域,同时将ACKnum(Acknowledgement Number:确认序号)设置为客户端ISN序列号加1,即x+1。

发送完毕后,服务端进入SYN_RCVD状态。

第三次握手(ACK=1,seq=x + 1,ACKnum=y+1)

客户端发送,SYN标志位为0,ACK标志位为1,将服务端的seq序号值加1,放入确认序号中,发送给服务端。

发送完毕后,客户端进入ESTABLISHED状态,服务端接收后,也进入ESTABLISHED状态。TCP三次握手结束

疑问

  1. 为什么是三次握手不是两次握手?

TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq。

谢希仁版《计算机网络》:“已失效的连接请求报文段” 的产生在这样一种情况下:client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”

  1. TCP 怎么样识别之前旧链接重发的包?

ISN(初始序列号)机制。

参考

TCP 为什么是三次握手,而不是两次或四次?

三次握手

Understanding TCP Sequence and Acknowledgment Numbers

文章作者: lmislm
文章链接: http://lmislm.com/2019/08/14/2019-08-14/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog