TCP协议的三次握手
tree-way handshake 建立TCP连接
客户端向服务端 发送 3个数据包 用于 确认建立连接。
在socket编程中, 这一过程 由 客户端执行 connect来触发。
下图是一个通俗类比:
具体流程图如下
第一步:SYN 表示想建立连接
第二步:SYN=1表示确认可以建立连接。
ACK 表示 确认号表示想收到对方哪个序号的数据,之前的都已收到。
第三步: ACK=1 表示 确认 上面的服务器确认建立连接的信息已经收到了。
1客户端发送建立连接请求
2服务端接受请求后,返还给客户端,说 同意建立请求。
3客户端收到后,返回收到 服务端 发送的同意建立请求命令。
4两者开始进行通信。
TCP的三次握手是 客户端 和 服务端 建立连接的时候需要进行的操作。
第一次,客户端 发送一个 连接请求 给 服务端。
第二次,服务端 发送同意 给客户端。
第三次,客户端 确认 收到 服务端 的 同意。
握手次数
多了,浪费服务器资源
少了,服务器会反复发送同一个请求,当出现 客户端发送丢失的情况。
总结
三次握手 是 TCP建立连接的时候发送的三个数据包。
概念
简单描述
必须是3次,如果少于3次,会造成资源的浪费。
TCP的4次挥手
发了四个数据包,用于断开连接。
第一步
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 报文最大生存时间
原因:
如果最后一次服务器发送的包出问题,没发送过来。
服务端再次重发,客户端等待接收。
总结
四次挥手:TCP断开连接时候,发送的4个数据包,用于确保断开连接。