TCP与UDP、socket模块
1.传输层之TCP与UDP协议
1.TCP协议
1.传输控制协议(也称为TCP协议或可靠协议)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议,(数据不容易丢失);造成数据不容易丢失的原因不是因为有双向通道,而是因为有反馈机制,类似工作机制如下:给对方发送消息之后会保留一个副本,知道你对方回应消息已收到时才会删除,否则会在一定时间内反复发送。
2.洪水攻击:同一时间有大量客户端请求建立连接,会导致服务端一直处于SYN_RCVD状态,如果遇到洪水攻击就应建立缓冲池,类似'排队'。
3.服务端如何区分客户端建立连接的请求:可以对请求做唯一标识
4.三次握手建立连接:
4.1 当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求,询问能否与服务端进行连接,这个数据包称为SYN包。
4.2 如果服务端同意则回复一个SYN+ACK包
4.3 客户端收到之后回复一个ACK包,建立连接
"""
三次握手的原因在于:假设采取两次握手建立连接,因为某些错误客户端的SYN1包没有到达服务器,在中间表某个节点产生滞留,此时客户端会重新发送SYN包,这次数据正常送达,服务端回复SYN+ACK之间建立连接,但是突然第一包的数据网络阶段突然恢复,SYN1此时送达服务端,这是服务端会认为是客户端重新发起一次连接。如果三次握手之后服务端收不到最后的ASK包,自然不会建立连接
"""
5.四次挥手断连接:
5.1 当客户端没有消息要发给服务端,由客户端首先发送syn消息请求断开通道。
5.2 服务端客户端回复ACK包,无条件同意断开请求。
5.3 服务端此时还可以发送未发送数据,而客户端还可以接受数据,待服务端发送完数据后,向客户端发送syn包,进入最后确认状态。
5.4 客户端收到之后回复ACK包,此时连接关闭。
"""
TCP类似于打电话,UCP类似于发短信
"""
2.UPD协议
1.也称为数据报协议、不可靠协议,早期的QQ使用的是纯生的(不加任何额外功能)UDP协议。使用UDP的原因就是因为很简单、快捷、粗暴、只要指定对方的地址就可以发消息了。
"""
TCP我们可以看成是打电话:双方有来有回
UDP我们可以看成是发短信:只要发了就行,不管对方看不看
"""
2.应用层
应用层相当于是程序员自己写的应用程序 里面的协议非常的多
常见的有:HTTP、HTTPS、FTP
3.socket模块(基于TCP协议)
1.socket介绍
如果我们需要编写基于网络进行数据交互的程序,意味着我们需要自己通过代码来控制我们之前所学习的OSI七层(很繁琐,很复杂,类似于我们自己编写操作系统)。socket类似于操作系统,封装了丑陋复杂的接口提供简单快捷的接口。
Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket也叫套接字
基于文件类型的套接字家族(单机):AF_UNIX
基于网络类型的套接字家族(联网:AF_INET
2.代码步骤
'''TCP是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端'''
server(服务)端:
import socket
1.创建套接字:sever = socket.socket()
2.绑定地址:sever.bind(('127.0.0.1', 8870))
''' "127.0.0.1"是回送地址,指本地机,一般用来测试,当客户端和服务端在一台电脑上时使用'''
3.侦听客户请求:sever.listen()
4.接收客户连接:sock,addr = sever.accept()
5.接收客户信息:data = sock.recv(1024) print(data.decode('utf8'))
6.向客户发送信息:sock.send(msg.encode('utf8')) # 需要转成二进制发送
7.关闭客户端套接字:sock.close()
client(客户)端:
import socket
1.创建套接字:client = socket.socket()
2.尝试链接服务器:client.connect(('127.0.0.1', 8870))
3.发送请求:client.send(发送的内容(字符串类型).encode('utf8'))
4.接受信息:data = client.recv(1024) print(data.decode('utf8'))
5.关闭套接字:client.close()
3.代码优化
1.聊天内容自定义:针对消息采用input获取
2.让聊天循环起来:用while加上循环
3.用户输入的消息不能为空:本质其实是两边不能都是recv或者send 一定是一方收一方发
4.服务端多次重启可能会报错,Address already in use(主要是mac电脑会报)
修改方法:
1.改端口号
2.拷贝以下代码:
from socket import SOL_SOCKET,SO_REUSEADDR # 放在import socket下面
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 在bind前加
5.当客户端异常断开的情况下,如何让服务端继续服务其他客人:
windows服务器会直接报错
mac服务端会有一段时间反复接收空消息延迟报错
优化后的代码(服务端未设置空白消息检测):
服务端:
import socket
from socket import SOL_SOCKET, SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8081))
server.listen(5)
while True: # 链接循环
sock, addr = server.accept()
while True: # 通信循环
try:
data = sock.recv(1024)
if len(data) == 0:
break
print(f'来自于客户端{addr}的消息>>>:', data.decode('utf8'))
msg = input('请输入发送给客户端的消息(不能发空消息)>>>:').strip()
sock.send(msg.encode('utf8'))
except BaseException:
break
客户端:
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8081))
while True:
msg = input('请输入您想要发送给服务端的消息>>>:').strip()
if len(msg) == 0:
print('不能发送空消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('来自于服务端发送过来的消息>>>:', data.decode('utf8'))
服务端设置成可以检测空白消息:
服务端:
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8082))
server.listen(5)
while True:
sock, addr = server.accept()
while True:
try:
data = sock.recv(1024)
print(f'来自客户端{addr}的消息>>>:',data.decode('utf8'))
while True:
msg = input('>>>:').strip()
if len(msg) == 0:
print('不能发送空白消息')
continue
break
sock.send(msg.encode('utf8'))
except Exception:
break
客户端:
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8082))
while True:
msg = input('>>>:').strip()
if len(msg) == 0:
print('不能发送空白消息')
continue
client.send(msg.encode('utf8'))
data = client.recv(1024)
print('来自服务端的消息>>>:', data.decode('utf8'))
4.半连接池的概念
server.listen(5) # 半连接池
当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题)
假设服务端只有一个人的情况下
在测试半连接池的时候 可以不用input获取消息 直接把消息写死即可
TCP与UDP、socket模块的更多相关文章
- HTTP/TCP/IP UDP Socket等区别联系
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- [net]tcp和udp&socket
参考 TCP和UDP连接 关于传输层TCP.UDP协议可能我们平时遇见的会比较多,有人说TCP是安全的,UDP是不安全的,UDP传输比TCP快,那为什么呢,我们先从TCP的连接建立的过程开始分析,然后 ...
- TCP和UDP Socket
1.tcp协议的编程 * 1:客户端.步骤 * 1:创建Socket对象,构造方法里需要指定服务端的ip地址和端口. * Socket socket = new S ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具 推荐一些socket工具,TCP、UDP调试、抓包工具
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...
- 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具
老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...
- 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- VC++使用socket进行TCP、UDP通信实例总结
1. 两台计算机通信需要协议,通信的两台计算机IP必须唯一 2. 同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...
- 网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
随机推荐
- perl静态变量
state操作符功能类似于C里面的static修饰符,state关键字将局部变量变得持久. state也是词法变量,所以只在定义该变量的词法作用域中有效,举个例子: #!/usr/bin/perl u ...
- 记一次mybatis性能问题分析过程
说明 今天发现个2个问题,一是mybatisplus执行一条某个字段值比较长(约1.8M的文本)的INSERT语句耗时要90s+;二是读取这个1.8M文本返回给前端耗时6min.查查查查了半天搞不清楚 ...
- Azure DevOps Server 用户组加入 Azure AD Domain Service 管理用户
一,引言 今天我们继续讲解 Azure DevOps Server 的内容,对于管理用户组除了在 Azure DevOps Server 服务器上添加管理员方式外,还有没有其他方式,Azure Dev ...
- HSSFSheet XSSFWorkbook SXSSF Java读取Excel数据
HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现 XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现 SXSSF通过一个滑动窗口 ...
- 【实时数仓】Day02-DWD、DIM层数据准备:各层职能、行为日志DWD层、业务日志DWD层及分流(Phoenix和HBASE)
一.需求分析及实现思路 1.分层需求 建立数仓目的:增加数据计算的复用性 可以从半成品继续加工而成 从kafka的ODS层(数据一开始就读到了kafka)读用户行为数据和业务数据,并写回到kafka的 ...
- 【每日一题】【排序sort重载】【工具类】2021年12月23日-31. 下一个排列
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数). 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须 ...
- USB限流IC,限流开关保护芯片
PW1503和PW1502是超低RDS(ON)开关,具有可编程电流限制的USB限流IC,以保护电源于过电流负载和正极负极短路的保护.它具有过温保护以及反向闭锁功能. PW1503,PW1502均采用S ...
- 为什么Git远程仓库中要配置公钥?
最近在使用阿里云效平台代码管理,首次使用新建仓库,使用SSH时需要配置公钥.之前也在GitHub.Gitee上配置过,每次都能正常使用,也没有思考过为什么要配置公钥.这次记录一下其中的原理. 本地和远 ...
- 开发一个最简单的iOS App
开发一个最简单的iOS App 大家好,我是孜孜不倦学习的Zhangbeihai. 上月底我组织了[组队学习]TensorFlow 入门课程(中文) ,截至目前有300多同学加入.主要就是 Tenso ...
- BUU_RE学习记录
一.easyre 1.010打开,直接搜flag,得到flag 二.reverse1 1.先查壳,得知是64位无壳,直接用IDA打开 2.shiftF12查找字符串,发现关键语句 3.查看相应代码,F ...