我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python网络-Socket之TCP编

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python网络-Socket之TCP编

一、TCP简介

1、TCP介绍

TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP通信需要经过创建连接、数据传送、终止连接三个步骤。

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"。

2、TCP面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

双方间的数据传输都可以通过这一个连接进行。

完成数据交换后,双方必须断开此连接,以释放系统资源。

这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

3、TCP可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

4) 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

4、TCP与UDP的不同点

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

 

二、TCP数据包格式

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个数据包

那么我们就先来看一下TCP数据包的格式:

 

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.
  • URG—为1表示高优先级数据包,紧急指针字段有效。
  • ACK—为1表示确认号字段有效
  • PSH—为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
  • RST—为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
  • SYN—为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
  • FIN—为1表示发送方没有数据要传输了,要求释放连接,
  • Seq---序号,这是为了连接以后传送数据用的,
  • Ack---确认号对收到的数据包的确认,值是等待接收的数据包的序列号+1。

 

三、TCP的三次握手

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

三次握手示意图

第一次握手:(Client向Server发送联机请求)

SYN=1(Client向Server发送联机请求)

Client想要与Server进行TCP通信,首先他需要向Server发送一个SYN=1的同步序列编号(syncsynchronized squsequence number)用来表示建立连接,并且随机产生一个数Seq number = X的数据包到Server,Server由于SYN=1知道,Client要求建立联机,到这里第一次握手就结束了

第二次握手:(Server向Client回复联机并确认联机信息)

SYN=1(Server接受Client的联机请求)

ACK=1(确认信息)

这是对第一次握手信息的确认,表示Server收到了Client的第一次握手信息

Ack=X+1(确认回复)

同时Server回复Client一个确认码Ack表示你的联机请求我已经收到,而且数据没有丢失,怎么验证数据没有丢失呢?即Ack的值等于Client发过来Seq的值加1,即Ack = X+1。因为我都知道你发过来的Seq的值,所以这个数据包没有丢失。

Seq = Y(第二次握手的数据包序列号)

Server给Client的数据包序列号,为了数据包在到达Client之后的验证,所以这次从Server到Client的数据包中同样也会随机产生一个Seq number = Y,

第三次握手

ACK=1(对第二次握手的确认)

首先Client会打开Server发送过来的Ack验证一下是否正确为Seq+1,即第一次发送的seq number+1,确认无误后,Client仍然需要给Server再次回复确认即ACK=1

Seq=Z(第三次握手的数据包序列号)

Ack=Y+1

Client告诉Server,你给我回复的信息我也收到了,怎么确定我收到了你的信息呢?就是通过Ack等于第二次握手传递过来的Seq值+1。到此为止三次握手结束进入ESTABLISHED状态,开始进行数据传输。

 

四、TCP四次挥手

 

第一次挥手发送FIN请求,第一次挥手结束。

第二次挥手开始,被动方向主动方发送ACK确认码,到这里第二次挥手结束。

第三次握手开始被动方向主动方发送FIN号结束。

第四次挥手开始主动方向被动方发送ACK确认,等待2MSL后断开TCP连接。

 

五、TCP的十种状态

这十种状态分别是三次握手和四次挥手中的状态,在上面两个图中都给大家标记出来了,这里再给大家一个简单的图表示

 

六、TCP的2MSL问题

在四次挥手中我们提到了时间等待状态,等待的时间是2MSL。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,

当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次挥手完成后发送了第四次挥手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,那么对方在超时后将重发第三次挥手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

 

七、TCP长连接和短连接

TCP在真正的读写操作之前,server与client之间必须建立一个连接,

当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,

连接的建立通过三次握手,释放则需要四次握手,

所以说每个连接的建立都是需要资源消耗和时间消耗的。

1. TCP短连接

模拟一种TCP短连接的情况:

  1. client 向 server 发起连接请求
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,此时双方任何一个都可以发起 close 操作

在第 步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

2. TCP长连接

再模拟一种长连接的情况:

  1. client 向 server 发起连接
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,连接不关闭
  6. 后续读写操作...
  7. 长时间操作之后client发起关闭请求

3. TCP长/短连接操作过程

(1)短连接的操作步骤是:建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

(2) 长连接的操作步骤是:建立连接——数据传输...(保持连接)...数据传输——关闭连接

4. TCP长/短连接的优点和缺点

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。

  • client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

  • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

5. TCP长/短连接的应用场景

  • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,再次处理时直接发送数据包就OK了,不用建立TCP连接。

    例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

  • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

 

八、TCP的通信模型

tcp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"

生活中的电话机,如果想让别人能更够打通咱们的电话获取相应服务的话,需要做一下几件事情:

  1. 买个手机
  2. 插上手机卡
  3. 设计手机为正常接听状态(即能够响铃)
  4. 静静的等着别人拨打

tcp服务器如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:

  1. 创建一个socket套接字
  2. bind绑定ip和port
  3. listen使套接字变为可以被动链接
  4. accept等待客户端的链接
  5. recv/send接收发送数据

 

九、TCP服务器代码实现

#coding = utf-8
from socket import *
#1、创建socket套接字
tcpServerSocket = socket(AF_INET,SOCK_STREAM)
#2、绑定本地信息
address = ("",7788)
tcpServerSocket.bind(address)
#3、使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动,这样就可以等着别人链接了
tcpServerSocket.listen(5)

"""
如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器
newSocket用来为这个客户端服务
tcpServerSocket就可以省下来专门等待其他的客户端的链接
"""
newSocket,clientAddress = tcpServerSocket.accept()

#4、接收对象发送过来的数据,最大接收1024个字节
reveiveData = newSocket.recv(1024)
print("接收的数据为:%s"%reveiveData.decode())

#5、发送数据到客户端
newSocket.send("haha".encode())

#6、关闭为这个客户端服务的套接字
newSocket.close()

#7、关闭监听套接字
tcpServerSocket.close()

运行流程

1、TCP服务器

2、网络调试助手:

 

十、TCP客户端代码实现

所谓的服务器端:就是提供服务的一方,而客户端,就是需要被服务的一方

tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机、查手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多

#coding = utf-8
from socket import *

#1、创建socket
tcpClientSocket = socket(AF_INET,SOCK_STREAM)

#2、链接服务器
serverAddress = ("192.168.100.106",7788)
tcpClientSocket.connect(serverAddress)

#3、向服务器发送数据
tcpClientSocket.send("哈哈".encode("gb2312"))

#4、接收对方发送过来的数据,最大接收1024个字节
receiveData = tcpClientSocket.recv(1024)
print("接收到的数据为%s"%receiveData.decode("gb2312"))

#5、关闭套接字
tcpClientSocket.close()

运行流程:

1、tcp客户端

2、网络调试助手:

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python网络-Socket之TCP编

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python网络-Socket之TCP编

一、TCP简介1、TCP介绍TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通信需要经过创建连接、数据传送、终止连接三个
2023-01-31

python之Socket网络编程详解

什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系。在数学上,网络是一种图,一般认为专指加权图。网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型。在计算机领域中,网络是信息传输、接收、共享
2022-06-04

Python—网络编程Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据
2023-01-31

python3网络编程之socket

http://www.cnblogs.com/Bigtre/p/7261387.html
2023-01-31

python网络编程--socket

1.服务端1.1声明socket对象server=socket.socket(AF.INET,socket.SOCK_STREAM)1.2绑定ip、端口server.bind(localhost,6969)1.3开始监听server.lis
2023-01-31

python网络编程-socket编程

一、服务端和客户端BS架构 (腾讯通软件:server+client)CS架构 (web网站) C/S架构与socket的关系:我们学习socket就是为了完成C/S架构的开发 二、OSI七层模型互联网协议按照功能不同分为osi七层或tcp
2023-01-31

python socket 网络编程s

Server端:import socketimport selectorsclass Server(object):def init(self,sel,sock):self.sel = selself.sock = sockdef run(
2023-01-31

Python socket网络编程TCP/IP服务器与客户端通信

Python socket网络编程 初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好
2022-06-04

网络编程之socket的运用

一,socket用法socket是什么 ?Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简
2023-01-30

python资源库——socket网络编

sockket简介socekt又称为‘套接字’,用于描述IP和地址端口,是一个通信链路的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求。socket起源于Unix,所以也遵从“一切皆文件”的基本哲学,对于文件,进行打开/读取/关
2023-01-30

详解Python Socket网络编程

Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络
2022-06-04

[python网络编程]socket的简

1 socket基本参数了解1.在建立socket对象的时候,需要告诉系统两件事情1.1 通信的类型是什么(IPv4/IPv6等)1.2 使用的协议是什么?(TCP/UDP等)2.各个通信类型和协议的标识2.1 IPv4:AF_INET2.
2023-01-31

python网络编程--socket简单

python网络编程                                                                                                              
2023-01-31

Python网络编程之Python编写TCP协议程序的步骤

这篇文章主要介绍了Python网络编程编写TCP协议程序的开发步骤,通过实例代码介绍了TCP客户端程序开发,案例讲解多任务版TCP服务端程序开发,需要的朋友可以参考下
2022-11-13

网络编程—tcp

一、TCP简介          二、tcp网络程序-客户端          三、tcp网络程序-服务器          四、案例:文件下载器          五、tcp三次握手、四次挥手          六、tcp长连接和短连接 
2023-01-31

Python基础:网络编程socket基

socket也叫套接字,是对各种协议的封装,实现收发数据。Python里socket工作过程:(图片来自网络)socket在Python中实际上是一个模块,实现发送和接收数据的功能。因为socket是一个类,所以只导入模块需要使用socke
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录