python高级网络编程_Python高级网络编程系列之第一篇

在上一篇中我们简单的说了一下Python中网络编程的基础知识(相关API就不解释了),其中还有什么细节的知识点没有进行说明,如什么是TCP/IP协议有几种状态,什么是TCP三次握手,什么是TCP四次握手以及如何设计一个单线程多任务版的TCP服务器,这些问题都是本文需要解决的问题。

一、TCP/IP的11种状态

netstat -na | grep port_num:可以查看TCP/IP状态

一个完整的Socket通信过程,会经过11种TCP/IP状态,状态图如下:

1299353-20180523085128190-538868276.png

思考三个问题:

1.为什么TCP/IP通信前需要三次握手?

因为TCP是全双工协议,得先建立连接才能实现任意一方接收和发送数据的功能,因此需要进行安全认证!这就好比在战争年代,使用电台发送情报一样。

当A想要与B通信时,A需要发送一个SYN包a给到B,当B收到这个包时,会发送一个ACK a+1的包回给B,同时还要发送一个SYN b给A,确认你是不是要与我通信,然后当A发送ACK b+1给到B时,B收到这个包,那么证明A是对的人,这样A与B之间就能成功建立连接,他们之间就可以相互通信了。

2.为什么TCP/IP断开时需要四次挥手?

1). 为什么要显式调用两次close()函数?

当任意一方(假设为A)先调用close()函数时,此时A就不能发送和接收数据了。但是这并不影响另一方(假设为B),也就是说B还可以往TCP/IP缓冲区中写入数据,只不过当内核往A发送数据时会发生错误。当B也调用close()函数时,说明B也要关闭套接字了,就不再发送和接收数据了,他们的通信也就结束了。

2).FIN_TIME_2状态:

该状态也称为半连接状态。当A调用close()函数时,此时会在数据流的末尾加上0,当B接收到数据时,read()函数返回0,说明A已经关闭了,那么TCP/IP会偷偷的向A发送一个确认状态,但是B还没有关闭,此时A就处于半连接状态了。

为什么会出现半连接状态呢?

因为当B端的read()返回0时,TCP/IP协议知道A已经关闭了,但B还没有调用close()函数,而且TCP/IP协议又是双通道协议,只要B没有关闭,那么B还是可以进行读和写操作的。因此A就不能继续往前推进到TIME_WAIT状态。

3). TIME_WAIT状态:

主动关闭的的那一端A最终会推进到TIME_WAIT状态,只有当对方B也关闭了。只不过要等一会(2MSL)再关闭,因为存在网络延迟的原因导致最后一个确认包没能及时发送出去。当处于TIME_WAIT状态时,如果ACY y+1发送失败时,可以重新发送,保证对方真正处于关闭状态。这也是为什么会出现端口可重用选项的原因。

3.在状态图中,我们只看到了10种状态,那还有一种是什么?

还有一种是CLOSING状态,这种状态比较特殊,只有当双方同时关闭的时候才会出现,状态图变化如下:

1299353-20180523085557390-1990456161.png

二、一个简单版的非阻塞服务器

在经过了上面对TCP/IP协议的详细分析之后,我们可以写一个稍微复杂一些的TCP服务器了,强化一下我们讲过的知识点。

1 defmain():2 #1.创建TCP 服务器

3 tcp_sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)4 tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)5 #2.绑定到指定端口

6 tcp_sock.bind(('', 6060))7 #3.设置为被动模式

8 tcp_sock.listen(128)9 #4.把服务器端设置为非阻塞模式

10 tcp_sock.setblocking(False)11

12 #用来保存每个与服务器建立了连接的客户端

13 clients =list()14 #5.等待客户端的连接

15 whileTrue:16 time.sleep(1)17 #当把阻塞的东西设置为非阻塞时,一定会发成异常

18 try:19 client_sock, addr =tcp_sock.accept()20 print(client_sock)21

22 #此时再把客户端设置为非阻塞模式,

23 client_sock.setblocking(False)24 #把建立好了的连接保存起来

25 clients.append(client_sock)26 exceptException as e:27 print('------------没有客户端来连接----------')28

29 for new_client inclients:30 try:31 #接收数据,因为把客户端设置成了非阻塞,

32 #那么所有的阻塞操作都变成了非阻塞模式

33 data = new_client.recv(1024).decode()34 if data: #此时客户端还在保持连接状态

35 print(data)36 else: #客户端已经断开连接了

37 new_client.close()38 clients.remove(new_client)39 print(data)40 exceptException as e:41 print('-------客户端未发送数据-------')42

43

44 if __name__ == '__main__':45 main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值