TCP介绍

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

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

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

TCP特点

1. 面向连接

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

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

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

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

2. 可靠传输

1)TCP采用发送应答机制

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

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

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

3)错误校验

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

4) 流量控制和阻塞管理

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

TCP与UDP的不同点

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

tcp客户端构建流程

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

示例代码:

from socket import *# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))# 链接服务器
tcp_client_socket.connect((server_ip, server_port))# 提示用户输入数据
send_data = input("请输入要发送的数据:")tcp_client_socket.send(send_data.encode("gbk"))# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))# 关闭套接字
tcp_client_socket.close()

tcp服务器

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

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

一个很简单的tcp服务器如下:

from socket import *# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)# 本地信息
address = ('', 7788)# 绑定
tcp_server_socket.bind(address)# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()

tcp注意点

  1. tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
  2. tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
  3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
  4. 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
  5. 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
  6. listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
  7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕
  9. 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

tcp的3次握手

tcp的4次挥手

TCP长/短连接操作过程

短连接的操作步骤是:

建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

长连接的操作步骤是:

建立连接——数据传输...(保持连接)...数据传输——关闭连接

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

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。

    对于频繁请求资源的客户来说,较适用长连接。

  • client与server之间的连接如果一直不关闭的话,会存在一个问题,

    随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,

    如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;

    如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,

    这样可以完全避免某个蛋疼的客户端连累后端服务。

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

TCP长/短连接的应用场景

  • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

    每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,

    再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,

    再次处理时直接发送数据包就OK了,不用建立TCP连接。

    例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,

    而且频繁的socket 创建也是对资源的浪费。

  • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,

    而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,

    如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,

    那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

27.python-网路-tcp相关推荐

  1. python的TCP编程

    基本的逻辑步骤 确定通信的客户端和服务端 建立通信连接 进行通信 通信断开 Python中TCP通信 网卡 使得用户通过电缆或无线相互连接,在网卡上都有一个独一无二的mac地址.这是IEEE负责为网络 ...

  2. 从入门到入土:基于Python采用TCP协议实现通信功能的程序

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. 需要额外端口信息_使用Python进行TCP端口扫描

    使用Python进行TCP端口扫描 首先我们供给一台主机,要进行的步骤就是对其主机端口的扫描,查看其中开放的端口. 我们创建一个TCP的全连接的扫描器,使用socket来创建连接器. 扫描端口开放 # ...

  4. 解决Python中TCP数据转为json后中文变为Ascii码的问题

    我们我们有时候会使用TCP直接传输JSON数据,这时候正确解析数据就很关键了,最近在使用Python解析TCP传输的JSON数据时就遇到了中文不能正常显示的问题. 原因分析 TCP接口数据转为json ...

  5. PYTHON通过TCP/IP通讯方式远程控制Epson机械臂

    PYTHON通过TCP/IP通讯方式远程控制Epson机械臂 一,控制器程序(server) 程序示例 通讯函数: #定义TCP连接 Function connectSetNet #201, &quo ...

  6. 2020.4.27 python编程基础

    2020.4.27 python数据分析流程 Python3.0语言基础 数据类型:基础类型-Number数字 String字符串 数据结构-List列表 Tuple元组 Set集合 Dictiona ...

  7. Python之TCP Socket网络编程

    0 背景 Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网 ...

  8. python 使用tcp协议实现web服务器(七) epoll版本web服务器

    文章目录 摘要 前置知识 运行截图 html,css文件代码 index.html login.html register.html style.css python代码 摘要 使用python 基于 ...

  9. python 实现TCP socket通信和 HTTP服务器、服务器和客户端通信python实例

    python 实现TCP socket通信和 HTTP服务器.服务器和客户端通信实例 socket是什么? 服务器和客户端通信的流程 python 实现TCP socket通信例子 关于Host和PO ...

  10. python网络安全协议_如果你不遵守Python中TCP和UDP等网络编程协议!那么你会自食其果...

    最近在学习python编程,自己稍微整理了一下这两天的学习心得 windows查看进程端口 5) 应用层 经过链路层,网络层,传输层,最后就是通过前面是三个来确认到最后需要传输到的应用中去 传输示意图 ...

最新文章

  1. MIT 更新最大自然灾害图像数据集,囊括 19 种灾害事件
  2. 【数据结构作业—01】用单循环链表解决约瑟夫问题
  3. 四位数码管秒表 c语言编程,4位共阴极数码管秒表设计仿真与程序
  4. 电脑java语言有什么用_Java语言是什么?_Java语言有什么优点
  5. 低代码Web应用程序构造方法-ASP.NET Core 2.2单页应用程序(SPA)
  6. C语言里的几个拷贝函数memcpy、memset、strcpy、strncpy
  7. 精品软件 推荐 瑞星个人防火墙V16 新UI、新功能、新体验
  8. HIve之DML 聚合分组应用函数 静动态分区表
  9. 两表查询很慢mysql_影响mysql性能的方面
  10. 标准IO库--unix环境高级编程读书笔记
  11. 56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍
  12. AWK中BEGIN和END的使用理解
  13. 白帽子黑客:手把手教你如何在Kali使用ibus拼音输入法?
  14. 五款最优秀的java微服务框架
  15. 低功耗蓝牙学习笔记-属性协议
  16. 文本编辑工具 | Editplus_v5.5 +汉化包,用于java、C/C++的语言工具
  17. NETWORK笔记7:思科命令实验
  18. ESP32下载固件教程
  19. undeclared (first use in this function)
  20. OpenGL入门示例3——黑色背景绘制绿色圆形

热门文章

  1. 修改Xmind的试用时间,近乎无限时长试用
  2. Linux Kernel 2.6.9源码分析 -- send/recieve 报文
  3. 百度地图API获取当前位置
  4. FigDraw 12. SCI 文章绘图之相关性矩阵图(Correlation Matrix)
  5. HP Proliant GEN8无法启动磁盘问题
  6. 贴片采样电阻的那点事
  7. linux获取夏令时时间,关于时区:获取C中时区的夏令时转换日期
  8. 《足球智商》读书笔记
  9. npi阶段是什么意思_NPI全过程各阶段定义-特性-要点
  10. HEX转BIN 小技巧分享