TCP协议的三次握手

tree-way handshake 建立TCP连接
客户端向服务端 发送 3个数据包 用于 确认建立连接。
在socket编程中, 这一过程 由 客户端执行 connect来触发。

下图是一个通俗类比:

怎么断开python和数据库的连接 python socket断开连接_客户端


具体流程图如下

第一步:SYN 表示想建立连接

第二步:SYN=1表示确认可以建立连接。

ACK 表示 确认号表示想收到对方哪个序号的数据,之前的都已收到。

第三步: ACK=1 表示 确认 上面的服务器确认建立连接的信息已经收到了。

怎么断开python和数据库的连接 python socket断开连接_怎么断开python和数据库的连接_02


怎么断开python和数据库的连接 python socket断开连接_tcp/ip_03


1客户端发送建立连接请求

2服务端接受请求后,返还给客户端,说 同意建立请求。

3客户端收到后,返回收到 服务端 发送的同意建立请求命令。

4两者开始进行通信。

怎么断开python和数据库的连接 python socket断开连接_怎么断开python和数据库的连接_04


TCP的三次握手是 客户端 和 服务端 建立连接的时候需要进行的操作。

第一次,客户端 发送一个 连接请求 给 服务端。

第二次,服务端 发送同意 给客户端。

第三次,客户端 确认 收到 服务端 的 同意。

握手次数
多了,浪费服务器资源
少了,服务器会反复发送同一个请求,当出现 客户端发送丢失的情况。

总结

三次握手 是 TCP建立连接的时候发送的三个数据包。
概念
简单描述
必须是3次,如果少于3次,会造成资源的浪费。

TCP的4次挥手

发了四个数据包,用于断开连接。

怎么断开python和数据库的连接 python socket断开连接_tcp/ip_05


第一步

A 客户端 主动请求关闭连接。

FIN = 1 表示请求关闭

seq = u 包的序号

第二步
B服务器 回复
ACK = 1 表示收到
seq = v 服务器自己的包序号
ack = u + 1 服务端表示收到包了

第三步
服务端处理完成后
B服务端回复
FIN = 1 表示同意关闭连接
ACK = 1 表示确认收到包了
seq = w 包的序号为w
ack = u + 1 表示确认收到客户端的包

第四步
客户端收到信息
ACK = 1
seq = u+1
ack = w + 1

相比三次握手,服务器多发了一次
因为服务器要告知客户端,等其将手头业务处理完,再断开连接。

主动发起的一方必须等待2个MSL长的时间。
为两个报文的传输时间。 30s-2mins

下面主动修改配置,不让其等待 2MSL时间
这样断开后,端口立即就可以用了

'''
客户端:
目标:/home/demo/Document/Python_projects/day04/1.txt
下载到:/home/demo/Desktop/1.txt
1. 导入模块
2. 创建套接字
3. 建立连接
4. 接受用户输入文件名
5. 发送文件名到服务器端
6. 创建文件,并且准备保存
7. 接受服务端发送额数据,保存到本地(循环)
8. 关闭套接字
'''
# 1. 导入模块
import socket

# 2. 创建套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 修改设置,让套接字地址可以重用
# tcp_client_socket.setsockopt(当前套接字,属性名,属性值)
# socket.SO_REUSEADDR 地址是否可重用    True可以重用,False不可以重用
tcp_client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
# 3. 建立连接
tcp_client_socket.connect(("192.168.150.71", 8080))
# 4. 接受用户输入文件名
file_name = input("请输入要下载的文件名: \n")
# 5. 发送文件名到服务器端
tcp_client_socket.send(file_name.encode())
# 6. 创建文件,并且准备保存
with open("/home/Desktop/" + file_name, "wb") as file:  # w是文件不存在就创建
    # 7. 接受服务端发送额数据,保存到本地(循环)
    while True:
        file_data = tcp_client_socket.recv(1024)
        # 判断数据是否传送完毕
        if file_data:
            file.write(file_data)
        else:
            break
# 8. 关闭套接字
tcp_client_socket.close()

是什么TCP四次挥手?

在TCP断开连接的时候,会发送四个包,来确认断开连接。
主动发起一方,发送断开连接请求。
服务器回复收到,当不会立即断开。
当服务器处理完后,主动向客户端发送同意断开请求。
主动发起方,表示接受到断开请求。

当主动发起方,断开连接,需要等待一个2倍的MSL的时间。

MSL maximum segment lifetime 报文最大生存时间

怎么断开python和数据库的连接 python socket断开连接_客户端_06

原因:
如果最后一次服务器发送的包出问题,没发送过来。
服务端再次重发,客户端等待接收。

总结

四次挥手:TCP断开连接时候,发送的4个数据包,用于确保断开连接。