一:三次握手
三次的握手的过程是:
1.由发起方HostA向被叫方HostB发出请求报文段,此时首部中的同步位SYN=1,同时选择一个序列号seq=x。TCP规定,SYN报文(即SYN=1的报文段)不能携带数据,但要消耗一个序列号。这时,TCP客户端进程进入SYN-SENT(同步已发送)状态。
2.HostB收到连接请求报文后,如同意建立连接,则向HostA发送确认。在确认报文段中应把SYN和ACK都置为1,确认号是ack=x+1,同时也为自己选择一个序列号seq=y。请注意这个报文段也不能携带任何数据,但同样要消耗一个序列号。这时TCP服务器进程进入SYN-REVD(同步收到)状态。
3.TCP客户端收到HostB的确认后,还要向HostB给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。
此时SYN的值为0(待会从抓的报文中也可以看出)。TCP规定ACK的报文段可以携带数据。但如果不携带数据则不消耗序列号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。
三次握手第一步:
三次握手第二步:
三次握手第三步:
二:为什么要三次握手
书上、播客中找了好多三次握手的理由,但是解释都不是特别的清楚明白,问了身边搞网络工程师的同学,推荐了一本
《路由交换术》,这是同学参加华三公司考试时用的教科书,里面对三次握手的解释比较清楚。
三:四次分手
四次分手的过程是:
1.A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接A把连接释放报文段首部的FIN置1, 其序号seq = u , 它等于前面己传送过的数据的最后一个字节的序号加1,这时A进入FIN-WAIT- 1 (终止等待 1)状态 , 等待B的确认请注意 , TCP规定 , FIN报文段即使不携带数据 ,它也消耗掉一个序号。
2.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发出的连接释放报文段 。
3.若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN = 1, 现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次己发送过的确认号 ack= u+1,这时B就进入LAST-ACK(最后确认)状态,等待A的确认。
4.A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1, 确认号ack = w + 1, 而自己的序号是seq = u + 1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号 )。然后进入到TIME-WAIT( 时间等待)状态。请注意,现在TCP连接 还没有释放掉。必须经过时间等待计时器(TIME-WAIT timer) 设置的时间2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命(Maxium Segment Lifetime),RFC793 建议设为2分钟。但这完全是从工程上来考虑,对于现在的网络 ,MSL = 2分钟可能太长了 一些。因此TCP允许不同的实现可根据具体情况使用更小的MSL值。因此,从A进入到TIME-WAIT状态后, 要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接。当A撤销相应的传输控制块TCB后, 就结束了这次的TCP连接。
四次分手第一步:
四次分手第二步:
四次分手第三步:
四次分手第四步: