TCP的三次握手与四次挥手

来源:互联网 发布:北京大数据培训班 编辑:程序博客网 时间:2024/05/16 17:27

1.TCP的连接建立

1.1TCP连接建立图

用三次握手建立TCP连接
这里写图片描述

1.2TCP三次握手过程

(1)A的TCP客户进程向B发出连接请求报文段。这是首部的同步位SYN=1,同时选择一个初始序号seq=x
(2)B收到连接请求报文段后,如果同意建立连接,向A发送确认。报文段中把ACK(确认)和SYN(同步)置1,确认号是ack=x+1,自己的序号是seq=y
(3)TCP客户进程收到B的确认后,向B给出确认。报文段中ACK置1,确认号是ack=y+1,自己的序号是seq=x+1

1.3为什么是三次握手?

这主要是为了防止已失效的的连接请求报文段。
假设,A发出连接请求报文段,但是该连接请求报文段 在某个网络节点中长时间滞留,于是A又发送第二个链接请求报文段 。第二个连接请求与服务器B建立连接,而第一个连接请求报文段 以至于延误到连接释放以后才到达服务器。本来这个连接早已经失效了,如果只采用两次握手的话,服务器B会误认为客户端又发送了一次连接请求,从而统一建立连接。所以,采用三次握手可以很好的避免这个问题,在上述情况下,A不会向B的确认发出确认的。B由于收不到确认,就知道A没有要求建立连接。

2.TCP的连接释放

2.1TCP连接释放图

这里写图片描述

2.2TCP四次挥手过程

(1)A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。把连接释放报文段首部的终止控制位置1,其序号seq=u(前面以传送过的数据的最后一个字节的序号+1)
(2)B收到连接释放报文段后发出确认,确认好ack=u+1,自己的序号为v(B前面以传送过的数据的最后一个字节的序号+1)
(3)若B没有要向A发数据了,就通知TCP连接释放。
(4)A收到B的连接释放报文段后,对此发出确认,经过时间等待期2MSL后,A才进入close

2.3为什么要四次挥手?

确保数据能够完整传输。
当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。

2.4为什么A在TIME-WAIT状态必须等待2SML的时间?

(1)为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

(2)他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

原创粉丝点击