码迷,mamicode.com
首页 > 其他好文 > 详细

TCP的握手和挥手

时间:2018-08-26 19:37:42      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:序号   time_wait   water   ESS   随机   oss   hand   紧急   占用   

  • 什么是TCP
    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 [1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
    技术分享图片
    先了解一下下面的名词:
    SYN ( synchronous 建立联机 )
  • ACK ( acknowledgement 确认 )

    PSH ( push 传送 )

    FIN ( finish 结束 )

    RST ( reset 重置 )

    URG ( urgent 紧急 )

    Sequence number ( 顺序号码 )

    Acknowledge number ( 确认号码 )

    2.TCP的三次握手
    技术分享图片
    所谓三次握手(Three-Way Handshake)即建立 TCP 连接,是指建立一个 TCP 连接时,需要客户端和服务端总共发送 3 个包以确认连接的建立。
    (1)第一次握手:Client 将标志位 SYN 置为 1,随机产生一个值 seq=J,并将该数据包发送给 Server,Client 进入 SYN_SENT 状态,等待 Server 确认。

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

    (3)第三次握手:Client 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给 Server,Server 检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,Client 和 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间可以开始传输数据了
    3.四次挥手
    技术分享图片
    所谓四次挥手(Four-Way Wavehand)即终止 TCP 连接,就是指断开一个 TCP 连接时,需要客户端和服务端总共发送 4 个包以确认连接的断开。
    由于 TCP 连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个 TCP 连接上仍然能够发送数据,直到这一方向也发送了 FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

    (1)第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。

    (2)第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号 +1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。

    (3)第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。

    (4)第四次挥手:Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号 +1,Server 进入 CLOSED 状态,完成四次挥手。
    需要注意的是:

    (A)不要将确认序号 Ack 与标志位中的 ACK 搞混了。

    (B)确认方 Ack= 发起方 Req+1,两端配对。

    TCP的握手和挥手

    标签:序号   time_wait   water   ESS   随机   oss   hand   紧急   占用   

    原文地址:http://blog.51cto.com/12630492/2164581

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!