TCP三次握手和四次挥手

标签: tcp
6人阅读 评论(0) 收藏 举报
分类:

写在前面:

    在TCP/IP协议栈中,尽管TCP协议和UDP协议都是用网络层,但是他们向应用层却提供了不同的服务。TCP提供了一种面向连接的可靠地字节流传输,而UDP协议提供的是面向无连接的,简单不可靠的信息传输。

    面向连接也就意味着客户端和服务器,在交换彼此数据之前,需要建议一个TCP连接,这篇博客就将会结束如何建立和释放一个TCP连接,也就是我们说的三次握手和四次挥手。

TCP报文格式:


(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
       (A)URG:紧急指针(urgent pointer)有效。
       (B)ACK:确认序号有效。
       (C)PSH:接收方应该尽快将这个报文交给应用层。
       (D)RST:重置连接。
       (E)SYN:发起一个新连接。
       (F)FIN:释放一个连接。

三次握手:

    三次握手(Three Way HandShake)的过程是为了建立可靠的通信信道,确保通信双方,即发送方与接收方处于正常状态,可以建议一个TCP连接。

我们用一张图来描述三次握手的过程:


    在建立TCP连接的过程中,通信双方要发送3次数据包,才能完成建立连接的过程。

第一次握手:

    Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,这时Client进入SYN_SENT状态,等待Server确认。

第二次握手:

    Server收到数据包后由于标志位SYN=1,知道Client请求建立连接,Server将标志位的SYN和ACK都置为1,将确认序号ack=J+1,并随机产生一个值seq=K,将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:

    Client收到确认后,检查确认序号ack是否为J+1,标志位ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态。    

    这样就完成三次握手,随后Client与Server之间可以开始传输数据了。

SYN攻击:

    在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击。

四次挥手:

    所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个数据包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:

    

第一次挥手:

    Client发送一个标志位FIN=1,用来关闭Client到Serve的数据传送,并随机产生一个值seq=X,将该数据包发送给Server,Client进入FIN_WAIT_1状态。

第二次挥手:

    Server收到标志位FIN=1,知道Client要释放连接,将标志位ACK=1,确认序号ack=X+1,并生成一个随机值seq=Z。服务器进入 CLOSE_WAIT状态。

第三次挥手:

    Server发送标志位FIN=1,用来关闭Server到Client的数据传送。Server进入LAST_ACK状态。

第四次挥手:

    Client收到FIN后,CLient进入TIME_WAIT状态,发送ACk报文,并发送确认序号=Y+1,Server进入CLOSED状态,完成四次挥手。

四次挥手状态:

    FIN_WAIT_1状态: 表示等待对方的FIN报文。Socket处于ESTABLISHED状态,向服务器发送FIN报文,立即进入 FIN_WAIT_1状态。

    CLOSE_WAIT状态:表示等待关闭。当收到客户端的FIN报文,并返回一个ACK报文后Socket进入CLOSE_WAIT状态。接下来,只需要检查自己是否还有数据要发给客户端,如果没有,就向客户端发送FIN 报文。

    FIN_WAIT_2状态:表示等待对方的FIN报文。当客户端收到了服务器的ACK后,进入FIN_WAIT_2状态。这个状态还是要告诉服务器,我还有ACK报文要发送,等下再关闭连接。

    LAST_ACK状态:被动关闭连接的一方,在FIN报文之后,最后等待客户端的ACK报文。当收到了ACK报文之后,别动关闭的一方就会进入了CLOSED状态。

    TIME_WAIT状态:表示收到了对方的FIN报文,也向对方发送了ACK报文。只要等待2MSL后,就可回到CLOSED状态。

    CLOSED状态:表示连接中断。

    

为什么建立连接要3次,而关闭连接要4次?

    TCP协议一种面向连接的,可靠的,基于字节流的传输层协议。且TCP是全双工模式,当客户端发出FIN报文后,意味着客户端告诉服务器自己没有数据要发送了,但客户端仍然可以接受数据。然后,当服务器发送ACK报文段时,表示服务器已经知道客户端不会再发送数据了。其次,当服务器发送FIN报文时,表示服务器也没有数据要发送。

    建立连接时,这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,会把ACK和SYN放在一个报文里发送给客户端。




    

查看评论

图解TCP协议中的三次握手和四次挥手

最近在复习计算机网络,看到TCP这一章,总结一下。 建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示: 1.jpg 先来看看如何建立连接的: 2.p...
  • GarfieldEr007
  • GarfieldEr007
  • 2017年08月07日 23:09
  • 636

tcp三次握手四次挥手(及原因)详解

TCP(Transmission Control Protocol,传输控制协议)是 面向连接的协议,也就是说在收发数据之前,必须先和对方建立连接, 一个TCP连接必须要经过三次“对话”才能建立起来,...
  • xulu_258
  • xulu_258
  • 2016年04月13日 21:02
  • 14442

TCP三次握手四次挥手过程详解

TCP头部: 其中 ACK   SYN  序号  这三个部分在以下会用到,它们的介绍也在下面。 暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的...
  • imilli
  • imilli
  • 2016年02月01日 18:38
  • 3142

TCP的三次握手与四次挥手(详解+动图)

背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进...
  • qzcsu
  • qzcsu
  • 2017年06月04日 21:53
  • 8078

TCP三次握手与四次挥手过程

首先,客户端与服务器均处于未连接状态,并且是客户端主动向服务器请求建立连接: 客户端将报文段中的SYN=1,并选择一个seq=x,(即该请求报文的序号为x)  将这个报文发送到服务器。此时,客户端进...
  • shuaicenglou3032
  • shuaicenglou3032
  • 2017年03月28日 13:57
  • 12427

理论经典:TCP协议的3次握手与4次挥手过程详解

摘要: 本文将分别讲解经典的TCP协议建立连接(所谓的“3次握手”)和断开连接(所谓的“4次挥手”)的过程。 1、前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与...
  • omnispace
  • omnispace
  • 2016年09月29日 14:42
  • 21629

TCP三次握手与四次挥手的过程及原因

****本篇文章来彻彻底底的分析一下TCP三次握手与四次挥手的过程及原因。。。→_→****...
  • kongkongkkk
  • kongkongkkk
  • 2017年07月01日 22:43
  • 566

TCP三次握手与四次挥手最简洁易懂的解释

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示: 建立连接的过程: TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换...
  • peter_teng
  • peter_teng
  • 2016年10月10日 11:16
  • 2430

TCP/IP三次握手与四次挥手学习笔记

tcp的"三次握手"与"四次挥手"是tcp/ip的重点知识,一直不甚熟悉,网络上的资料也很多很杂,要么太繁,要么太简,所以在此学习总结以适应博主自身的情况,交流才能进步,望各路大神提出宝贵意见,共同进...
  • zhangliangzi
  • zhangliangzi
  • 2016年02月19日 16:13
  • 1744

面试题:三次握手、四次握手内容整理

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二...
  • qq_18425655
  • qq_18425655
  • 2016年08月09日 15:39
  • 17102
    个人资料
    持之以恒
    等级:
    访问量: 6474
    积分: 258
    排名: 30万+
    最新评论