TCP三次握手四次挥手及其引出的TCP相关知识

4.简述TCP三次握手,四次挥手的流程

  • 三次握手:

    • client客户端发起一个syn链接请求,得到server端响应ack的同时会再收到一个由server端发来的syn链接请求,client端进行回复ack后,就建立起了一个tcp协议的链接
  • 四次挥手

    • server端和client端对应的代码中都有close方法,每一端发起的close操作都是一次fin的断开请求,得到'断开确认ack'之后,就可以结束一端的数据发送,如果两端都发起close,那就是两次请求和两次回复,一共是四次操作,就可以结束两段的数据发送,表示链接断开了
  • TCP是什么?

    • TCP是一种面向连接的单播协议,在发送数据前,通信双发必须在彼此之间建立一条连接.所谓的连接,其实是客户端和服务器的内存里保存一份关于对方的信息,如IP地址,端口号等.TCP可以看成一种字节流,它会处理IP层或以下层的丢包,重复及错误的问题,在建立的过程中,双方需要交换一些连接的参数,这些参数可以放在TCP头部
    • TCP提供了一种可靠的,面向连接,字节流,传输层的服务,采用三次握手建立一个连接,采用四次挥手来关闭一个连接
  • (为什么是三次握手和四次挥手)

    • 三次握手的作用是双发都能明确自己和对方的收发能力是正常的

      • 第一次握手:client发server收,服务端得出结论:客户端的发送能力,服务端的接受能力正常

      • 第二次握手:server发client收,客户端得出结论:服务端的接受,发送,客户端的接受发送都正常

      • 第三次握手:client发server收,服务端得出结论:客户端的收发正常,服务端的收发正常

    • 为什么是三次握手,关闭连接却是四次挥手

      • 因为在服务端listen状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给了客户端.而关闭连接时,当收到FIN报文时,仅仅表示对方不再发送数据了,但还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送.
  • 四次挥手中TIME_WAIT状态存在的目的时什么?

    • 下面用A表示TCP连接中的主动关闭端,用B来表示被动关闭端

    • 在tcps四次挥手中,B发FIN包(第三次挥手后),A马上回应最后的ACK,此时A的socket仍然不能立即进入closed的状态,为什么呢?其实就是在问TIME_WAIT状态存在的理由

    • 理由1:

      • A不能保证最后的ACK都能到达B,所以还应该观望一段时间,护送一段时间.如果最后的ACK丢失,那么B显然收不到,于是B发起了重传FIN的操作,此时如果A处于closed的状态,就没办法给对端发ACK了(实际上是发RST(复位报文段)),所以A应该等待一段时间,这段时间就是所谓的TIME_WAIT,比如,等待一个RTT的时间(实际上,考虑到下一个理由,RTT可能不够,用2MSL更靠谱)

        (RTT,往返时间,MSL报文的最大生存时间)

        所以,TIME_WAIT存在的理由之一是尽可能的护送最后的ACK到达对端

    • 理由2:

      • 假设tcp连接是: A(1.2.3.4:8888)-B(6.7.8.9:9999), 这就是一个tcp四元组。当tcp连接关闭后,四元组释放.后面的新连接可能会重用到这个四元组(有这个可能性),那么问题就来了:新四元组和旧四元组完全一致,他们的网络包会混乱吗?所以,可以考虑这样一个机制:让旧四元组对应的网络包都消失后(等一段时间),才允许新四元组建立,颇有点锁的味道.那么这个等一段时间究竟是多久合适呢? 经验上一般将TIME_WAIT定义为2MSL

        所以,TIME_WAIT存在的理由之二是新旧四元组相互不干扰

  • TCP是通过什么机制保障可靠性:

    • 四个方面
      • ACK确认机制
      • 超时重传
      • 滑动窗口
      • 流量控制
posted @ 2019-09-22 16:02  JohnWangggg  阅读(146)  评论(0编辑  收藏  举报