Socket 网络编程实践经验

简介: 目录目录相关文章Socket 与 HTTP 的区别生产实践考虑网络断开重连问题Heartbeat 心跳机制使用非阻塞模式下的 select 函数进行 Socket 连接检查会话过期问题同步还是异步问题数据缓存问题完全断开连接问题相关文章NOTE:本文假设你已经对 Socket 的使用有一定的了解。

目录

相关文章

NOTE:本文假设你已经对 Socket 的使用有一定的了解。

Python Module_Socket_网络编程

Socket 与 HTTP 的区别

首先通过对比法来了解两者不同的特性:

  • HTTP:超文本传输协议,首先它是一个协议,并且是基于 TCP/IP 协议(传输层)之上的应用层协议,要想通过 HTTP 来进行通信,首先需要双方建立起 TCP/IP 连接,因为TCP/IP 主要解决的问题是数据如何在网络中传输而 HTTP 协议主要解决的问题是如何包装需要传输的数据。所以 HTTP 协议能够支持使用 Header 信息来详细规定浏览器与服务器之间的通信规则。HTTP 连接是基于 Request-Response 的非持久(短)连接,其连接的生命周期通过 Request 界定,一个 Request 一个 Response,此次 HTTP 连接的生命周期结束。对于这点在 HTTP 1.1 中进行了改进,支持 Keep-alive,允许在一个 HTTP 连接的生命周期中,可以发送多个 Request,接收多个 Response,但由 Request 来界定生命周期的本质没有改变。

  • Socket:首先需要注意的是 Socket 不是一种协议,而是一种调用接口(API)或称之为 TCP/IP 的基本操作单元。Socket 实际上是对 TCP/IP 协议的封装,通过 Socket,就能够应用 TCP/IP 协议来建立连接并传输数据。Socket 连接是持久化(长)连接,这种连接的生命周期能够自主控制,也就是说客户端和服务器端一旦建立连接后,理想状态下连接会持久存在,直到一方自动发出断开指令。

生产实践考虑

下面列出在生产项目中应用 Socket 所需要注意的几点:

  1. 网络断开重连问题
  2. 连接会话和身份认证问题
  3. 同步和异步问题
  4. 数据缓存问题
  5. 完全断开连接问题

网络断开重连问题

的确,Socket 连接在理想的网络环境下是持久的长连接,但实际网络环境是复杂的,网络抖动、路由宕机等各种网络问题都会导致 Socket 连接被动断开。而且 Socket 没有提供「自动重连」的机制,所以解决网络断开重连问题,是 Socket 程序稳定性的重要保证。

思路:在 发送接收 前检查 Socket 连接是否依然生效,若不生效,则重新建立 Socket 连接。

那么首先需要解决的是:如何判断 Socket 连接状态是否 ACTIVE?

NOTE:一般的来说,「判断 Socket 连接状态是否 ACTIVE」都是服务端的功能需求,因为服务端需要以此来作为是否回收连接资源的依据。而客户端则无需特别在意,因为即便断开了连接也只需捕获异常、重新连接、重新发送即可。

Heartbeat 心跳机制

别名定义

  • 客户端 Socket == cli-socket
  • 服务端 Socket == ser-socket

一般的 Socket 应用程序逻辑中,ser-socket 应该能够感知到 cli-socket 的断开,并且执行相应的断开逻辑处理,释放相应的 Socket 连接资源。但实际是,ser-socket 无法有效的区分 cli-socket 是处于长时间空闲还是处于 offline 的状态,所以也无法确定 cli-socket 的连接是否已经断开。为解决这个问题,程序员所提出的思路就是,屏蔽「长时间空闲」的场景,让 cli-socket 看起来始终是忙碌的(不断发送「无用包」),直到其静默即表示连接断开。

这就是较为通用的用于保证连接质量的心跳机制,而 cli-socket 发送的无用包也称之为心跳包。所谓心跳包就是 cli-socket 定时发送简单的协议信息给 ser-socket,以此让 ser-socket 知道 cli-socket 依旧 online。相对的, ser-socket 就会认为 cli-socket 已经断开。注意,发包方可以是 cli-socket 也可以是 ser-socket,但出于效率的考虑(减轻服务器压力),一般由 cli-socket 承担。如果是流式 Socket(for TCP),则使用 send 发出;如果是数据报式 Socket(for UDP),则使用 sendto 发出。还有一点需要说明,心跳包实际是一个自定义协议包,由开发者制定,并在 cli-socket 和 ser-socket 中遵守。

NOTE:如果仅为了确定 ser-socket 是否 online,可以用 TCP 协议自带的心跳包,应用 socket.socket.setsockopt 的 SO_KEEPALIVE 属性,来设置发包时间间隔。SO_KEEPALIVE 是操作系统的底层机制,用于维护每一个 TCP 连接。但SO_KEEPALIVE 并不能用于替代心跳机制,因为其仅能确保 ser-socket 一方的连接状态。

使用非阻塞模式下的 select 函数进行 Socket 连接检查

以异步(非阻塞)模式建立连接 s.setblocking(0),如果 select 函数返回的值为 1 (表示 Socket 可读),但使用 recv 函数读取到的数据长度为 0,并且 errno != EINTR and errno != EAGAIN,则说明该 Socket 已经断开

NOTE:需要注意的是,在非阻塞模式下,即便 recv 函数的返回值小于等于 0,依旧不足以证明问题。此时还需要继续判断 errno ?= EINTR,如果 Yes,则说明此次 recv 是由于程序接收到 EINTR 中断信号后返回的,Socket 连接仍然正常。除此之外,如果 write 写的太快,很有可能会把 Buffer 写满,这时的 errno == EAGAIN。根据实际需要,如果 errno == EAGAIN 的话,建议重试几次。当然,Read 也有类似的情况。

会话过期问题

如果服务端程序应用了 Session 机制,那么在实现客户端程序时除了需要考虑 Socket 连接的问题之外,还需要考虑 Session 是否过期的问题。

发送接收 前首先检查连接是否有效,然后检查会话是否过期:

  • 连接失效:则重新建立连接,并且重新创建 session
  • 连接有效,但会话过期:则重新创建 session
  • 连接有效,会话有效:PASS

同步还是异步问题

选择同步还是异步模式是非常重要的,使用了错误的连接模式将无法达到预期效果。例如高并发需求没能达到,例如程序的稳定性没能提高等等,如何进行选择需要结合实际的应用场景:

  • 在高并发且不关注执行结果的场景中使用异步模式。
  • 在对程序执行的稳定性,对执行结果响应的准确性都有很高要求的场景下使用同步模式,并且需要保证一次 send 和 recv 的原子性。

NOTE:对于后者,应该尽可以能仅保证 send 和 recv 原子操作是同步的,以此来优化效率。

数据缓存问题

Socket 的 recv 具有缓存功能,如果其中一方发送的数据量超过了另一方 recv 所允许一次接受的最大数据量,数据会被截短,并将剩余的数据缓冲在接收端。再次调用 recv 时,剩余的数据会从缓冲区取出并删除。这一特性与 HTTP 连接方式有很大区别,表示 Socket 连接无法像 HTTP 连接那般,一次 Request 对应的一次 Response 就能完成一次操作单元,而是很可能需要任意次的 send 以及任意次的 recv 才能完成。换句话说就是,需要开发者来保证 send 和 recv 的完整性,你需要手动的整理、组合出完整的发送和响应结果数据。经常的,为了得到一个完整的响应结果可能需要进行多次 recv。

完全断开连接问题

调用 Socket 的 close 函数并不会马上断开 Socket 连接,一般的我们会在 close 之前调用 shutdown 函数来确保连接会被正常关闭。而且 shutdown 提供了多种不同的关闭方式:

  • SHUT_RD:关闭读,不能使用 read/recv
  • SHUT_WR:关闭写,不能使用 send/write
  • SHUT_RDWR:关闭读写,不能使用 send/write/recv/read

NOTE:在客户端程序中,一般我们会选择使用 SHUT_WR 方式,立即停止写操作,但可以继续将响应数据读完。而在服务端程序中一般会选择 SHUT_RD 模式,立即停止对客户端请求的读取,但会继续完成响应。当然了,在某些对精度要求不要的场景中,SHUT_RDWR 是不错的选择。

相关文章
|
12天前
|
安全 网络安全 API
构筑安全堡垒:云计算环境中的网络安全策略与实践
【4月更文挑战第23天】 随着企业逐渐将关键业务迁移至云平台,云计算服务的安全性成为不容忽视的重要议题。本文深入探讨了在动态且复杂的云环境中,如何通过一系列创新和实用的策略来强化网络安全防护。我们分析了云计算服务模型(如IaaS、PaaS、SaaS)所面临的独特安全挑战,并提出了相应的防御机制,包括数据加密、身份验证、访问控制、威胁检测与响应等。文章还讨论了信息安全管理的最佳实践,以及如何在保障数据隐私和合规性的同时提高系统的整体安全性。
|
5天前
|
人工智能 安全 网络安全
云计算环境下的网络安全策略与实践
【4月更文挑战第30天】本文聚焦于当前快速发展的云计算环境中的网络安全问题。首先,分析了云服务模式对传统网络架构的冲击和安全挑战;然后,探讨了在多租户、资源共享的前提下,如何保障数据隔离、访问控制及传输安全等关键安全要素;进一步地,提出了一系列创新的安全机制,包括基于行为分析的入侵检测系统、加密技术的最新应用,以及利用人工智能进行安全事件预测和管理的策略。最后,结合案例分析,评估了这些策略在现实业务中的有效性,并展望了未来云计算与网络安全融合发展的趋势。
|
6天前
|
安全 网络安全 量子技术
网络安全与信息安全:保护数字世界的锁与钥构建安全防线:云计算环境中的网络安全策略与实践
【4月更文挑战第29天】在数字化时代,数据成为了新的石油,而网络安全则是保护这些宝贵资源的防线。本文深入探讨了网络安全漏洞的成因、加密技术的进展以及提升安全意识的重要性。通过对网络威胁的分析,我们揭示了安全漏洞的本质和它们如何被黑客利用。接着,文章详细解读了现代加密技术,包括对称加密、非对称加密和散列函数,并强调了量子计算对未来加密的潜在影响。最后,通过教育和技术实践的建议,我们强调了培养全民网络安全意识的必要性。 【4月更文挑战第29天】 在数字化转型的浪潮中,云计算作为支撑企业敏捷性与效率的关键基础设施,其安全性受到了前所未有的关注。本文深入探讨了云计算环境下所面临的独特安全挑战,并提出
|
4天前
|
安全 网络安全
网络安全攻防实战演练:技术探索与实践
【5月更文挑战第1天】网络安全攻防实战演练,通过模拟攻击与防御,提升组织应对网络安全威胁的能力。演练包括准备、攻击、防御和总结四个阶段,涉及环境搭建、攻击技术应用、防御措施执行及后期评估。此类演练有助于检验安全防护能力,提升应急响应速度,暴露系统隐患,加强团队协作,是保障网络安全的关键实践。
|
5天前
|
机器学习/深度学习 监控 安全
云端防御战线:云计算环境下的网络安全策略与实践
【4月更文挑战第30天】 随着企业纷纷将数据和服务迁移至云平台,云计算环境的安全性成为不容忽视的问题。本文针对当前云计算环境中存在的安全风险进行了深入剖析,并提出了一系列切实可行的安全策略与措施。文章首先概述了云计算服务模型及其固有的安全挑战,接着详细讨论了网络安全防护的最佳实践,包括身份验证、数据加密、入侵检测和安全事件管理等关键技术的应用。此外,文中还强调了制定综合安全政策、进行持续监控和评估的重要性。通过这些综合性策略的实施,旨在为云计算环境下的信息安全管理提供一套全面的解决框架。
|
5天前
|
云安全 人工智能 安全
构筑安全之盾:云计算环境下的网络安全策略与实践
【4月更文挑战第30天】 随着企业数字化转型的深入,云计算已成为支撑现代业务架构的关键基石。然而,伴随云服务带来的便利性、灵活性和成本效益,也产生了前所未有的安全挑战。本文针对当前云计算环境中的网络安全问题展开深入探讨,分析了云服务模型(IaaS, PaaS, SaaS)在安全防御上的不同要求,并提出了相应的安全策略和技术措施。文章不仅审视了传统的安全机制在云环境下的适用性,还探讨了新兴技术如区块链、人工智能在增强云安全方面的潜力。通过案例分析,本文旨在为读者提供一套综合性的云安全解决方案框架,以助力企业在享受云计算带来的优势的同时,有效防范和应对网络安全威胁。
|
5天前
|
云安全 安全 网络安全
云端守卫:云计算环境中的网络安全策略与实践
【4月更文挑战第30天】在数字化浪潮中,云计算以其弹性、可伸缩性和成本效率成为企业IT架构的核心。然而,随着数据和应用不断向云端迁移,网络安全威胁也随之增加。本文深入探讨了云计算环境下的网络安全挑战,并提出了综合性的安全策略和最佳实践。通过分析云服务模型的特点,我们讨论了公有云、私有云和混合云中存在的安全风险,并提出了相应的解决方案。同时,文章也强调了信息安全管理的重要性,包括数据加密、访问控制和持续监控。最后,我们概述了未来云计算安全发展的趋势,旨在为读者提供一套全面的云安全指南。
|
6天前
|
机器学习/深度学习 数据采集 监控
构建高效机器学习模型的策略与实践云端防御:融合云计算与网络安全的未来策略
【4月更文挑战第29天】 在数据驱动的时代,构建一个高效的机器学习模型对于解决复杂问题至关重要。本文将探讨一系列策略和最佳实践,旨在提高机器学习模型的性能和泛化能力。我们将从数据处理的重要性入手,进而讨论模型选择、训练技巧、超参数调优以及模型评估方法。通过这些策略的实施,读者将能够构建出更加健壮、准确的模型,并有效地避免过拟合和欠拟合问题。
|
6天前
|
监控 安全 网络安全
构筑安全防线:云计算环境下的网络安全策略与实践
【4月更文挑战第29天】 随着企业数字化转型的深入,云计算已成为推动业务敏捷性、降低成本和创新的关键驱动力。然而,云服务的广泛采用也带来了前所未有的网络安全挑战。本文将探讨在复杂多变的云计算环境中,如何构建有效的网络安全框架,以保护数据和服务不受威胁。我们将重点讨论云服务的安全模型、关键安全控制措施以及信息安全管理的最佳实践,旨在为组织提供战略性的指导,以应对持续演进的网络威胁。
|
6天前
|
SQL 安全 网络安全
网络安全与信息安全:防护之道与实践策略
【4月更文挑战第29天】在数字化时代,网络安全与信息安全已成为维护个人隐私、企业数据和国家利益不可或缺的一环。本文深入探讨了网络安全漏洞的概念、加密技术的进展以及提升安全意识的重要性,并提出了相应的防护措施和策略。通过分析当前的网络威胁和挑战,本文旨在为读者提供一套全面的安全防护知识体系,以及如何在实践中有效应对各种安全风险的指导。