计算机网络---TCP三次握手

一、TCP数据报格式
计算机网络---TCP三次握手
文章图片

二、名称解释

ACK:仅当ACK=1时确认号字段才有用。当ACK=0时,确认号无效。 ack:确认号,是期望收到对方下一个报文段的第一个数据字节的序号。 SYN:在建立连接时用来同步序号,当SYN置为1就表示这是一个连接请求或连接接受报文。 seq:随机生成一个初始序号,后续的分组会基于这个序号递增。 FIN:当FIN=1,表示此报文段的发送方的数据已经发送完毕,并要求释放运输连接。 MSL:报文段最大生存时间MSL(Maximum Segment Lifetime)。

三、TCP意义
意义:为了确保通讯双方能够稳定的建立连接并完成数据报文的请求与响应动作。

四、三次握手
计算机网络---TCP三次握手
文章图片

  • 第一步:客户端向服务端发送一份特殊的 TCP 报文,该报文并不携带数据,但要消耗掉一个序号,是一份特殊的报文,它的 TCP 首部中 SYN 字段值为 1 (参见上述报文格式)。
    除此之外,客户端还会随机生成一个初始序号seq=x,填在报文的「序号」字段,代表当前报文的序号是这个,并且我后续的分组会基于这个序号递增。
    然后该报文将会经网络层、链路层、物理层发送到服务端。
  • 第二步:如果分组丢失了,那么客户端会经过某个时间间隔再次尝试发送。
    而如果分组准确的到达服务端了,服务端拆开 TCP 首部会看到,这是一个特殊的 SYN 握手报文,于是为此次连接分配缓存等资源。
    接着服务端开始构建响应报文,该报文不携带数据,但要消耗掉一个序号,SYN 是一个用于同步需要的字段,响应报文中依然会被置为 1,并且服务端也将随机生成一个初始序号放置的响应报文的序号字段seq=y中。
    最后,服务端还会为响应报文中的确认字段ack=x+1赋值,这个值就是客户端发过来的那个序号值加一。
    整体上的意思就是说,「我同意你的连接请求,我的初始序号为 xxx,你的初始序号我收到了,我等着你的下一个分组到来」
  • 第三步:客户端收到服务端的响应报文,还要向服务的发出确认报文,该可以携带数据,但如果不携带数据则不消耗序号,确认报文ACK置为1,确认号ack=y+1,而自己的序号seq=x+1。
    后客户端进入ESTAB-LISHED状态,分配客户端 TCP 连接所必须的缓存等资源,于是连接已经建立。
注意:
  • SYN报文段(SYN=1),不能携带数据,但是要消耗掉一个序号。
  • SYN+ACK报文段(SYN=1,ACK=1),不能携带数据,但是要消耗掉一个序号。
  • ACK报文段(ACK=1),可以选择携带数据或不携带数据,如果不携带数据则不消耗序号。
五、四次分手
计算机网络---TCP三次握手
文章图片

  1. 第一步:客户端发送一个特殊TCP 报文,该报文首部字段 FIN 被置为 1,即FIN=1,该分组的序号为 seq = u(等于前面已传送的数据的最后一个字节的序号+1)。发送完成之后,客户端进入 FIN-WAIT-1 这个状态,这个状态下,该 TCP 连接的客户端不能发送数据报,但是是可以接受数据报的,它等待着服务端的响应报文。
  2. 第二步:服务端收到客户端发送的终止连接报文请求,服务端构建确认报文ACK=1,确认号是ack=u+1,该分分组的序号为seq = v(等于前面已传送的数据的最后一个字节的序号+1),告诉客户端「序号 u+1 以前的分组我都收到了」,并且进入 CLOSE-WAIT 状态,这个状态持续时间很短。(这时TCP处于半关闭状态,此时客户端不能再发送数据,服务端可以继续发送数据,且客户端可以接收)
  3. 第三步:服务端会紧接着发送它的 FIN 数据报FIN = 1,确认号还是重复上传发过的ack=u+1,序号假定为seq=w(在半关闭状态,服务端可能有发送了一些数据)。通知客户端我服务端即将关闭连接,并随即进入 LAST_ACK 状态等待客户端响应报文。
  4. 【计算机网络---TCP三次握手】第四步:一旦客户端收到这个 FIN 报文,向服务端发出确认报文ACK=1,确认号ack=w+1,序号为seq=u+1,然后进入 TIME-WAIT 状态,等待 2MSL 时间间隔后完全释放客户端 TCP 连接所占用资源。
与此同时,当服务端收到客户端最后的确认报文,就将直接断开服务端连接并释放相关资源。
注意:
  • FIN报文段(FIN=1),不能携带数据,但是要消耗掉一个序号。
  • ACK报文段(ACK=1),可以选择携带数据或不携带数据,如果不携带数据则不消耗序号。
  • FIN+ACK报文段(FIN=1,ACK=1),不能携带数据,但是要消耗掉一个序号。
六、面试问题
  1. 在四次分手中,为什么最后客户端需要等 2MSL 时间长度再完全释放 TCP 相关资源呢?
    答:因为 2MSL (报文段最大生存时间)是一份报文存在于网络中最长的时间,超过该时间到达的报文都将被丢弃,而如果客户端最后的确认报文于网络中丢失的话,服务端必将发起超时请求,重新发送第三次挥手动作,此时等待中的客户端就可随即重新发送一份确认请求。
  2. TCP 是如何实现可靠传输的,即如何解决网络传输中丢包的问题?
    答:TCP 使用『滑动窗口』协议实现的可靠传输.

    推荐阅读