当前位置:首页 > 数码 > 探索TCP协议的奥秘和实践示例-从零开始掌握Python网络编程 (tcp协议讲解)

探索TCP协议的奥秘和实践示例-从零开始掌握Python网络编程 (tcp协议讲解)

admin8个月前 (05-03)数码22

TCP(传输控制协议)是一种面向连接的协议,用于在互联网上可靠地传输数据。它在计算机网络中广泛使用,包括网站浏览、文件传输和电子邮件。

可靠性机制

TCP 协议旨在确保数据在网络上可靠地传输。它包含了各种机制来检测丢失的数据包并请求重新发送,还可以处理数据包乱序到达和数据包丢失的问题。

序列号和确认号

TCP 使用序列号和确认号来跟踪数据包的顺序并确保所有数据包都已收到。每个数据包都分配了一个唯一的序列号,而接收方发送确认号来确认已收到数据包。如果接收方没有收到数据包,它将重新发送确认号,请求发件方重新发送数据包。

滑动窗口

滑动窗口机制允许发件方在收到确认前发送多个数据包。这提高了吞吐量,因为发件方不必等待每个数据包的确认再发送下一个数据包。滑动窗口的尺寸由网络条件决定,例如延迟和带宽。

重传机制

TCP 使用超时和重复确认来检测丢失的数据包。如果发件方在一段时间内没有收到确认号,它将重传数据包。如果接收方收到多个重复的确认号,它将推断数据包丢失,并请求发件方重新发送数据包。

流量控制

TCP 还包含流量控制机制,以防止发件方压倒接收方。接收方可以发送窗口大小信息,指示其一次可以接收多少数据。发件方将根据窗口大小调整其发送速率。

处理数据包乱序

网络延迟和拥塞会导致数据包乱序到达。TCP 使用排序缓冲区来存储乱序到达的数据包。当所有数据包都收到后,TCP 将它们按照序列号重新组装成正确的顺序。 探索TCP协议的奥秘和实践示例

处理数据包丢失

数据包丢失可能是由于各种原因造成的,例如网络拥塞或线路故障。TCP 使用重传机制来处理数据包丢失。收件人通过发送重复确认号来请求发件人重新发送丢失的数据包。发件人将继续重传数据包,直到收到确认或达到重传次数上限。

TCP 的优点

TCP 协议因其可靠性、顺序性、流量控制和错误检测而受到广泛认可。这些优点使 TCP 成为以下应用的理想选择: 网站浏览 文件传输 电子邮件 在线游戏

结论

TCP 协议是互联网通信的基础,它确保数据在网络上可靠地传输。其可靠性机制、顺序性、流量控制和错误检测功能使 TCP 成为企业关键型应用程序和日常互联网使用的理想选择。通过了解 TCP 协议的工作方式,网络管理员和用户可以优化其网络性能并确保可靠的数据传输。

首先放出一个 TCP/IP 的程序,这里是单线程服务器与客户端,在多线程一节会放上多线程的TCP/IP服务程序。 这里将服务端和客户端放到同一个程序当中,方便对比服务端与客户端的不同。 TCP/IP是因特网的通信协议,其参考OSI模型,也采用了分层的方式,对每一层制定了相应的标准。 网际协议(IP)是为全世界通过互联网连接的计算机赋予统一地址系统的机制,它使得数据包能够从互联网的一端发送至另一端,如 130.207.244.244,为了便于记忆,常用主机名代替IP地址,例如 。 UDP (User Datagram Protocol,用户数据报协议) 解决了上述第一个问题,通过端口号来实现了多路复用(用不同的端口区分不同的应用程序)但是使用UDP协议的网络程序需要自己处理丢包、重包和包的乱序问题。 TCP (Transmission Control Protocol,传输控制协议) 解决了上述两个问题,同样使用端口号实现了复用。 TCP 实现可靠连接的方法: socket通信模型及 TCP 通信过程如下两张图。 [图片上传失败...(image-6d947d-30)] [图片上传失败...(image-30b472-30)] (host, port, family, socktype, proto, flags) 返回: [(family, socktype, proto, cannonname, sockaddr), ]由元组组成的列表。 family:表示socket使用的协议簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。 socktype: socket 的类型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3 proto: 协议, 套接字所用的协议,如果不指定, 则为 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17 flags:标记,限制返回内容。 AI_ADDRCONFIG 把计算机无法连接的所有地址都过滤掉(如果一个机构既有IPv4,又有IPv6,而主机只有IPv4,则会把 IPv6过滤掉) AI _V4MAPPED, 如果本机只有IPv6,服务却只有IPv4,这个标记会将 IPv4地址重新编码为可实际使用的IPv6地址。 AI_CANONNAME,返回规范主机名:cannonname。 getaddrinfo(None, smtp, 0, _STREAM, 0, _PASSIVE) getaddrinfo(,ftp, 0, _STREAM, 0, _ADDRCONFIG | _V4MAPPED) 利用已经通信的套接字名提供给getaddrinfo mysock = server_() addr, port = () getaddrinfo(addr, port, , , , _CANONNAME) TCP 数据发送模式: 由于 TCP 是发送流式数据,并且会自动分割发送的数据包,而且在 recv 的时候会阻塞进程,直到接收到数据为止,因此会出现死锁现象,及通信双方都在等待接收数据导致无法响应,或者都在发送数据导致缓存区溢出。 所以就有了封帧(framing)的问题,即如何分割消息,使得接收方能够识别消息的开始与结束。 关于封帧,需要考虑的问题是, 接收方何时最终停止调用recv才是安全的?整个消息或数据何时才能完整无缺的传达?何时才能将接收到的消息作为一个整体来解析或处理。 适用UDP的场景: 由于TCP每次连接与断开都需要有三次握手,若有大量连接,则会产生大量的开销,在客户端与服务器之间不存在长时间连接的情况下,适用UDP更为合适,尤其是客户端太多的时候。 第二种情况: 当丢包现象发生时,如果应用程序有比简单地重传数据聪明得多的方法的话,那么就不适用TCP了。 例如,如果正在进行音频通话,如果有1s的数据由于丢包而丢失了,那么只是简单地不断重新发送这1s的数据直至其成功传达是无济于事的。 反之,客户端应该从传达的数据包中任意选择一些组合成一段音频(为了解决这一问题,一个智能的音频协议会用前一段音频的高度压缩版本作为数据包的开始部分,同样将其后继音频压缩,作为数据包的结束部分),然后继续进行后续操作,就好像没有发生丢包一样。 如果使用TCP,那么这是不可能的,因为TCP会固执地重传丢失的信息,即使这些信息早已过时无用也不例外。 UDP数据报通常是互联网实时多媒体流的基础。 参考资料:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Python

“探索TCP协议的奥秘和实践示例-从零开始掌握Python网络编程 (tcp协议讲解)” 的相关文章

Python中的LEGB规则 (python怎样打开)

Python中的LEGB规则 (python怎样打开)

Python 中的 LEGB 规则决定了变量和函数的作用域解析顺序。它代表了四个作用域层级: 局部作用域 闭包函数外的函数 全局作用域 内置作用域...

b-b-个入门建议!-Python-技术书籍推荐-附赠-11 (b+b+b等于什么)

b-b-个入门建议!-Python-技术书籍推荐-附赠-11 (b+b+b等于什么)

近年来,Python 持续火爆,越来越多的人开始入门学习 Python。RealPython 作为最受好评的 Python 学习网站,拥有超百万的浏览量,以下是 RealPython 的开发者给...

惰性求值和lambda表达式的强大组合-Python高级技巧 (惰性求值和逻辑短路)

惰性求值和lambda表达式的强大组合-Python高级技巧 (惰性求值和逻辑短路)

Lambda 表达式 在 Python 中,Lambda 表达式是一个匿名函数,它可以在需要函数对象的地方使用。Lambda 表达式的语法如下: lambda arguments: exp...

轻松把握多线程和多进程-Python编程进阶 (多线是什么意思)

轻松把握多线程和多进程-Python编程进阶 (多线是什么意思)

1、简介 咱们将讨论如何应用/target=_blankclass=infotextkey>Python口头多线程和多进程义务。它们提供了在单个进程或多个进程之间口头并发操作的方法。并...

生成-UUID-操作-Python-齐全指南-格局和经常出现疑问 (生成uuid java)

生成-UUID-操作-Python-齐全指南-格局和经常出现疑问 (生成uuid java)

UUID(UniversallyUniqueIdentifier,通用惟一标识符)是一种全局惟一标识符生成形式,用于创立举世无双的标识符。/target=_blankclass=infotextk...

使用Python进行数据分析的步骤 (使用pycharm)

使用Python进行数据分析的步骤 (使用pycharm)

简介 Python 是一种动态的、面向对象的脚本语言,以其简单性和易读性而闻名。它广泛用于数据分析,因为它具有强大的库,兼容开源大数据平台 Hadoop,并且拥有众多优势,使其成为流行的编...

网络-摸索Python中的必备模块-解锁数据处置-迷信计算等畛域的弱小工具-自动化 (网络mod)

网络-摸索Python中的必备模块-解锁数据处置-迷信计算等畛域的弱小工具-自动化 (网络mod)

/target=_blankclass=infotextkey>Python罕用的模块十分多,关键分为内置模块和第三方模块两大类,且不同模块运行场景不同又可以分为文本类、数据结构类、数学运算...

Python-每个程序员都应该知道的-个-魔术方法-11 (python怎样打开)

Python-每个程序员都应该知道的-个-魔术方法-11 (python怎样打开)

译者|布加迪 审校|重楼 在/target=_blankclass=infotextkey>Python中,魔术方法(MagicMethod)可以协助您模拟Python类中内置函...