day32

########半连接数

import socket

server = socket.socket()
server.bind(("127.0.0.1",1688))
server.listen(5)
# backlog # 了解4

半连接数


三次握手没有完成 称之为半连接

原因1 恶意客户端没有返回第三次握手信息

原因2 服务器没空及时处理你的请求

socket中 listen(半连接最大数量)


# 最大半连接数 本质就是一个数组 未完成链接的socket 就会被加入到数组中 ,
# 每一次执行accept 就会挑一个来完成三次握手 ,如果达到最大限制 额外的客户端将直接被拒绝
# 我们可以调整内核参数来修改 最大等待时长 如果超时 客户还是没有回复第三次握手信息 就直接删除

 

#粘包问题

TCP才会发生粘包

粘包 仅发生在TCP协议中

1. 发送端 发送的数据量小 并且间隔短 会粘

2. 接收端 一次性读取了两次数据的内容 会粘
3. 接收端 没有接收完整 剩余的内容 和下次发送的粘在一起

无论是那种情况,其根本原因在于 接收端不知道数据到底有多少

解决方案就是 提前告知接收方 数据的长度

 

流式协议:数据和数据之间没有明显的分隔,都是以二进制方式发送,

优化机制,nigle.会把数据小,时间间隔短的数据一起发送,发送端和接受端,都有可能发生粘包

########解决方案

#发送端

1.使用struct 将真实数据的长度转为固定的字节数据

2.发送长度数据

3.发送真实数据

接收端

1.先收长度数据 字节数固定

2.再收真实数据 真实可能很长 需要循环接收

 发送端和接收端必须都处理粘包 才算真正的解决了

 代码里面

剩余长度大于缓冲区大小,则读取缓冲区大小.剩余长度小于缓冲区大小,则剩余多少,接受多少

代码里面规定,每次收多少,有多少接受多少,如果不够,就接受剩余的

######struct 模块

# 问题 长度信息转为二进制 长度不固定 对方不知道收多少
# 需要找到一种方案 让长度所占的字节固定

# struct 是一个内置模块 作用是 将python中的类型 转为字节数据 并且长度固定

 

################自定义报头

接收端

1第一次发送字典(报头,文件的信息)长度

用json

2.发送报头数据

3发送文件内容

 

接收端

1,接受报头长度

2.接受报头信息

3.接受文件内容

 

posted @ 2019-05-29 21:30  轩辕12  阅读(136)  评论(0编辑  收藏  举报