资讯专栏INFORMATION COLUMN

python socket笔记

everfly / 2679人阅读

摘要:套接字是全双工的。做两件事将未链接的套接字转换为被动套接字,指示内核接受对此套接字的连接请求制定了内核为此套接口排队的最大连接个数对于指定的套接字,内核要维护未连接队列和已连接队列两个队列,完成三路握手的连接将从未连接队列移至已连接队列。

基础

一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端口。
套接字是全双工的。

listen函数

只用于tcp,listen的原型是def listen(self, backlog),backlog一般默认为5,但是可以人为调整,一些web服务器都会高于此值。listen做两件事:

将未链接的套接字转换为被动套接字,指示内核接受对此套接字的连接请求

制定了内核为此套接口排队的最大连接个数

对于指定的套接字,内核要维护未连接队列和已连接队列两个队列,完成三路握手的连接将从未连接队列移至已连接队列。accept时会从已连接队列中取出一个给当前进程,若队列为空则睡眠(表征了其事件驱动的特性)
backlog为两个队列和的最大值,超过此值将忽略新来的连接并且不发RST,以使客户端重发SYN,让TCP的重传机制进行重传。
backlog为0表示不限制连接数,可能会导致SYN Flooding,不建议使用该值

socket.SO_REUSEADDR
socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

可以用于以下四种情况:

当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。

SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。

SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。

SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP

将监听的连接设置为可重用,这个选项有一些很实用的功能:

防止重启监听程序时出现无法bind端口错误

实现TCP的NAT穿透

TCP粘包处理

与UDP不同,TCP是流协议,而流是连续不断没有界限的,使用TCP时需要自己处理分包。由于网络情况或者发送问题,有可能接收到包的顺序和发送的顺序不同,这时候就需要用一些方法去进行粘包处理。

比如,为了防止缓冲区等待造成的粘包,可以将使用sendall函数将数据立即发送而不是等待缓冲区满,并将socket设置为NODELAY

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

粘包问题其实是如何TCP数据消息边界的问题,总的来说有3种解决方案:

发送固定长度的消息

把消息的尺寸与消息一块发送

使用特殊标记来区分消息间隔

第二种情况应该是用得最普遍的,实现比较简单,也不会对性能造成大的影响。

http协议中基本三种方式都用到了,如图

http头部使用CRLF,也就是"回车换行"来区分头部之间的不同字段,使用消息体尺寸来分割http消息体的内容,使用EOF(ascii为255)来关闭连接。头部和消息体之间呢?使用两个CRLF来区分

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37692.html

相关文章

  • 安装配置gunicorn和NGINX的学习笔记

    摘要:博客写得差不多了,打算部署到云上因为速度的关系,不打算部署在上,于是申请了阿里云,环境是上篇文章提到的位安装和配置好和,又稍微了解点服务器的知识后,打算按这里的方法进行部署,思路是用当应用容器,当反向代理安装安装非常简单,一条命令就解决了测 博客写得差不多了,打算部署到云上因为速度的关系,不打算部署在AWS上,于是申请了阿里云,环境是上篇文章提到的CentOS 7 64位安装和配置好P...

    Ali_ 评论0 收藏0
  • 一、docker安装笔记

    摘要:出于安全考虑,一般系统上不会直接使用用户。因此,更好地做法是将需要使用的用户加入用户组。建立组将当前用户加入组退出当前终端并重新登录,进行如下测试。无需使用管理员权限测试运行运行列出镜像仓库名标签镜像创建时间占用空间 CentOS 7 安装 Docker CE 1. docker安装步骤(基于yum方式) 1.1 查看当前linux内核版本 uname -r #linux内核要求3.1...

    JerryWangSAP 评论0 收藏0
  • python---线程

    摘要:某进程内的线程在其它进程不可见。线程的实体包括程序数据和。包括以下信息线程状态。当线程不运行时,被保存的现场资源。用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。线程能够利用的表空 操作系统线程理论 线程概念的引入背景 进程之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运...

    Yangyang 评论0 收藏0
  • 网络编程 - 收藏集 - 掘金

    摘要:个高级多线程面试题及回答后端掘金在任何面试当中多线程和并发方面的问题都是必不可少的一部分。目前在生产环基于的技术问答网站系统实现后端掘金这一篇博客将详细介绍一个基于的问答网站的实现,有详细的代码。 15 个高级 Java 多线程面试题及回答 - 后端 - 掘金在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多...

    justCoding 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<