【网络】TCP三次握手四次挥手

来源:互联网 发布:冬天饮品 知乎 编辑:程序博客网 时间:2024/05/22 15:02

TCP的传输连接管理

运输连接的三个阶段:连接建立、数据传送、连接释放。

TCP的连接建立(“三次握手”)

三次握手

B的TCP服务器进程先创建传输控制模块TCB(包含一些重要信息,如:TCP链接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号,等等),准备接收客户进程的连接请求。然后服务器进程就一直处于LISTEN(收听)状态,等到客户的连接请求。


A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN = 1,同时选择一个初始序号seq = x。TCP规定,SYN=1的报文段不能携带数据,但是消耗掉一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。


B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack = x+1,同时也为自己选择一个初始序号seq = y 。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。


TCP客户端收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack = y+1,而自己的序号seq = x+1。TCP规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,所以,下一个数据报文段的序号仍然是seq = x+1。这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
当B收到A的确认的后,也进入ESTABLISHED状态。


为什么A还要再发送一次确认呢?
这主要是为了防止已经失效的连接请求报文段突然又传送到了B,B收到这个失效的连接请求报文段之后,误以为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。嘉定不采用三次握手,那么只要B发出发出确认,新的连接就建立了。由于A并没有发出连接i请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输 连接已经开始了,并一直等待A发来数据。B的许多资源就因此浪费了。

TCP的连接释放 (“四次挥手”)

四次挥手

数据传输结束后,通信的双方都可释放连接。现在A和B都处于ESTABLISHED状态。A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的FIN置1,其序号seq = u,它等于前面已传送过的数据的最后一个字节的序号加1,这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。请注意,TCP规定,FIN报文段即使不懈怠数据,它也消耗掉一个序号。


B收到连接释放报文段后即发出确认,确认号是ack = u+1,而这个报文段自己的序号是v,等于B前面已发送过的数据的最后一个字节的序号加1.然后B就进入到CLOSE-WAIT(关闭等待)状态 。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但B发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭。


A收到B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段


若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN = 1。现假定B的序号是w(在版关闭状态B可能又发送了一些数据)。B还必须重复上次已经发送过的确认号ack = u+1.这时B就进入LAST-ACK(最后确认)状态,等待A的确认。


A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack = w+1,而自己的序号是seq = u+1,然后进入TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED(关闭)。时间MSL叫做最长报文段寿命。当A撤销响应的传输控制块TCB后,就结束了这次的TCP连接。

为什么A在TIME-WAIT状态必须等待2MSL的时间呢?
第一,为了保证A发送的最后一个ACK报文段能够到达B。
第二,防止之前提到的“已失效的连接请求报文段”出现在本连接中。A在发送完最后一个ACK报文段小时候,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

B只要收到A发出的确认,就进入CLOSED状态,同样,B再撤销响应的传输控制块TCB后,就结束了这次的TCP连接。可以注意到,B结束TCP连接的时间要比A早一些。

0 0
原创粉丝点击