python高级 笔记 09 (TCP协议三次握手 和 4次挥手)

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个数据包,用于确保断开连接。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值