Tcp三次握手建立链接,四次挥手关闭链接

一、Tcp报文格式简介

 

  1. 序号:seq number,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  2. 确认号:ack number,占32位,只有ACK标志位为1时,确认序号字段才有效,ack number=seq number+1。
  3. 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

       (A)URG:紧急指针(urgent pointer)有效。

       (B)ACK:确认序号有效。当设为1返回给对方,标识接受到数据了

       (C)PSH:接收方应该尽快将这个报文交给应用层。

       (D)RST:重置连接。

       (E)SYN:发起一个新连接。

       (F)FIN:释放一个连接。

二、三次挥手建立链接

1: 为什么要三次握手?

答:三次握手的目的是为了建立可靠的通信信道,Client和Server双方需要确认自己与对方的发送与接收数据通信正常。两次握手不能保证可靠通信,四次浪费资源。

  1. 第一次握手:Client什么都不能确认;Server确认了Client发送数据正常。
  2. 第二次握手:Client确认了:自己发送、接收数据正常,Server发送、接收正常;Server确认了:自己接收正常,对方发送正常。
  3. 第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收数据正常,对方发送、接收数据正常。

 

 最初Client和Server的TCP进程都处于CLOSED关闭状态,Client主动打开连接,而Server被动打开连接。Server的TCP进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。若有,则作出响应。

  1. Client、Server关闭状态CLOSED
  2. Server收听状态LISTEN
  3. Client同步已发送状态SYN-SENT
  4. Server同步收到状态SYN-RCVD
  5. Client、Server连接已建立状态ESTABLISHED

 

 

  • 1)第一次握手:Client的TCP客户进程首先创建传输控制块TCB,然后向Server发出连接请求报文段,(首部的同步位SYN=1序号seq =x(seq 随机产生)),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时Client进程进入SYN-SENT(同步已发送)状态,等待Server确认。
  • 2)第二次握手:Server收到连接请求报文段后,由标志位SYN=1得知Client请求建立连接,如同意建立连接,则向Client发送确认报文,在确认报文段中(同步位SYN=1,确认ACK=1,确认序号ack =x+1,序号 seq=y(seq 随机产生),测试TCP服务器进程进入SYN-RCVD(同步收到)状态,系统为该TCP连接分配TCP缓存和变量(Client确认了:自己发送、接收数据正常,Server发送、接收正常;Server确认了:自己接收正常,对方发送正常。
  • 3)第三次握手:Cient进程收到Server的确认报文后,检查ack 是否为x+1,ACK是否为1,如果正确,将向Server发出确认报文段(ACK=1,ack=y+1,seq=x+1)(初始为seq=x,第二个报文段所以要+1)。TCP连接已经建立,Client进入ESTABLISHED(已建立连接)。当Server收到Client的确认后,检查ack 是否为y+1,ACK是否为1,如果正确也进入ESTABLISHED状态。(Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收数据正常,对方发送、接收数据正常。)  

为何使用三次握手机制:

主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景:

客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

 四、四次挥手关闭链接

为什么需要四次挥手呢?

  1. Client向Server发送关闭报文,告诉Server自己没有数据要发送了:Client——>Server;
  2. Server向Client发送确认报文,告诉Client知道他要关闭了:Server——>Client;(Client还可以接受Server发给他的数据,当没有数据发送了再告诉Client要关闭连接了 )
  3. Server向Client发送信号,告诉Client没有数据要发送了:Server——>Client;
  4. Client向Server发送确认报文,确认断开链接:Client——>Server。

 

  1. Client进程发出断开链接报文,并且停止发送数据。报文首部,(FIN=1,seq=u),客户端进入FIN-WAIT-1(终止等待1)状态。
  2. Server收到断开连接报文,发出确认报文,(ACK=1,ack=u+1,seq=v)并且带上自此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP告诉应用层的进程,Client向Server的链接释放了,Client已经没有数据要发送了,Server若发送数据,Client依然能接受到。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. Client收到Server的确认报文后,Client就进入FIN-WAIT-2状态,等待Server发送断开连接报文(在这之前还需要接受服务器发送的最后的数据)。
  4. Server将最后的数据发送完毕后,就向Client发送断开链接报文,(FIN=1,ACK=1,ack=u+1,seq=w),服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. Client收到Server的断开链接报文后,必须发出确认报文,(FIN=1,ACK=1,ack=w+1,seq=u+1)此时,Client就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。

 

转载于:https://my.oschina.net/u/3505620/blog/1815304

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值