zoukankan      html  css  js  c++  java
  • TCP的三次握手和四次挥手

    SYN:请求连接
    ACK:回复
    FIN:断开连接

    三次握手


    TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接。[1]
    TCP三次握手的过程如下:
    客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SENT状态。
    服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
    客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
    三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

    四次挥手


    建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。
    (1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
    (2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
    注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
    (3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
    (4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1]
    既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
    注意:
    (1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。[2]
    (2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。
    (3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。
    无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。[2]

    服务端:

    import socket
    sk = socket.socket()
    sk.bind(('192.168.12.53',9000))   #把地址绑定到套接字
    sk.listen()          #监听链接
    
    conn,addr = sk.accept()    #接受客户端链接
    conn.send(b'hello')   #向客户端发送信息
    msg = conn.recv(1024)    #接收客户端信息
    print(msg)                #打印客户端信息
    conn.close()            #关闭客户端套接字
    sk.close()                #关闭服务器套接字(可选)

    客户端:

    import socket
    sk = socket.socket()                # 创建客户套接字
    sk.connect(('192.168.12.53',9000))  # 尝试连接服务器
    
    msg = sk.recv(1024)
    print(msg)                # 对话(发送/接收)
    sk.send(b'byebye')
    
    sk.close()                # 关闭客户套接字 

    通俗理解:

     三次握手
      accept接受过程中等待客户端的连接
      connect客户端发起一个syn链接请求
        如果得到了server端响应ack的同时还会再收到一个由server端发来的syn链接请求
        client端进行回复ack之后,就建立起了一个tcp协议的链接x
      三次握手的过程在代码中是由accept和connect共同完成的,具体的细节在socket中没有体现出来

    四次挥手
      server和client端对应的在代码中都有close方法
      每一端发起的close操作都是一次fin的断开请求,得到'断开确认ack'之后,就可以结束一端的数据发送
      如果两端都发起close,那么就是两次请求和两次回复,一共是四次操作
      可以结束两端的数据发送,表示链接断开了

  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/qimingming/p/12114995.html
Copyright © 2011-2022 走看看