美文网首页进击的皮皮虾
TCP协议的三次握手和四次挥手

TCP协议的三次握手和四次挥手

作者: 柳豪 | 来源:发表于2017-02-24 22:05 被阅读104次

    Part 1

    TCP协议的简单介绍

    TCP(Transmission Control Protocol、传输控制协议),是一种面向连接的、可靠的、基于字节流传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。

    更具体查看维基百科:https://zh.wikipedia.org/wiki/传输控制协议

    TCP包头格式:

    TCP包头格式

    TCP标志位(标志符)

    TCP数据包中的标识信号有6种:

    • SYN(synchronous建立联机)
    • ACK(acknowledgement 确认)
    • PSH(push传送)
    • FIN(finish结束)
    • RST(reset重置)
    • URG(urgent紧急)

    TCP状态码

    • LISTEN
    • SYN-SENT
    • SYN-RECEIVED
    • ESTABLISHED
    • FIN-WAIT
    • CLOSE-WAIT
    • CLOSING
    • LAST-ACK
    • TIME-WAIT
    • CLOSED

    一次TCP连接和传输各TCP客户端的状态变化

    下表为TCP状态码列表,以S指代服务器,C指代客户端,S&C表示两者,S/C表示两者之一:

    状态码&终端 说明
    LISTEN S 等待从任意远程TCP端口的连接请求。侦听状态。
    SYN-SENT C 在发送连接请求后等待匹配的连接请求。通过connect()函数向服务器发出一个同步(SYNC)信号后进入此状态。
    SYN-RECEIVED S 已经收到并发送同步(SYNC)信号之后等待确认(ACK)请求。
    ESTABLISHED S&C 连接已经打开,收到的数据可以发送给用户。数据传输步骤的正常情况。此时连接两端是平等的。
    FIN-WAIT-1 S&C 主动关闭端调用close()函数发出FIN请求包,表示本方的数据发送全部结束,等待TCP连接另一端的确认包或FIN请求包。
    FIN-WAIT-2 S&C 主动关闭端在FIN-WAIT-1状态下收到确认包,进入等待远程TCP的连接终止请求的半关闭状态。这时可以接收数据,但不再发送数据。
    CLOSE-WAIT S&C 被动关闭端接到FIN后,就发出ACK以回应FIN请求,并进入等待本地用户的连接终止请求的半关闭状态。这时可以发送数据,但不再接收数据。
    CLOSING S&C 在发出FIN后,又收到对方发来的FIN后,进入等待对方对连接终止(FIN)的确认(ACK)的状态。少见。
    LAST-ACK S&C 被动关闭端全部数据发送完成之后,向主动关闭端发送FIN,进入等待确认包的状态。
    TIME-WAIT S/C 主动关闭端接收到FIN后,就发送ACK包,等待足够时间以确保被动关闭端收到了终止请求的确认包。【按照RFC 793,一个连接可以在TIME-WAIT保证最大四分钟,即最大分段寿命(maximum segment lifetime)的2倍】
    CLOSED S&C 完全没有连接。

    Part 2

    一个可靠的TCP连接的建立

    三次握手(three-way handshake)是发生在TCP层,三次握手的目的是建立一个链接采用三次握手确认建立一个连接,三次握手之后才开始用此连接发送数据包(通过三次交流,双方共发送了两次连接申请包和两次确认建立连接的包)

    • 第一次握手:主机A发送位码为SYN=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
    • 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),SYN=1,ACK=1,随机产生seq=7654321的包
    • 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1,连接建立成功。

    一个可靠的TCP连接的断开

    四次挥手(four-way handshake)是发生在TCP层,四次挥手的目的是断开刚才建立的连接,四次挥手之后双方不在通信

    • 第一次挥手:客户端A发送一个FIN,和一个随机数序列号i,代表请求与服务器B断开连接
    • 第二次挥手:服务器B收到包之后,知道FIN请求,发送一个确认段ACK,和确认序号i+1,同时发送一个FIN和随机序列号j
    • 第三次挥手:客户端A接收到ACK和序列号+1后确认是来自服务端B的,同时收到了服务器B的FIN和序列号j,然后发送ACK和序列号j+1给服务端B
    • 第四次挥手:服务器B接收到客户单的ACK和j+1,确认断开。 连接断开成功。
    参考

    稻草人的技术博客

    相关文章

      网友评论

        本文标题:TCP协议的三次握手和四次挥手

        本文链接:https://www.haomeiwen.com/subject/wbxgwttx.html