TCP/IP协议的三次握手/四次挥手

三次握手

采用三次握手是为了防止失效的连接请求报文段突然又回传给server,进而产生错误。

失效的连接请求报文段:client端发送的第一个连接请求报文段并没有丢失,而是在某个网络节点滞留了,以至于延误到连接释放以后的某个时间才到达server。

出现的情况:server误以为这是一个新的请求,向client发出确认报文段,同意建立连接。假设不采用三次握手,那么只要server发出确认,新的连接就建立了。这时由于client并没有真正的请求,所以不会向server发送数据,但server却一直等待,这样就会浪费server的很多资源。如果有了三次握手,client不会向server发出确认,那么server收不到确认,就不会建立连接。

具体过程:如果使用三次握手,那么主机B收到主机A发送的陈旧的SYN报文段后,就向A发送SYN报文段,选择自己的序号seq=y,并确认收到A的SYN报文段,确定号为ack=x+1;当A收到B的报文段后,从确认号就知道不应该理睬这个SYN报文段(因为A现在并没有发送seq=x的报文段),这时A发送复位报文段,在这个报文段中,rst = 1,ACK =1,其确认号为ack = y+1;我们注意到,虽然A拒绝了B的TCP连接请求(发送复位报文段),但对B发送的syn报文段还是确认收到了,B收到A的rst后,就知道不能建立连接了。

不需要四次握手的原因是三次已经安全建立连接,四次纯属浪费资源。

四次挥手

采用四次挥手是为了让客户端把数据传输完成。

我们都知道,TCP连接是全双工通信的,而断开时双方都需要确定两个问题:自己是否还有数据要发送,对端是否还有数据要发送,而四次挥手正好在双方同步了这两个问题。

  • 第一次挥手:client告诉server自己的数据已全部发送,client可以回收发送缓冲区,server可以回收接收缓冲区
  • 第二次挥手:server告诉client自己收到了关闭信息
  • 第三次挥手:server告诉client自己的数据已全部发送,server可以回收发送缓冲区,client可以回收接收缓冲区
  • 第四次挥手:client告诉server自己收到了关闭信息

可以发现,四次挥手同样一次都不能少,如果少了其中任何一次,总有一方不能可靠的通知对方自己的数据已发送完毕,因此,连接不可能可靠的断开,TCP也就成了不可靠的协议。

2ms的缓冲时间是为了server端把数据传输完毕。

你可能感兴趣的:(计算机网络,网络,tcp/ip)