计算机网络之TCP 三次握手 四次挥手

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/saber_wtq/article/details/89349791

在弄懂三次握手和四次挥手之前,首先要清楚TCP报文段的首部格式,掌握TCP首部各字段的作用。下图就是TCP报文首部的格式图

各个字段的意思:

  • 序号seq:占4字节(32位),TCP是面向字节流的。在TCP连接中传送里的字节流中的每一个字节都按顺序编号。首部的序号字段表示本报文字段所发送的数据的第一个字节的序号。例如:一报文段的序号是301,而携带的数据总共有100字节,则表面本报文段传送的数据的第一个字节序号是301,最后一个字节的序号是400。下一个报文段的序号是从401开始。即下一个报文段的序号字段是401.
  • 确认号ack:占4字节(32位)表示期望收到对方下一个报文段的第一个数据字节的序号。例如,B正确收到A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700)这表明正确收到了A发送的序号为501~700的数据。因此B期望收到A的下一个数据是701,于是B在发送确认报文中把确认号设置为701.
  • 确认ACK:(ACKnowledgment) 占1位,仅当ACK=1时确认号字段才有效。ACK=0时确认号无效。TCP规定,在建立后所有传送的报文都必须把ACK置1。
  • 同步SYN:(SYNchronization) 占1位,连接时用的同步序号。SYN=1,ACK=0时,表明这是一歌连接请求报文段。若对方同意连接则在相应的报文段使用SYN=1,ACK=1;因此,SYN置1就表示这是一个连接请求或者连接接受报文。
  • 终止FIN(FINis): 占1位,用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

  PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

三次握手过程建立连接过程

  1. 首先客户端A主动向服务器发送连接请求报文,该报文的同步SYN=1, 假设序列号seq=x。TCP规定SYN报文段(即SYN=1的报文段)不能携带数据,但是要消耗掉一个序列号。发送完连接请求报文后tcp客户端就进入了同步已发送(SYN-SENT)状态。
  2. 服务器B在接受到连接请求报文后,如果同意连接,则向A发送确认报文段(ACK=1的报文段),确认号ack=x+1; ,同时选择一个自己的初始序列号seq=y; TCP规定该报文段不能携带数据但占据一个序列号。同时服务器B由之前的收听(LISTEN)状态进入到同步收到状态(SYN-RCVD).
  3. 客户端A在收到B发来的确认报文后,必须再向B发送一个确认。该报文段确认ACK=1,序列号为x+1,确认号ack=y+1.此时客户端进入已建立连接状态(ESTAB-LISHED),B在收到A的确认后也进入建立连接状态(ESTAB-LISHED)

四次挥手释放连接过程

数据传输结束后,通信的双发都可以释放连接。

  1. 首先A向B发送连接释放报文段,并停止发送数据,主动关闭TCP连接。该报文段首部的终止控制位FIN=1。序列号seq=u。它等于前面已传送过的数据的最后一个字节的序号+1. A进入终止等待1(FIN-WAIT-1)状态。TCP规定,FIN报文段即使不用携带数据,也要消耗掉一个序号。
  2. 服务器B再收到A的连接释放报文后即发送一个确认。确认号ack=u+1. ACK=1;序列号seq=v,(它等于前面已传送过的数据的最后一个字节的序号+1.) B进入到关闭等待(CLOSE-WAIT)状态。TCP服务器这时通知高层应用进程,因而从A到B方向的连接就释放了。这时TCP连接出于半关闭状态。即A已经没有数据要发送了,但B若发送数据,A仍要接收。B到A方向的连接并没有断开。A收到来自B的确认后就进入最终等待2(FIN-WAIT-2)状态。等待B发送的连接释放报文段。
  3. 若B已经没有要向A发动的数据了,其应用进程就通知TCP释放连接。这时B发出的连接释放报文FIN=1.假定序列号seq=w.  B还必须重复上次已发送的确认号ack=u+1.这时B就进入LASTS-ACK(最后确认状态),等待A的确认。
  4. A在收到B的连接释放报文段后,必须对此发出确认。确认报文段的ACK=1,确认号ack=w+1,序列号seq=u+1.然后进入TIME-WAIT(时间等待)状态。

猜你喜欢

转载自blog.csdn.net/saber_wtq/article/details/89349791
今日推荐