TCP三次握手四次挥手小结

TCP是传输层的协议,它是有连接的,可靠的,面向字节流的,而UDP是无连接的,不可靠的,面向报文的。这里先详解TCP。

  • 为什么是有连接的,可靠的?
    因为TCP是面向连接的协议,双方都必须判断看自己发送的数据包对方有没有收到,没收到就要重新发送,所以双方都的知道对方的序列号,有了序列号和确认序列号才能保证服务端接受的收据是有序的,正确的,怎么告知对方的序列号和确认序列号,就引入了三次握手。
  • 为什么要进行三次握手?
    第一次握手,客户端告诉服务端 :我要建立连接。
    第二次握手,服务端告诉客户端 :我知道了,我也想和你建立连接
    第三次握手,客户端告诉服务端:我收到了
    这样才能确保数据传输的正确性。
    TCP三次握手四次挥手小结_第1张图片
    TCP三次握手四次挥手小结_第2张图片
    觉得这段话解释的非常清楚。
  • 为什么要有第三次连接?
    因为没有第三次ACK报文的话,服务端不知道自己的发送能力,不清楚自己发的客户端到底有没有收到,所以客户端必须给服务端回一个ACK响应,告诉他我收到了,你的发送没问题,我们可以传数据了。
    TCP三次握手四次挥手小结_第3张图片

-为森么要进行四次挥手?
四次挥手通俗讲,就是为了断开连接,TCP是双连接的,一端发送fin数据包,只能说明一端是关闭状态,另一端还是连接的状态,这就是所谓的半关闭半连接的状态。所以服务端要先回复一个ack响应报文,然后再发送fin报文,为什么ack和fin不能一起发送呢?
因为客户端发送fin只是告诉服务端我要关闭了,我不再发送数据了,但是服务端有可能数据没接收完呢,所以它不能立马发送fin报文,只能先回个响应告诉对方我知道了。
等过了一定时间片,服务端给客户端发送fin报文,告诉对方我也要关闭了,然后客户端给服务端回复ack响应报文,告诉他我收到了。这时双方才都关闭了自己的连接。

  • 为什么要有TIME_WAIT状态呢?
    (1)发送的ack报文可能会存在丢包的情况,所以如果在TIME_WAIT时间内收到了服务端再次发来的fin请求,就说明我上次的丢包了,我就的重新发送ack。如果没有TIME_WAIT,客户端发送ack后直接进入close状态,这样永远都不会全关闭,服务端永远不清楚自己发送的对方有没有收到。
    (2)让迟来的TCP报文段有足够的时间被识别和丢弃。连接结束了,网络中的延迟报文也应该被丢弃掉,以免影响立刻建立的新连接。
    TCP三次握手四次挥手小结_第4张图片
    结束呦。以上只是自己的见解,有问题及时联系我讨论哦,等着你的到来,啾咪。

你可能感兴趣的:(TCP三次握手四次挥手小结)